本人封装了一个类,里面需要用到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最好在应用程序初始化以及退出时调用,样例中在构造以及析构中调用是不提倡的做法。

关于CoInitialize和CoUninitialize调用的有关问题的更多相关文章

  1. delphi 在多线程中使用 CreateOleObject 导致失败(一定要使用CoInitialize和CoUninitialize,举例查询WMI)

    原帖地址 http://bbs.csdn.net/topics/390481350 解决办法 procedure DisplayVideoInfo; var wmi, objs, obj : OleV ...

  2. c#winform使用WebBrowser 大全[超长文转载]

    1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时释放所有资源.必须在附加事件的同一线程上调用 ...

  3. C# Winform WebBrowser控件

    C# WinForm WebBrowser 1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时 ...

  4. c#winform使用WebBrowser 大全

    C# WinForm WebBrowser (一) MSDN资料 1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispos ...

  5. VC6.0 C++ 如何调用微软windows系统SDK 语音API

    下载3个语音API安装包 http://www.microsoft.com/en-us/download/details.aspx?id=10121 需要安装微软语音API安装包:SpeechSDK5 ...

  6. Delphi中CoInitialize之探究

    CoInitialize(LPVOID),它将以特定参数调用CoInitializeEx,为当前单元初始化COM库,并标记协同模式为单线程模式.参数必须为NULL.这是关于OLE和COM的问题. Co ...

  7. AfxOleInit()和::CoInitialize(NULL)区别

    From: http://blog.csdn.net/zhoubl668/archive/2009/04/30/4139933.aspx OLE是建立在COM之上的技术,层次比COM要高.AfxOle ...

  8. Delphi 中调用JS文件中的方法

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  9. CoInitialize和CoInitializeEx

    1.CoInitialize和CoInitializeEx的功能 CoInitialize是在当前线程初始化Com组件的函数,并且初始化为STA模式(单线程模式),一般新的程序建议使用CoInitia ...

随机推荐

  1. Python 二维码解码

    二维码解析 Python中关于二维码解析的现成模块有很多,比较著名的就是Zbar以及ZXing.然而很不幸的是,官方的版本都是支持到python2.x,下面是在python2.x的例子: import ...

  2. top命令的Load average 含义及性能参考基值

    $ uptime11:12:26 up 3:44, 4 users, load average: 0.38, 0.31, 0.19 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树.如果一个 ...

  3. LaTeX 中换段落

    中文文章中,LaTeX 中换段落: 在LaTeX 中,一个回车表示一个空格,两个回车表示一个分段.

  4. Bootstrap学习笔记面板(Panels)

    本文将讲解Bootstrap面板(Panels).面板组件用于把DOM组件插入到一个盒子中.创建一个基本的面板,只需要向div元素添加class .panel和 panel-default即可,如下面 ...

  5. Mac Yosemite上安装macvim和YouCompleteMe

    今天在macvim上安装YouCompleteMe的时候,碰到一个运行vim崩溃的错误.查了半天终于解决! 先上一下安装macvim的过程 # install xcode and command li ...

  6. atitit.php中的dwr 设计模式

    atitit.php中的dwr 设计模式 1. dwr的优点相对于ajax来说.. 1 2. DWR工作原理 1 3. php的dwr实现 1 4. 参考 3 1. dwr的优点相对于ajax来说.. ...

  7. Vivado Logic Analyzer的使用

    chipscope中,通常有两种方法设置需要捕获的信号.1.添加cdc文件,然后在网表中寻找并添加信号2.添加ICON.ILA和VIO的IP Core 第一种方法,代码的修改量小,适当的保留设计的层级 ...

  8. Sublime Text的列模式

    Sublime Text的列模式如何操作? 听语音 | 浏览:6551 | 更新:2014-12-09 13:27 | 标签:软件 Sublime Text的列模式如何操作?各个系统不一样,请跟进系统 ...

  9. thread_为什么多线程是个坏主意

    转 http://ifeve.com/why-threads-bad/ 在 Unix编程艺术 中,提到了尽量避免多线程编程模型, 认为这样只会增加复杂度, 提倡使用多进程, 这样本质上就可以避免多线程 ...

  10. ny82 迷宫寻宝(一) map+queue

    题目地址:http://acm.nyist.net/JudgeOnline/problem.php?pid=82 AC代码:讲解,先统计在可搜索范围内对应的钥匙数,把搜到的门存到另外的一个队列中,第一 ...