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  溪流  阅读(15)  评论(0编辑  收藏  举报