1. 程式人生 > >CoInitialize 和 CoUninitialize 的呼叫時機問題

CoInitialize 和 CoUninitialize 的呼叫時機問題

最近有個東西,需要讀 XML 配置檔案,於是用 msxml 做了。msxml 是基於 COM 的,使用之前需要 CoInitialize,使用之後需要 CoUninitialize。於是我寫成了:

void foo()
{
    CoInitialize(NULL);

    // Reading configuration

    CoUninitialize();
}

剛才我正樂此不彼的把類似這樣的東西改成:

void foo()
{
    CoInitialize(NULL);
    LOKI_ON_BLOCK_EXIT(CoUninitialize);

    // Reading configuration
}

前面的同事過來看到了,說,你不該在這裡呼叫 CoInitialize 和 CoUninitialize。如果有的地方也在用 COM,你這裡 CoUninitialize 一下,別的地方就會出錯了,上次的某個 Bug 就是。

我狡辯道:我假定這裡沒有多執行緒環境(實際上也是),並且約定別的地方用 COM 的時候呼叫 CoInitialize 時不要判斷返回值。

同事:應該和大眾習慣保持一致,最好就是全專案最開始的時候 CoInitialize 一次,結束的時候 CoUninitialize 一次。

我:我這裡是較底層功能函式。

同事:可以以文件的方式註明,使用該模組前必須自己 CoInitialize,使用完畢後自己 CoUninitialize。

我:我只是想要用起來方便一點,用的時候不要有那麼多先決條件和後置條件。再說,人家本來可以不知道我用了 COM,我這麼一說明,就暴露了內部資訊了不是?

其實我被動搖了。

各位大大,你們怎麼處理呢?

------------------------------華麗的分割線(13:27 p.m. 增加)----------------------------------

好,既然 CoInitialize 和 CoUninitialize 有引用計數機制,那麼這個具體問題已經解決。

那麼,有沒有類似的成對使用的 API,會對程序全域性產生影響的呢?如果有,在底層要用到的時候該怎麼處理?

posted on 2010-04-02 10:02
溪流
閱讀(20553) 評論(17)  編輯 收藏 引用 所屬分類: C++COM