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