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


      本人封装了一个类,里面需要用到ADO连接数据库,
      所以需要初始化COM环境以及释放COM环境,
      我打算在构造函数里面执行CoInitialize,在析构函数里面执行CoUninitialize
      但是程序运行时,在析构函数中调用CoUninitialize,程序崩溃了~

      CoUninitialize()引起系统异常推出

      Closes the COM library on the current thread, unloads all DLLs loaded by the thread, frees any other resources that the thread maintains, and forces all RPC connections on the thread to close.

      上面的这段话摘自MSDN,话中对CoUninitialize的功能进行了简单的说明,从中我们可以得到,当调用CoUninitialize这个函数的时候,会关掉其所做的线程。那么如果你的应用在运行的时候只有一个进程,而且该进程也仅有一个线程的话,那么调用该函数自然会导致整个应用的退出。我想,你在你的应用中创建一个单独的线程来进行装载DLL的有关操作,应该可以解决你的问题。

      发生崩溃的原因在于,ADO的智能指针接口不会在CoUninitialize 之前释放, 这种情况是未定义的,会发生什么谁也不能肯定。  
      正确地做法: 明确地在卸载 COM 前释放所有的 COM 接口的引用

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    CMyDatabase::CMyDatabase()
    {
        ::CoInitialize(NULL);   //初始化COM库

        m_pRecordset = 
    NULL;
        m_pConnection = 
    NULL;
        m_pCommand = 
    NULL;
        m_pConnection.CreateInstance(
    __uuidof(Connection));
        m_pRecordset.CreateInstance(
    __uuidof(Recordset));
        m_pCommand.CreateInstance(
    __uuidof(Command));
    }

    CMyDatabase::~CMyDatabase()
    {
        m_pCommand.Release();
        m_pRecordset.Release();
        m_pConnection.Release();

        ::CoUninitialize();
    }

      注意CoInitialize和CoUninitialize最好在应用程序初始化以及退出时调用,样例中在构造以及析构中调用是不提倡的做法。

  • 相关阅读:
    python 列表、元组、字典总结
    python 字典
    python 元组
    python 列表
    JMeter的作用域与执行顺序
    JMeter第一个实战
    JMeter录制的两种方法
    JMeter常用功能
    初识jmeter2
    handler的拒绝策略:
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7920384.html
Copyright © 2020-2023  润新知