本人封裝了一個類,裏面須要用到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
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