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 }

3,常规接口调用方法.

ContractedBlock.gifExpandedBlockStart.gifCode
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( 12&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( 12&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.

ContractedBlock.gifExpandedBlockStart.gifCode
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( 12&nSum );
if( SUCCEEDED( hr ) )
{
    CString sMsg;
    sMsg.Format( _T(
"1 + 2 = %d"), nSum );
    AfxMessageBox( sMsg );
}

    也可以采用如下方法使用CComQIPtr,而不经过CComPtr<IUnknown>:

ContractedBlock.gifExpandedBlockStart.gifCode
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( 12&nSum );
if( SUCCEEDED( hr ) )
{
    CString sMsg;
    sMsg.Format( _T(
"1 + 2 = %d"), nSum );
    AfxMessageBox( sMsg );
}

 

转载于:https://www.cnblogs.com/cmleung/archive/2009/10/29/1591910.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值