本篇幅参考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();