Win初始化和在Win32 C++ DLL中的使用

Jim*_*ell 5 c++ com dll visual-studio-2008

我正在编写一个Win32 C++ DLL,它使用COM来查询WMI.如何以编程方式确定COM是否已初始化?谢谢.

pet*_*hen 10

Mark Ransom是正确
的,直接,简洁和简单的解决方案是要求调用者进行COM初始化.

丑陋的黑客
你可以试试你的第一个电话 - 可能CoCreateInstance,如果它返回CO_E_NOTINITIALIZED,CoInitialize自己跑(并且不要忘记在那种情况下取​​消)

但是,将一个CoInitialize"注入"来自DLL的调用者线程仍然存在问题.所以有一个

清洁解决方案
让DLL创建一个工作线程(这意味着DLL需要Init和Teardown调用),自己在这个线程中使用CoInitializeEx,并将所有COM调用移动到该单独的线程.

  • 谢谢,我最终使用了一个工作线程.初始化和拆除都在相同的DLL函数中完成.`WaitForSingleObject`用于等待工作线程完成. (2认同)

Mar*_*som 7

最简单的方法是不要打扰,只需要让任何使用你的DLL的人首先初始化COM.否则,如果他们你的初始化之后执行它,你就有可能弄乱他们自己的初始化.

另一方面,如果您的标志CoInitializeEx与应用程序的标志相匹配,那么您应该没问题.从CoInitializeEx文档:

只要它们传递相同的并发标志,就允许同一个线程多次调用CoInitializeEx,但后续的有效调用返回S_FALSE.