我写了一个类,里面需要用到ado连接数据库所以需要保证在调用ado前执行过CoInitialize我打算在构造函数里面执行CoInitialize 在析构函数里面执行CoUninitialize但是这样有问题是,别人调用这个类的时候,可能已经执行过CoInitialize这样类构造时重复执行CoInitialize会不会出现问题
(实际测试,发现运行没发生错误,不过不知道会不会有其它影响)另外,析构时执行CoUninitialize 会不会导致别的代码继续调用com相关资源时出错?有没有办法判断CoInitialize是否已经被执行过? 这样我好在构造时决定是否再次调用此函数
==========================

解决方案 »

  1.   

    没问题就没事了
    CoInitialize这个函数好像会自动的判断的。no problem
      

  2.   

    谢谢LS的提醒 试了一下 似乎确实是这样在程序开始时调用
    CoInitialize(NULL);CoInitialize(NULL);CoUninitialize(); 
    接下来调用ado操作不会出问题但如果是
    CoInitialize(NULL);CoUninitialize(); 
    接下来调用ado操作就会失败==================
    不知道有没有哪个大侠有权威一点的文档介绍  这样简单测试得出结论不是很放心
      

  3.   


    class InitCom
    {
    public:
        InitCom()
        {
           CoInitialize(NULL);
        }
        ~InitCom()
        {
           CoUninitialize();
        }
    };//在程序代码里面定义一个变量 可以是全局变量
    InitCom _InitCom;
      

  4.   

    你的类就不要负责这个事情了.就像socket函数,他们都依赖于wsastartup函数进行初始化,但是它们也没有因此自己去初始化.再如richedit控件,它的运行需要com环境,它也木有进行初始化.
      

  5.   

    如上,不一定需要自己判断
    但如果你要确保已经初始化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
      

  6.   

    // CoUninitialize()如果成功,那么之后的ADO操作都会出错。
    // com的初始化和释放,最好不要放到类里执行。
      

  7.   

    good  通过返回值判断确实是好方法
    =========
    各位说的把函数调用交给使用者我也曾考虑过但是又考虑到以后我的类可能有修改,不用ado而改用其它方式连接数据库这样的话CoInitialize就不是必需的了 所以最后还是决定屏蔽这个函数的调用