全是小写的字符表示。
包括: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();