zoukankan      html  css  js  c++  java
  • 关于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 set
    python 字典
    python 条件判断和循环
    OSMC Vs. OpenELEC Vs. LibreELEC – Kodi Operating System Comparison
    深度学习中噪声标签的影响和识别
    Open images from USB camera on linux using V4L2 with OpenCV
    球面镜成像原理,焦距推导
    动画演示10个有趣但毫无用处的Linux命令
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7920384.html
Copyright © 2011-2022 走看看