您的位置:首页 > 其它

com组件初始化的几个方法

2009-11-15 23:42 106 查看
本篇幅参考http://www.vckbase.com/document/viewdoc/?id=1500代码

总结了几种的com初始化的方法

1. 经过 IUnknown得到 IFun 接口指针

CoInitialize(NULL);
IUnknown * pUnk = NULL;
IFun * pFun = NULL;
hr=::CoCreateInstance(CLSID_Fun,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(LPVOID *)&pUnk);
pUnk->QueryInterface(IID_IFun,(LPVOID *)&pFun);
.......//调用pFun方法实现代码
CoUninitialize();


2.不经过IUnknown直接得到IFun接口指针

CoInitialize(NULL);
IFun * pFun = NULL;
hr=::CoCreateInstance(CLSID_Fun,NULL,CLSCTX_INPROC_SERVER,IID_IUnknown,(LPVOID *)&pFun);
.......//调用pFun方法实现代码
CoUninitialize();


3.使用CComPtr智能指针初始化

// COM 初始化 以 AfxOleInit() 函数调用
CComPtr<IUnknown> spUnk;
CComPtr < IFun > spFun;			// 定义 IFun 智能指针
HRESULT hr;
hr=spUnk.CoCreateInstance(CLSID_Fun);
if( FAILED( hr ) )	throw( _T("没有注册组件吧?") );
hr=spUnk.QueryInterface(&spFun);
if( FAILED( hr ) )	throw( _T("居然没有接口?") );


4.不再经过 IUnknown的智能指针初始化

// COM 初始化 以 AfxOleInit() 函数调用,
CComQIPtr< IFun, &IID_IFun > spFun;		// 定义 IFun 智能指针
HRESULT hr;
hr=spFun.CoCreateInstance(CLSID_Fun);
spFun->method()....//指针形式调用Ifun函数


5.不需AfxOleInit初始化,但必须释放智能指针

CoInitialize(NULL);
CComQIPtr<IFun,&IID_IFun> spFun;
spFun.CoCreateInstance(CLSID_Fun);
.....
spFun->method();
spFun.Release();
CoUninitialize();


6.由于在 stdafx.h 中 #import 的时候,没有使用 no_namespace 因此要使用命名空间命名空间叫 ComNameLib ,这个名称是组件 IDL 文件 Library 指定的需要AfxOleInit()调用或者CoInitialize初始化,但必须在CoUninitialize释放智能指针

//在std文件中
//#import "../TestATL_3/Debug/TestATL_3.dll"
//CoInitialize(NULL);
TestATL_3Lib::IFunPtr spFun(__uuidof(TestATL_3Lib::Fun));
...
spFun->method();
...
//spFun.Release();
//CoUninitialize();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐