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
IUnknown * pUnk = NULL;
IFun * pFun = NULL;
HRESULT hr;
try{
hr = ::CoCreateInstance(
CLSID_Fun,
NULL,
CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
IID_IUnknown, // 想取得 IUnknown 接口指针
(LPVOID *) &pUnk);
if( FAILED( hr ) )throw( _T("没注册吧?") );
hr = pUnk->QueryInterface( // 从 IUnknown 得到其它接口指针
IID_IFun, // 想取得 IFun 接口指针
(LPVOID *)&pFun );
if( FAILED( hr ) ) throw( _T("居然没有接口?") );
long nSum;
hr = pFun->Add( 1, 2, &nSum ); // IFun::Add()
if( FAILED( hr ) ){
//
}
}catch(LPCSTR msg){
//
}
if( pUnk ) pUnk->Release();
if( pFun ) pFun->Release();
IUnknown * pUnk = NULL;
IFun * pFun = NULL;
HRESULT hr;
try{
hr = ::CoCreateInstance(
CLSID_Fun,
NULL,
CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
IID_IUnknown, // 想取得 IUnknown 接口指针
(LPVOID *) &pUnk);
if( FAILED( hr ) )throw( _T("没注册吧?") );
hr = pUnk->QueryInterface( // 从 IUnknown 得到其它接口指针
IID_IFun, // 想取得 IFun 接口指针
(LPVOID *)&pFun );
if( FAILED( hr ) ) throw( _T("居然没有接口?") );
long nSum;
hr = pFun->Add( 1, 2, &nSum ); // IFun::Add()
if( FAILED( hr ) ){
//
}
}catch(LPCSTR msg){
//
}
if( pUnk ) pUnk->Release();
if( pFun ) pFun->Release();
记得最后要释放接口指针.在上例中可以直接指定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
CComPtr < IUnknown > spUnk; // 定义 IUnknown 的智能指针
CComQIPtr < IFun > spFun; // 定义 IFun 的智能指针
HRESULT hr;
// 使用 ProgID 启动组件
hr = spUnk.CoCreateInstance( L"Simple1.fun.1" );
if( FAILED( hr ) ) throw( _T("没注册组件吧?") );
spFun = spUnk; // CComQIPtr 会帮咱们自动调用 QueryInterface
if( !spFun ) throw( _T("居然没有接口") ); // 成功与否,可以用非 NULL 判断
long nSum;
hr = spFun->Add( 1, 2, &nSum );
if( SUCCEEDED( hr ) )
{
CString sMsg;
sMsg.Format( _T("1 + 2 = %d"), nSum );
AfxMessageBox( sMsg );
}
CComPtr < IUnknown > spUnk; // 定义 IUnknown 的智能指针
CComQIPtr < IFun > spFun; // 定义 IFun 的智能指针
HRESULT hr;
// 使用 ProgID 启动组件
hr = spUnk.CoCreateInstance( L"Simple1.fun.1" );
if( FAILED( hr ) ) throw( _T("没注册组件吧?") );
spFun = spUnk; // CComQIPtr 会帮咱们自动调用 QueryInterface
if( !spFun ) throw( _T("居然没有接口") ); // 成功与否,可以用非 NULL 判断
long nSum;
hr = spFun->Add( 1, 2, &nSum );
if( SUCCEEDED( hr ) )
{
CString sMsg;
sMsg.Format( _T("1 + 2 = %d"), nSum );
AfxMessageBox( sMsg );
}
也可以采用如下方法使用CComQIPtr,而不经过CComPtr<IUnknown>:
Code
CComQIPtr < IFun, &IID_IFun > spFun; // 定义 IFun 的智能指针
HRESULT hr;
hr = spFun.CoCreateInstance( L"Simple1.fun.1" );
if( FAILED( hr ) ) throw( _T("没注册组件或没有接口?") );
long nSum;
hr = spFun->Add( 1, 2, &nSum );
if( SUCCEEDED( hr ) )
{
CString sMsg;
sMsg.Format( _T("1 + 2 = %d"), nSum );
AfxMessageBox( sMsg );
}
CComQIPtr < IFun, &IID_IFun > spFun; // 定义 IFun 的智能指针
HRESULT hr;
hr = spFun.CoCreateInstance( L"Simple1.fun.1" );
if( FAILED( hr ) ) throw( _T("没注册组件或没有接口?") );
long nSum;
hr = spFun->Add( 1, 2, &nSum );
if( SUCCEEDED( hr ) )
{
CString sMsg;
sMsg.Format( _T("1 + 2 = %d"), nSum );
AfxMessageBox( sMsg );
}