我有一个以
开头的单线程程序CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)
我使用COINIT_APARTMENTTHREADED,因为某些函数(例如URLDownloadToFile)在Windows XP中无法正常使用COINIT_MULTITHREADED
现在我正在研究CreateTimerQueueTimer中回调函数中的一个奇怪行为 - 没有创建COM对象。
那么,我应该在计时器回调函数中进行COM初始化,还是我的代码中遗漏了一些东西?
更新:我只是简化了我的代码,我确信我在定时器回调之前调用了CoInitializeEx,但是在第二个定时器回调中看起来我没有调用
答案 0 :(得分:0)
每个开发人员必须至少调用一次CoInitialize(Ex),比如说。
如果您作为开发人员拥有一个线程(或一个进程),那么如果您在该线程中使用COM,则必须为每个线程调用一次。
如果您不确定之前是否因为您没有线程而被调用,则可以调用它。返回值会告诉您是否是第一个调用它的人。在这种情况下,您还应该检查可怕代码RPC_E_CHANGED_MODE的返回值,这基本上是您注定要注意的,并且应该使用您自己的线程来完成您的工作。
正如评论中所述,每个CoInitialize调用都必须与CoUninitialize配对。