0

我有一个单线程程序,它以

CoInitializeEx(NULL,COINIT_APARTMENTTHREADED)

我使用 COINIT_APARTMENTTHREADED,因为某些功能(例如 URLDownloadToFile)在 Windows XP 中无法与 COINIT_MULTITHREADED 一起正常工作

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

那么,我应该在计时器回调函数中进行 COM 初始化,还是我只是错过了代码中的某些内容?

更新:我只是简化了我的代码,我确定我在计时器回调之前调用了 CoInitializeEx,但是在第二个计时器回调时,我似乎没有调用

4

1 回答 1

0

例如,每个线程、每个开发人员必须至少调用一次 CoInitialize(Ex)。

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

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

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

于 2013-05-23T12:39:41.903 回答