关于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的有关操做,应该能够解决你的问题。ui

  发生崩溃的缘由在于,ADO的智能指针接口不会在CoUninitialize 以前释放, 这种状况是未定义的,会发生什么谁也不能确定。  
  正确地作法: 明确地在卸载 COM 前释放全部的 COM 接口的引用
spa

  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最好在应用程序初始化以及退出时调用,样例中在构造以及析构中调用是不提倡的作法。.net

相关文章
相关标签/搜索