COM 数据类型使用总结

1。基本类型
全是小写的字符表示。

包括:boolean, byte, small, short, long, hyper, float, double, char, wchar_t, enum, 接口指针。这些类型我们并不陌生。


2。OLECHAR类型
这是COM中的字符类型。例如:HRESULT Method([in,string] const OLECHAR* pwsz);"string"属性表示pwsz是个OLECHAR数组。
在WIN32/Solaris平台上OLECHAR只是简单地被定义为wchar_t类型。
我们可以通过COM提供的宏OLESTR把一个普通的字符串转换为OLECHAR*类型:const OLECHAR *pwsz = OLESTR("Hello")。


3。BSTR
BSTR是一个LENGTH-PREFIXED,NULL-TERMINATED的OLECHAR字符串。
在JAVA,VB中使用的COM接口文本参数都是BSTR类型。

BSTR的内存管理问题:COM提供了若干API用于分配释放BSTR内存,包括:


  //分配和初始一个BSTR
      BSTR   SysAllocString(const   OLECHAR*   psz);
      BSTR   SysAllocStringLen(const   OLECHAR*   psz,UINT   cch);
     
      //重分配和初始化一个BSTR
      INT   SysAllocString(BSTR*   pbstr,const   OLECHAR*   psz);
      INT   SysReAllocStrinLen(BSTR*   pbstr,const   OLECHAR*   psz,UINT   cch);

      //释放一个BSTR
      void   SysFreeString(BSTR   bstr);

      //将 "length-prefix "转换为字符或byte
      UINT   SysStringLen(BSTR   bstr);
      UINT   SysStringByteLen(BSTR   bstr);

2.   _bstr_t和CComBSTR都是编译器封装类,都是为了更好地使用BSTR

3.   CString封装的字符串类型和_bstr_t,CComBSTR是不同的.


STR的内存由谁分配:若BSTR作为接口方法的传入参数,则调用方负责分配和释放;若作为传出参数,则接口对象负责分配,调用方负责释放。
当BSTR作为传入参数时,可采用以下类似前面_U,_UNCC的_UBSTR类来简化代码:


    BSTR state = {0};
    
char *pSate=NULL;
    ........

        spHtmlDoc->get_readyState(&state); 
        pSate = _com_util::ConvertBSTRToString(state);
        
if(strcmp(pSate,"complete")==0//检测下状态
        {
            
        }
        
else
        {
            
return;
        }
4。VARIANT, VARIANTARG
    VARIANT是个UNION类型,它容纳前面提到的基本类型中的一个子集类型,具体支持哪个类型由对应的鉴别器指定,如VT_I2对应short类型。
    VARIANTARG作为方法参数,VARIANT作为方法结果,但是两个是同一个联合,仅仅名称不同而已。


        VARIANT   varindex,varresult;  
        varresult.vt=VT_DISPATCH;   
        varindex.vt   =   VT_I4;
        
        varindex.lVal = 
0;


        VARIANT vName;
        VARIANT vIndex;
        vName.vt = VT_BSTR;
        vIndex.vt = VT_I4;
        vIndex.intVal = 
0;
        BSTR bstrName;
        CString strName=_T(
"dttl");
        vName.bstrVal = strName.AllocSysString();




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值