最近有個(gè)東西,需要讀 XML 配置文件,于是用 msxml 做了。msxml 是基于 COM 的,使用之前需要 CoInitialize,使用之后需要 CoUninitialize。于是我寫成了:
void foo()
{
CoInitialize(NULL);
// Reading configuration
CoUninitialize();
}
剛才我正樂此不彼的把類似這樣的東西改成:
void foo()
{
CoInitialize(NULL);
LOKI_ON_BLOCK_EXIT(CoUninitialize);
// Reading configuration
}
前面的同事過來看到了,說,你不該在這里調(diào)用 CoInitialize 和 CoUninitialize。如果有的地方也在用 COM,你這里 CoUninitialize 一下,別的地方就會(huì)出錯(cuò)了,上次的某個(gè) Bug 就是。
我狡辯道:我假定這里沒有多線程環(huán)境(實(shí)際上也是),并且約定別的地方用 COM 的時(shí)候調(diào)用 CoInitialize 時(shí)不要判斷返回值。
同事:應(yīng)該和大眾習(xí)慣保持一致,最好就是全項(xiàng)目最開始的時(shí)候 CoInitialize 一次,結(jié)束的時(shí)候 CoUninitialize 一次。
我:我這里是較底層功能函數(shù)。
同事:可以以文檔的方式注明,使用該模塊前必須自己 CoInitialize,使用完畢后自己 CoUninitialize。
我:我只是想要用起來方便一點(diǎn),用的時(shí)候不要有那么多先決條件和后置條件。再說,人家本來可以不知道我用了 COM,我這么一說明,就暴露了內(nèi)部信息了不是?
其實(shí)我被動(dòng)搖了。
各位大大,你們?cè)趺刺幚砟兀?/p>
------------------------------華麗的分割線(13:27 p.m. 增加)----------------------------------
好,既然 CoInitialize 和 CoUninitialize 有引用計(jì)數(shù)機(jī)制,那么這個(gè)具體問題已經(jīng)解決。
那么,有沒有類似的成對(duì)使用的 API,會(huì)對(duì)進(jìn)程全局產(chǎn)生影響的呢?如果有,在底層要用到的時(shí)候該怎么處理?
posted on 2010-04-02 10:02
溪流 閱讀(25118)
評(píng)論(17) 編輯 收藏 引用 所屬分類:
C++ 、
COM