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.gif ExpandedBlockStart.gif 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( 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(  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.

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

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

ContractedBlock.gif ExpandedBlockStart.gif 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( 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值