如何在DLL中使用WTL?
我正试图在进程内COM服务器DLL(IE BHO)中使用WTL,但正在与_模块进行斗争 我的DLL需要如何在DLL中使用WTL?,dll,atl,bho,wtl,Dll,Atl,Bho,Wtl,我正试图在进程内COM服务器DLL(IE BHO)中使用WTL,但正在与_模块进行斗争 我的DLL需要CMyModule从CAtlDllModuleT派生: 不管我用哪种方式,我(毫不奇怪)都会遇到编译错误CMyModule源于CAppModuleborks on\u Module.DllUnregisterServer()等CMyModule源于CAtlDllModuleT源于\u Module.GetMessageLoop() 关于WTL应该如何在DLL中工作,有什么好的参考资料吗?谷歌发现
CMyModule
从CAtlDllModuleT
派生:
不管我用哪种方式,我(毫不奇怪)都会遇到编译错误CMyModule
源于CAppModule
borks on\u Module.DllUnregisterServer()
等CMyModule
源于CAtlDllModuleT
源于\u Module.GetMessageLoop()
关于WTL应该如何在DLL中工作,有什么好的参考资料吗?谷歌发现了很多问题,但答案很少。你考虑过多重继承的选择吗?尝试从CAtlDllModule和CAppModule继承,因为两者都需要。您考虑过多重继承的选项吗?尝试从CAtlDllModule和CAppModule继承,因为两者都需要。我有一个在DLL中使用WTL的项目。我看了一下我的标题是如何设置的,看起来我也解决了同样的问题 我的模块设置与您从CAtlDllModuleT继承的示例代码类似,只是全局模块变量的名称是_AtlModule而不是_module。例如:
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
DECLARE_LIBID(LIBID_MyLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};
CMyModule _AtlModule;
一定有更好的办法,但这确实有效 我有一个在DLL中使用WTL的项目。我看了一下我的标题是如何设置的,看起来我也解决了同样的问题 我的模块设置与您从CAtlDllModuleT继承的示例代码类似,只是全局模块变量的名称是_AtlModule而不是_module。例如:
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
DECLARE_LIBID(LIBID_MyLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};
CMyModule _AtlModule;
一定有更好的办法,但这确实有效 我在Office插件中使用WTL;以下内容适合我。(在stdafx.h的底部)
我在Office插件中使用WTL;以下内容适合我。(在stdafx.h的底部)
我已经试过了,但现在已经尝试了一点。让我走了这么远,但一件事导致另一件事。似乎CAtlBaseModule的多次继承给我的信息太少(例如_模块缺少GetMessageLoop)。使用CAppModule继承会带来太多的问题(例如,对DLLMain的访问不明确)。我已经尝试过了,但现在已经尝试了一些。让我走了这么远,但一件事导致另一件事。似乎CAtlBaseModule的多次继承给我的信息太少(例如_模块缺少GetMessageLoop)。使用CAppModule继承会提供太多(例如,对DLLMain的访问不明确)。
class CMyModule : public CAtlDllModuleT< CMyModule >
{
public:
DECLARE_LIBID(LIBID_MyLib)
DECLARE_REGISTRY_APPID_RESOURCEID(IDR_MYPROJ, "{...}")
};
CMyModule _AtlModule;
// WTL includes
#define _Module (*_pModule)
#include <atlapp.h>
#include <atlctrls.h>
#include <atldlgs.h>
#undef _Module
__declspec(selectany) CComModule* _pModule = NULL;
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 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;
}