2009-03-25 21 views
1

インプロセスCOMサーバーDLL(IE BHO)内でWTLを使用しようとしていますが、_Moduleで苦労しています。DLLでWTLを使用するにはどうすればよいですか?

私のDLLがCAtlDllModuleT<>由来CMyModuleを必要とします:

class CMyModule : public CAtlDllModuleT<CMyModule> 
{ 
public: 
    DECLARE_LIBID(LIBID_MyLib) 
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}") 
}; 

CMyModule _Module; 

extern "C" BOOL WINAPI DllMain(...) 
{ 
    hInstance; 
    return _Module.DllMain(dwReason, lpReserved); 
} 

... 

STDAPI DllUnregisterServer(void) 
{ 
    return _Module.DllUnregisterServer(); 
} 

しかしstdafx.h以内にこのような何かを必要とするほとんどのWTL例、この紛争:

extern CAppModule _Module; // WTL version of CComModule 

私はそれを行う方法に関係なく、私は(意外にも)コンパイルエラーを起こす。 CMyModuleCAppModuleborks on _Module.DllUnregisterServer()などCMyModuleCAtlDllModuleT<>borks onコード_Module.GetMessageLoop()などに由来します。

DLL内でWTLがどのように動作するはずです。 Googleは、いくつかの答えで多くの質問を見つけます。

答えて

0

複数の継承のオプションを考えましたか?両方が必要なので、CAtlDllModuleとCAppModuleの両方を継承してみてください。

+0

私はそれを試したと思いますが、今行くのはもう少しそれを与えています。今まで私を取得しますが、1つは別のものにつながります。 CAtlBaseModuleを継承している複数のインスタンスが私に与える影響が少なすぎると思われます(例:_ModuleにGetMessageLoopがありません)。 CAppModuleで継承すると、あまりにも多くの問題が発生します(DLLMainのあいまいなアクセスなど)。 – Mat

1

DLLにWTLを使用するプロジェクトがあります。私は見出しがどのように設定されているかを見て、この同じ問題をハックしたように見えます。

グローバルモジュール変数の名前を除き、CAtlDllModuleTから継承するサンプルコードのように私のモジュールを設定しました。 _Moduleではなく_AtlModule。たとえば:だから

class CMyModule : public CAtlDllModuleT<CMyModule> 
{ 
public: 
    DECLARE_LIBID(LIBID_MyLib) 
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}") 
}; 

CMyModule _AtlModule; 

、DllMain.cppエントリポイントのすべてが_AtlModuleを使用しています。次に、stdafx.hをして、それがこのようなファイル:_pModuleの事がatlbase.hのように定義されていることを

// WTL includes 
#define _Module (*_pModule) 
#include <atlapp.h> 
#include <atlctrls.h> 
#include <atldlgs.h> 
#undef _Module 

__declspec(selectany) CComModule* _pModule = NULL; 

あり、より良い方法であることが、これは仕事をしなければなりません。

0

私はOfficeアドインでWTLを使用します。次のことが私のために働く。

class DECLSPEC_UUID("XXXX-...") MyLib; 

using namespace ATL; 

/* 
* Application module 
*/ 
class CAddInModule : public CAtlDllModuleT<CAddInModule> 
{ 
public: 
    CAddInModule() : m_hInstance(NULL) 
    { 
    } 

    DECLARE_LIBID(__uuidof(MyLib)) 

    HINSTANCE GetResourceInstance() 
    { 
     return m_hInstance; 
    } 
    void SetResourceInstance(HINSTANCE hInstance) 
    { 
     m_hInstance = hInstance; 
    } 

private: 

    HINSTANCE m_hInstance; 
}; 

extern CAddInModule _AtlModule; 

そしてDLL主な用途_AtlModule(stdafx.hをの下部には):

// DLL Entry Point 
extern "C" BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) 
{ 
    _AtlModule.SetResourceInstance(hInstance); 
    return _AtlModule.DllMain(dwReason, lpReserved); 
} 


// Used to determine whether the DLL can be unloaded by OLE 
STDAPI DllCanUnloadNow(void) 
{ 
    return _AtlModule.DllCanUnloadNow(); 
} 


// Returns a class factory to create an object of the requested type 
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv) 
{ 
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv); 
} 


// DllRegisterServer - Adds entries to the system registry 
STDAPI DllRegisterServer(void) 
{ 
    // registers object, typelib and all interfaces in typelib 
    HRESULT hr = _AtlModule.DllRegisterServer(); 
    return hr; 
} 


// DllUnregisterServer - Removes entries from the system registry 
STDAPI DllUnregisterServer(void) 
{ 
    HRESULT hr = _AtlModule.DllUnregisterServer(); 
    return hr; 
} 
関連する問題