在DLL中如何使用Coinitialize和CoUnitialize?

全才欧巴 2016-06-24 11:03:26
经过各种测试,最好的方法是放在dllmain中,这样不会出现崩溃等各种奇怪的问题
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
break;
case DLL_THREAD_DETACH:
CoUninitialize();
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

...全文
704 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eleven 2016-07-04
  • 打赏
  • 举报
回复
MSDN中关于CoInitialize中Remark部分写的很清楚: Because there is no way to control the order in which in-process servers are loaded or unloaded, do not call CoInitialize, CoInitializeEx, or CoUninitialize from the DllMain function.
fly4free 2016-07-04
  • 打赏
  • 举报
回复
1). 不要在dll中 初始化COM组件。因为你不知道 调用者 COM 模型是啥。当然多数是 apartment 2). 而且,根据你初始化代码使用的COM模型,调用 dllmain的 不一定是调用导出方法的调用者线程,CoInitialize 不一定生效。 最好让调用者初始化 com 环境,如果此dll的调用者也是个dll,见1)
全才欧巴 2016-06-24
  • 打赏
  • 举报
回复

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧