必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-10-29 00:13:28来源:IT技术作者:seo实验室小编阅读:61次「手机版」
 

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和CoUninitialize

CoInitialize  编辑本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!CoInitialize是Windows提供的API函数,用

CoInitialize浅析

之一:大家都知道程序中若要使用COM组件则必须要先调用CoInitialize,该函数主要是用来初始化COM运行环境。但这个函数的作用域是以线

分享到:

栏目导航

推荐阅读

热门阅读