CLSID_xxx //com ID标识,com唯一
IID_xxx //接口ID标识,在一个com中可以存在多个接口,IID_xxx是不一样的.
方式一:
通过IUnknown指针获取
- //定义IUnknow指针
- IUnknown * pUnk = NULL;
- //定义接口指针
- IFun * pFun = NULL;
- HRESULT hr;
- /!*首先获取IUnknown指针*/
- hr = ::CoCreateInstance(
- CLSID_Fun, // COM组件的唯一标识
- NULL,
- CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
- IID_IUnknown, // 取得 IUnknown 接口指针
- (LPVOID *) &pUnk); // 返回的IUnknown指针
- if( FAILED( hr ) )
- TRACE(_T("COM没注册?"));
- /!*用IUnknown指针获取COM组件接口指针*/
- hr = pUnk->QueryInterface(
- IID_IFun, // IFun接口ID
- (LPVOID *)&pFun );
- if( FAILED( hr ) )
- TRACE( _T("没有接口?") );
- /*!调用*/
- pFun->function();
方式二:
不使用IUnknown指针.直接获取COM接口指针
- //定义接口指针
- IFun * pFun = NULL;
- HRESULT hr;
- /!*直接获取IFun指针*/
- hr = ::CoCreateInstance(
- CLSID_Fun, // COM组件的唯一标识
- NULL,
- CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
- IID_IFun, // IFun接口ID
- (LPVOID *) &pFun); // 返回的IFun指针
- if( FAILED( hr ) )
- TRACE(_T("COM没注册或者没有接口."));
- /*!调用*/
- pFun->function();
方式三:
智能指针头文件<atlbase.h>
使用智能指针 CComPtr<interface>
- CComPtr < IUnknown > pUnk; // 定义 IUnknown 的智能指针
- CComPtr < IFun > pFun; // 定义 IFun 的智能指针
- HRESULT hr;
- //使用 CLSID 启动组件
- hr = pUnk.CoCreateInstance( CLSID_Fun );
- if( FAILED( hr ) )
- TRACE( _T("没注册组件?") );
- hr = pUnk.QueryInterface(&pFun);
- if( FAILED( hr ) )
- TRACE( _T("没有接口.") );
-
- /*!调用*/
- pFun->function();
方式四:
使用智能指针 CComQIPtr<interface>
- CComQIPtr < IFun , &IID_IFun > pFun; // 定义 IFun 的智能指针
- HRESULT hr;
- hr = pFun.CoCreateInstance( IID_IFun );
- if( FAILED( hr ) )
- TRACE( _T("没注册组件或没有接口") );
-
- /*!调用*/
- pFun->function();
注:
智能指针的释放
- void fun()
- {
- ::CoInitialize( NULL ); //如果在这里初始化,则要注意智能指针的释放
- CComQIPtr < IFun , &IID_IFun > pFun; // 定义 IFun 的智能指针
- HRESULT hr;
- hr = pFun.CoCreateInstance( IID_IFun );
- ASSERT( FAILED( hr ))
- /*!调用*/
- pFun->function();
- //spFun->Release(); // 错!!
- spFun.Release(); // 正解
- }