home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 2001 June / VPR0106A.BIN / OLS / PREX102 / PrEx102.lzh / Src.lzh / ProjExp.cpp < prev    next >
C/C++ Source or Header  |  2001-02-23  |  5KB  |  171 lines

  1. // ProjExp.cpp : DLL 用の初期化処理ルーチンを定義します。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <initguid.h>
  6. #include "ProjExp.h"
  7. #include "DSAddIn.h"
  8. #include "Commands.h"
  9.  
  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15.  
  16. CComModule _Module;
  17.  
  18. BEGIN_OBJECT_MAP(ObjectMap)
  19.     OBJECT_ENTRY(CLSID_DSAddIn, CDSAddIn)
  20. END_OBJECT_MAP()
  21.  
  22. /////////////////////////////////////////////////////////////////////////////
  23. // CProjExpApp
  24.  
  25. class CProjExpApp : public CWinApp
  26. {
  27. public:
  28.     CProjExpApp();
  29.  
  30. // オーバーライド
  31.     // ClassWizard は仮想関数のオーバーライドを生成します
  32.     //{{AFX_VIRTUAL(CProjExpApp)
  33.     public:
  34.     virtual BOOL InitInstance();
  35.     virtual int ExitInstance();
  36.     //}}AFX_VIRTUAL
  37.  
  38.     //{{AFX_MSG(CProjExpApp)
  39.         // メモ - ClassWizard はこの位置にメンバ関数を追加または削除します。
  40.         //    この位置に生成されるコードを編集しないでください !
  41.     //}}AFX_MSG
  42.     DECLARE_MESSAGE_MAP()
  43. };
  44.  
  45.  
  46. /////////////////////////////////////////////////////////////////////////////
  47. // CProjExpApp
  48.  
  49. BEGIN_MESSAGE_MAP(CProjExpApp, CWinApp)
  50.     //{{AFX_MSG_MAP(CProjExpApp)
  51.         // メモ - ClassWizard はこの位置にマッピング用のマクロを追加または削除します。
  52.         //    この位置に生成されるコードを編集しないでください !
  53.     //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55.  
  56. /////////////////////////////////////////////////////////////////////////////
  57. // 唯一の CProjExpApp オブジェクト
  58.  
  59. CProjExpApp theApp;
  60.  
  61. /////////////////////////////////////////////////////////////////////////////
  62. // CProjExpApp の構築
  63.  
  64. CProjExpApp::CProjExpApp()
  65. {
  66.     // TODO: この位置に構築用のコードを追加してください。
  67.     // ここに InitInstance 中の重要な初期化処理をすべて記述してください。
  68. }
  69.  
  70. /////////////////////////////////////////////////////////////////////////////
  71. // CProjExpApp の初期化
  72.  
  73. BOOL CProjExpApp::InitInstance()
  74. {
  75.     _Module.Init(ObjectMap, m_hInstance);
  76.     return CWinApp::InitInstance();
  77. }
  78.  
  79. int CProjExpApp::ExitInstance()
  80. {
  81.     _Module.Term();
  82.     return CWinApp::ExitInstance();
  83. }
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // inproc サーバーで要求される特別なエントリ ポイント
  87.  
  88. STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
  89. {
  90.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  91.     return _Module.GetClassObject(rclsid, riid, ppv);
  92. }
  93.  
  94. STDAPI DllCanUnloadNow(void)
  95. {
  96.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  97.     return (AfxDllCanUnloadNow()==S_OK && _Module.GetLockCount()==0) ? S_OK : S_FALSE;
  98. }
  99.  
  100. // DllRegisterServer のエクスポートで、regsvr32.exe を使用できます
  101. STDAPI DllRegisterServer(void)
  102. {
  103.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  104.     HRESULT hRes = S_OK;
  105.     
  106.     // オブジェクト、タイプライブラリおよびタイプライブラリ内のすべてのインターフェイスの登録
  107.     hRes = _Module.RegisterServer(TRUE);
  108.     if (FAILED(hRes))
  109.         return hRes;
  110.  
  111.     // このアドイン オブジェクトの説明を "/Description" サブ キー内に
  112.     // 登録します。 
  113.     // TODO: このモジュールに対して複数のアドインを追加する場合は、す
  114.     // べての説明を、各アドイン オブジェクトのレジストリ CLSID エント
  115.     // リ内で各説明を登録する必要があります:
  116.     // HKEY_CLASSES_ROOT\Clsid\{add-in CLSID}\Description="アドインの説明"
  117.     _ATL_OBJMAP_ENTRY* pEntry = _Module.m_pObjMap;
  118.     CRegKey key;
  119.     LONG lRes = key.Open(HKEY_CLASSES_ROOT, _T("CLSID"));
  120.     if (lRes == ERROR_SUCCESS)
  121.     {
  122.         USES_CONVERSION;
  123.         LPOLESTR lpOleStr;
  124.         StringFromCLSID(*pEntry->pclsid, &lpOleStr);
  125.         LPTSTR lpsz = OLE2T(lpOleStr);
  126.  
  127.         lRes = key.Open(key, lpsz);
  128.         if (lRes == ERROR_SUCCESS)
  129.         {
  130.             CString strDescription;
  131.             strDescription.LoadString(IDS_PROJEXP_DESCRIPTION);
  132.             key.SetKeyValue(_T("Description"), strDescription);
  133.         }
  134.         CoTaskMemFree(lpOleStr);
  135.     }
  136.     if (lRes != ERROR_SUCCESS)
  137.         hRes = HRESULT_FROM_WIN32(lRes);
  138.  
  139.     return hRes;
  140. }
  141.  
  142. /////////////////////////////////////////////////////////////////////////////
  143. // DllUnregisterServer - システム レジストリからエントリを削除します
  144.  
  145. STDAPI DllUnregisterServer(void)
  146. {
  147.     AFX_MANAGE_STATE(AfxGetStaticModuleState());
  148.  
  149.     HRESULT hRes = S_OK;
  150.     _Module.UnregisterServer();
  151.     return hRes;
  152. }
  153.  
  154.  
  155. /////////////////////////////////////////////////////////////////////////////
  156. // デバッグ サポート
  157.  
  158. // GetLastErrorDescription は VERIFY_OK マクロのインプリメンテーションで
  159. // 使用されます、stdafx.h 内で定義しています。
  160.  
  161. #ifdef _DEBUG
  162.  
  163. void GetLastErrorDescription(CComBSTR& bstr)
  164. {
  165.     CComPtr<IErrorInfo> pErrorInfo;
  166.     if (GetErrorInfo(0, &pErrorInfo) == S_OK)
  167.         pErrorInfo->GetDescription(&bstr);
  168. }
  169.  
  170. #endif //_DEBUG
  171.