CoInitialize/Ex调用失败时是否必须调用CoUninitialize?
针对你的三个疑问的明确解答
- 第一,文档描述的
CoInitialize/CoInitializeEx成功调用明确包含返回S_FALSE的情况,官方说明已经直接标注了这一点,S_FALSE属于成功调用的范畴,代表当前线程已经完成过COM库的初始化,本次调用仅增加了内部引用计数。 - 第二,不是只有返回S_OK时才需要调用
CoUninitialize:只要CoInitialize/CoInitializeEx调用返回的是成功类的返回值(包括S_OK和S_FALSE),就必须对应调用一次CoUninitialize,和初始化调用一一匹配。 - 第三,不是无论返回值是什么都要调用
CoUninitialize:如果CoInitialize/CoInitializeEx调用返回的是错误码(比如常见的E_INVALIDARG、E_OUTOFMEMORY等失败类HRESULT),说明COM库初始化没有成功,不需要调用CoUninitialize。
补充注意:COM库的初始化调用和卸载调用是严格按计数匹配的,同一个线程调用了N次成功的
CoInitialize/CoInitializeEx,就必须调用N次CoUninitialize,只有最后一次CoUninitialize才会真正释放当前线程占用的COM相关资源。
内容的提问来源于stack exchange,提问作者Barmak Shemirani
相关产品推荐
相关产品推荐

