最近有個東西,需要讀 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
溪流 閱讀(25119)
評論(17) 編輯 收藏 引用 所屬分類:
C++ 、
COM