coinitialize
本人封装了一个类,里面需要用到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 接口的引用。
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();
}
文章最后发布于: 2018-10-11 09:24:20
相关阅读
CoInitialize 编辑本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!CoInitialize是Windows提供的API函数,用
之一:大家都知道程序中若要使用COM组件则必须要先调用CoInitialize,该函数主要是用来初始化COM运行环境。但这个函数的作用域是以线