如何在 DLL 中使用 WTL?
我正在尝试在进程内 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 中工作的任何好的参考资料? 谷歌发现了很多问题,但答案却很少。
I'm trying to use WTL within an in-process COM server DLL (an IE BHO), but am struggling with _Module.
My DLL needs CMyModule
derived from 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();
}
But this conflicts with most WTL examples, which require something like this within stdafx.h
:
extern CAppModule _Module; // WTL version of CComModule
No matter which way I do it, I (unsurprisingly) get compile errors. CMyModule
derived from CAppModule
borks on _Module.DllUnregisterServer()
, etc. CMyModule
derived from CAtlDllModuleT<>
borks on code like _Module.GetMessageLoop()
.
Any good references on how WTL is supposed to work within a DLL? Google finds lots of questions, with few answers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我有一个在 DLL 中使用 WTL 的项目。 我查看了我的标头是如何设置的,看起来我解决了同样的问题...
我的模块设置就像从 CAtlDllModuleT<> 继承的示例代码一样。 除了全局模块变量的名称是 _AtlModule 而不是 _Module 之外。 例如:
因此,所有 DllMain.cpp 入口点都使用 _AtlModule。 然后在 stdafx.h 文件中,它看起来像这样:
_pModule 的东西在 atlbase.h 中定义为:
必须有更好的方法,但这确实有效。
I have a project that uses WTL in a DLL. I looked at how my headers are set up and it looks like I hacked around this same problem...
I have my module set up like your sample code inheriting from CAtlDllModuleT<> except the name of the global module variable is _AtlModule rather than _Module. For example:
So, all of the DllMain.cpp entry points use _AtlModule. Then in the stdafx.h file it looks like this:
That _pModule thing is defined in atlbase.h like:
There must be a better way, but this does work.
您是否考虑过多重继承的选择? 尝试从 CAtlDllModule 和 CAppModule 继承,因为您需要两者。
Have you considered the option of multiple inheritance? Try inheriting from both CAtlDllModule and CAppModule since you need both.
我在 Office 加载项中使用 WTL; 以下对我有用。 (在stdafx.h的底部)
然后DLL主要使用
_AtlModule
:I use WTL in an Office add-in; the following works for me. (At the bottom of stdafx.h)
And then the DLL main use
_AtlModule
: