关于CoInitialize和CoUninitialize调用的有关问题

关于CoInitialize和CoUninitialize调用的问题
我写了一个类,里面需要用到ado连接数据库

所以需要保证在调用ado前执行过CoInitialize

我打算在构造函数里面执行CoInitialize 在析构函数里面执行CoUninitialize

但是这样有问题是,别人调用这个类的时候,可能已经执行过CoInitialize

这样类构造时重复执行CoInitialize会不会出现问题
(实际测试,发现运行没发生错误,不过不知道会不会有其它影响)

另外,析构时执行CoUninitialize 会不会导致别的代码继续调用com相关资源时出错?

有没有办法判断CoInitialize是否已经被执行过? 这样我好在构造时决定是否再次调用此函数
==========================





------解决方案--------------------
没问题就没事了
CoInitialize这个函数好像会自动的判断的。

no problem
------解决方案--------------------
C/C++ code

class InitCom
{
public:
    InitCom()
    {
       CoInitialize(NULL);
    }
    ~InitCom()
    {
       CoUninitialize();
    }
};

//在程序代码里面定义一个变量 可以是全局变量
InitCom _InitCom;

------解决方案--------------------
你的类就不要负责这个事情了.

就像socket函数,他们都依赖于wsastartup函数进行初始化,但是它们也没有因此自己去初始化.

再如richedit控件,它的运行需要com环境,它也木有进行初始化.
------解决方案--------------------
如上,不一定需要自己判断
但如果你要确保已经初始化COM 可以自己调用CoInitialize 根据msdn 
如果你之前已经初始化 会根据你这次调用是否尝试改变线程模型而给你不同的返回值(RPC_E_CHANGED_MODE/S_FALSE) 你可以在检测到这样的返回值之后 决定开始用ado功能或者调用一次
CoUninitialize(对于S_FALSE) 如果返回S_OK就是正常结果 先前没初始化过 也是继续走
http://msdn.microsoft.com/en-us/library/ms678543(VS.85).aspx
------解决方案--------------------
// CoUninitialize()如果成功,那么之后的ADO操作都会出错。
// com的初始化和释放,最好不要放到类里执行。