最近有个东西,需要读 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 
溪流 阅读(25193) 
评论(17)  编辑 收藏 引用  所属分类: 
C++ 、
COM