我应该在计时器回调中调用CoInitialize

时间:2013-05-23 11:57:28

标签: c++ winapi com

我有一个以

开头的单线程程序

CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)

我使用COINIT_APARTMENTTHREADED,因为某些函数(例如URLDownloadToFile)在Windows XP中无法正常使用COINIT_MULTITHREADED

现在我正在研究CreateTimerQueueTimer中回调函数中的一个奇怪行为 - 没有创建COM对象。

那么,我应该在计时器回调函数中进行COM初始化,还是我的代码中遗漏了一些东西?

更新:我只是简化了我的代码,我确信我在定时器回调之前调用了CoInitializeEx,但是在第二个定时器回调中看起来我没有调用

1 个答案:

答案 0 :(得分:0)

每个开发人员必须至少调用一次CoInitialize(Ex),比如说。

如果您作为开发人员拥有一个线程(或一个进程),那么如果您在该线程中使用COM,则必须为每个线程调用一次。

如果您不确定之前是否因为您没有线程而被调用,则可以调用它。返回值会告诉您是否是第一个调用它的人。在这种情况下,您还应该检查可怕代码RPC_E_CHANGED_MODE的返回值,这基本上是您注定要注意的,并且应该使用您自己的线程来完成您的工作。

正如评论中所述,每个CoInitialize调用都必须与CoUninitialize配对。