我正在尝试在进程内COM服务器DLL(IE BHO)中使用WTL,但我正在努力使用_Module。
我的DLL需要CMyModule
来自CAtlDllModuleT<>
:
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();
}
但这与大多数WTL示例相冲突,这些示例在stdafx.h
中需要类似的内容:
extern CAppModule _Module; // WTL version of CComModule
无论我采用哪种方式,我(不出所料)都会遇到编译错误。 CMyModule
CAppModule
来自_Module.DllUnregisterServer()
等CMyModule
borks CAtlDllModuleT<>
_Module.GetMessageLoop()
来自{{1}} borks,代码为{{1}}。
关于WTL如何在DLL中工作的任何好的参考?谷歌发现很多问题,答案很少。
答案 0 :(得分:1)
我有一个在DLL中使用WTL的项目。我查看了我的标题是如何设置的,看起来我已经破解了同样的问题......
我的模块设置类似于继承自CAtlDllModuleT的样本代码&lt;&gt;除了全局模块变量的名称是_AtlModule而不是_Module。例如:
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
DECLARE_LIBID(LIBID_MyLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};
CMyModule _AtlModule;
因此,所有DllMain.cpp入口点都使用_AtlModule。然后在stdafx.h文件中它看起来像这样:
// WTL includes
#define _Module (*_pModule)
#include <atlapp.h>
#include <atlctrls.h>
#include <atldlgs.h>
#undef _Module
_pModule事件在atlbase.h中定义,如:
__declspec(selectany) CComModule* _pModule = NULL;
必须有更好的方法,但这确实有效。
答案 1 :(得分:0)
您是否考虑过多重继承选项?尝试继承CAtlDllModule和CAppModule,因为你需要两者。
答案 2 :(得分:0)
我在Office插件中使用WTL;以下为我工作。 (在stdafx.h的底部)
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
:
// 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;
}