我正在尝试在进程内COM服务器DLL (一个IE BHO)中使用WTL,但在使用_Module时遇到了困难。
我的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();
}但这与大多数WTL示例相冲突,这些示例需要在stdafx.h中包含以下内容
extern CAppModule _Module; // WTL version of CComModule不管我用哪种方式做,我(毫不奇怪)都会遇到编译错误。从CAppModule派生的CMyModule在_Module.DllUnregisterServer()上阻塞,等等。从CAtlDllModuleT<>派生的CMyModule在像_Module.GetMessageLoop()这样的代码上阻塞。
关于WTL在DLL中是如何工作的,有什么好的参考资料吗?谷歌发现了很多问题,但答案却很少。
发布于 2009-06-01 22:13:02
我有一个在DLL中使用WTL的项目。我看了看我的头是如何设置的,看起来我解决了同样的问题……
我的模块设置与您的示例代码一样,继承自CAtlDllModuleT<>,只是全局模块变量的名称是_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;一定有更好的方法,但这是可行的。
发布于 2009-03-25 19:36:23
你有没有考虑过多重继承的选择?尝试同时从CAtlDllModule和CAppModule继承,因为这两个都需要。
发布于 2010-11-28 22:46:50
我在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;然后,动态链接库主要使用_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;
}https://stackoverflow.com/questions/683079
复制相似问题