COM学习笔记<2>
1,别忘了初始化COM.(AfxOleInit,CoInitialize...)
2,使用CComBSTR来操作BSTR数据类型,这样就不种自己来释放内存了.使用CComBSTR请确认已包含头文件<atlbase.h>.简单使用示例如下.
1 STDMETHODIMP CDispSimple::Upper(BSTR str, BSTR *pVal)
2 {
3 // TODO: Add your implementation code here
4 CComBSTR bstr(str);
5 bstr.ToUpper();
6 *pVal=bstr.Copy();
7 return S_OK;
8 }
2 {
3 // TODO: Add your implementation code here
4 CComBSTR bstr(str);
5 bstr.ToUpper();
6 *pVal=bstr.Copy();
7 return S_OK;
8 }
3,常规接口调用方法.
Code
记得最后要释放接口指针.在上例中可以直接指定IID为IID_IFun,直接得到IFun接口指针,而不必要由IUnknown指针来QueryInterface来获得.
4,智能指针的使用方法.使用智能指针的最大好处在于不用我们自己来释放接口指针了.简单使用示例如下:
1 CComPtr < IUnknown > spUnk; // 定义 IUnknown 的智能指针
2 CComPtr < IFun > spFun; // 定义 IFun 的智能指针
3 HRESULT hr;
4 // 可以使用 CLSID 启动组件,也可以使用 ProgID
5 hr = spUnk.CoCreateInstance( CLSID_Fun );
6 if( FAILED( hr ) ) throw( _T("没注册组件吧?") );
7
8 hr = spUnk.QueryInterface( &spFun );
9 if( FAILED( hr ) ) throw( _T("居然没有接口") );
10
11 long nSum;
12 hr = spFun->Add( 1, 2, &nSum );
13 if( SUCCEEDED( hr ) )
14 {
15 CString sMsg;
16 sMsg.Format( _T("1 + 2 = %d"), nSum );
17 AfxMessageBox( sMsg );
18 }
19
2 CComPtr < IFun > spFun; // 定义 IFun 的智能指针
3 HRESULT hr;
4 // 可以使用 CLSID 启动组件,也可以使用 ProgID
5 hr = spUnk.CoCreateInstance( CLSID_Fun );
6 if( FAILED( hr ) ) throw( _T("没注册组件吧?") );
7
8 hr = spUnk.QueryInterface( &spFun );
9 if( FAILED( hr ) ) throw( _T("居然没有接口") );
10
11 long nSum;
12 hr = spFun->Add( 1, 2, &nSum );
13 if( SUCCEEDED( hr ) )
14 {
15 CString sMsg;
16 sMsg.Format( _T("1 + 2 = %d"), nSum );
17 AfxMessageBox( sMsg );
18 }
19
5,使用CComQIPtr,自动调用QueryInterface.
Code
也可以采用如下方法使用CComQIPtr,而不经过CComPtr<IUnknown>:
Code
posted on 2009-10-29 10:19 Joshua Leung 阅读(265) 评论(0) 编辑 收藏 举报