在我的应用程序退出之前终止的线程上调用CoUninitialize是否很重要?

时间:2011-11-08 17:20:48

标签: windows visual-c++ com

我打电话给CoInitializeEx,特别是:

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED);

在我的应用程序创建的线程中,但随后在应用程序退出之前终止。将这些与CoUninitialize调用配对是否很重要,或者在线程终止时是否释放这些资源?

1 个答案:

答案 0 :(得分:14)

当进程终止时,通常会将资源返回给系统,而不是当其中一个线程执行时。

但是,CoUninitialize()不仅释放资源并卸载DLL,它还会进入模态消息循环,以便在线程终止之前抽取剩余的COM消息。文档说:

  

如果还有剩余的对话,CoUninitialize会启动   模态消息循环并从中调度任何挂起的消息   此COM应用程序的容器或服务器。通过派遣   消息CoUninitialize确保应用程序不会退出   在收到所有待处理的消息之前。非COM消息是   丢弃。

因此,为了避免调用方的RPC错误,我建议您遵循文档的建议,并在终止调用CoUninitialize()的线程之前始终调用CoInitializeEx()