使用Com组件的时候,注意接口的释放
来源:互联网 发布:linux 启动mysql服务 编辑:程序博客网 时间:2024/06/08 16:18
创建一个atl的exe组件,增加了一个从IUnknown派生的接口,当在客户端创建这个接口成功后,在退出的时候调用Release程序出现如下的错误,Cannot execute program .这是问什么?
产生上述错误的原因:
在客户端的程序是一个基于对话框的程序,在该程序的C**APP:: InitInstance()函数的开头和结尾增加了如下代码,已实现调用Com接口.
BOOL CMy****App::InitInstance()
{
AfxEnableControlContainer();
CoInitialize(NULL);
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
CMyFinalCliDlg dlg;
m_pMainWnd = &dlg;
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
CoUninitialize();
return FALSE;
}
在程序退出的时候,当执行完CoUninitialize()后CMy****Dlg的析购函数才备调用,在析构函数中,调用Release去释放接口的时候,由于Com环境都已经释放了,还掉用Release就导致了上述的错误结果。
改正方法:
在CMy****Dlg的构造函数中加:CoInitialize(NULL);在CMy****Dlg的析构函数中在Releaae后接口后,调用CoUninitialize();就可以避免该错误.
注意:
? 如果从IDispatch接口派生,那么在CMy****App的InitInstance函数中释放Com环境却不会出错。很奇怪.
? 如果通过导入tlb库的话,那么应该这样申明:
1. 通过CLSID 和IID创建接口
#include "Server_i.c" //定义CLS_ID和IID
#import "Server.tlb" rename_namespace("ServerDriver")
using namespace ServerDriver;
ITest2* m_pComm;
…..
HRESULT hr = S_OK;
hr = CoCreateInstance(CLSID_Test2,NULL,CLSCTX_LOCAL_SERVER,IID_ITest2,reinterpret_cast<void**>(&m_pComm));
if(SUCCEEDED(hr))
{
}
2. 通过__uuidof创建接口
如果不调用:#include "Server_i.c",那么创建接口只能通过如下方式:
ITest2Ptr m_pComm; //……2……
HRESULT hr = S_OK;
hr = m_pComm.CreateInstance(__uuidof(Test2));
if(SUCCEEDED(hr))
{
}
注意: 使用两种方法中申明对象的不同,当导入库的时候,会在客户端的Debug文件夹中生成:***.tlh的文件。
- 使用Com组件的时候,注意接口的释放
- 立即释放.net下的com组件
- 释放.net下的com组件
- 立即释放.net下的com组件
- 立即释放.net下的com组件
- 立即释放.net下的com组件
- COM 组件使用注意
- COM接口的创建和释放原则
- 关于COM接口使用时候的一个低级错误
- COM 组件接口的 IUnKnown 接口介绍
- COM组件的使用
- com组件的使用
- 使用COM组件的IPicture接口---实现图片显示
- com接口的使用
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题。
- Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题
- 释放资源的时候
- 关于使用Jquery动态生成页面组件的时候,单引号和双引号的注意
- WebSphere应用服务器内存泄漏探测与诊断工具选择最佳实践
- jsp 生成csv文件
- Linux下的likely,unlikely宏
- Tab Control控件使用的例子
- 系统思维摘录(转自开复学习网)
- 使用Com组件的时候,注意接口的释放
- 各种索引的结构分析 降序索引和位图索引
- VS.NET2005安装部署[繁体图文并茂]
- 对搜索引擎市场份额调查数据差异之补充
- servet的doget和post请求,以及getparameter方法
- 安装suse linux websphere 集群 sybase
- jsp过滤器
- 利用RSVIEW32的事件机制实现软冗余自动切换
- 电脑的140个技巧