参考《调用时机问题》
CoInitialize 和 CoUninitialize
最近有个东西,需要读 XML 配置文件,于是用 msxml 做了。msxml 是基于 COM 的,使用之前需要 CoInitialize,使用之后需要 CoUninitialize。于是我写成了:
void foo()
{
CoInitialize(NULL);
// Reading con<a href="https://www.jb51.cc/tag/fig/" target="_blank" class="keywords">fig</a>uration
CoUninitialize();
}
刚才我正乐此不彼的把类似这样的东西改成:
void foo()
{
CoInitialize(NULL);
LOKI_ON_BLOCK_EXIT(CoUninitialize);
// Reading con<a href="https://www.jb51.cc/tag/fig/" target="_blank" class="keywords">fig</a>uration
}
我和同事的讨论
前面的同事过来看到了,说:你不该在这里调用 CoInitialize 和 CoUninitialize。如果有的地方也在用 COM,你这里 CoUninitialize 一下,别的地方就会出错了,上次的某个 Bug 就是。
我狡辩道:我假定这里没有多线程环境(实际上也是),并且约定别的地方用 COM 的时候调用 CoInitialize 时不要判断返回值。
同事:应该和大众习惯保持一致,最好就是全项目最开始的时候 CoInitialize 一次,结束的时候 CoUninitialize 一次。
同事:可以以文档的方式注明,使用该模块前必须自己 CoInitialize,使用完毕后自己 CoUninitialize。
我:我只是想要用起来方便一点,用的时候不要有那么多先决条件和后置条件。再说,人家本来可以不知道我用了 COM,我这么一说明,就暴露了内部信息了不是?
其实我被动摇了。
各位大大,你们怎么处理呢?
------------------------------华丽的分割线(13:27 p.m. 增加)----------------------------------
好,既然 CoInitialize 和 CoUninitialize 有引用计数机制,那么这个具体问题已经解决。
那么,有没有类似的成对使用的 API,会对进程全局产生影响的呢?如果有,在底层要用到的时候该怎么处理?