com接口传入的参数除了基本的非指针类型(如ing ,long ,bool等),其余的都要使用com特定的类型 --
对于字符串,应该使用BSTR类型,这种类型是一种模糊类型,微软并没有公开内部结构,所有必须使用支持的API去操纵它
其他的还有VARIANT, SAFEARRAY等类型,可以参考资料( ATL或者 VC开发COM组件方面的资料),此处不多说了
给你一段代码吧,将传入的字符串变成大写返回:
接口定义为
[id(1), helpstring("method Upper")] HRESULT Upper([in] BSTR inStr,[out ,retval] BSTR *outStr);
实现代码为
STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr)
{
/*
相关类型转换:
从BSTR字符串转换到Unicode字符串(例如LPOLESTR)不是必须的,即不需要转换,可以当作一个Unicode字符串使用
从Unicode字符串转换到BSTR字符串必须经过相应的API函数 SysAllocString。
从标准C的字符串转换到Unicode字符串需要使用MultiByteToWideChar函数。
从Unicode字符串转换到标准C的字符串需要使用WideCharToMultiByte函数。
总结:由此可见,使用Unicode字符串当作中介,则可以在标准C的字符串和BSTR字符串之间相互转换!
函数流程:
将传入的字符串 inStr通过转换函数转换成相应的标准C字符串 szInStr,通过标准C的大写转换函数将szInStr转换成大写。
将szInStr通过转换函数转换成BSTR字符串 outStr,作为返回值输出
补 充:
从C标准字符串转换到BSTR字符串,如果在ATL中使用类 CComBSTR,则转换可以相当简化,只需要一行代码
//Convert from char * to BSTR
//CComBSTR bstrString(szStdString);
//Done!!
*/
//以下是不使用 ATL 中的 类,直接使用 API 的方法
//
//得到字符串的长度
//
long nLen = WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
char * szInStr = new char[nLen];
//从 Unicode字符串 转换成 C标准字符串
//
WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
szInStr = strupr(szInStr);
//处理多字符集的最安全的函数是 lstrlen(而不是strlen)
//
nLen = lstrlen(szInStr) + 1; //加 1 的原因是要加上2个结尾为NULL的字符(下一步将乘2使之加倍)
int nAlloc = 2 * nLen;
//分配空间给 Unicode字符串
//
LPOLESTR szNewOleString;
szNewOleString = (OLECHAR *)new wchar_t[nAlloc];
//转换 C标准字符串到 Unicode 字符串
//
MultiByteToWideChar(CP_ACP , 0, szInStr, -1,zNewOleString,nLen); //注意这里是nLen,而不是nAlloc!!
//从 Unicode字符串 转换到 BSTR字符串
BSTR bstrTemp;
bstrTemp = SysAllocString( szNewOleString);
*outStr = bstrTemp;
return S_OK;
}
//以下为按照补充中说明的使用 CComBSTR类 方法的代码:
//
long nLen = WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
char * szInStr = new char[nLen];
WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
szInStr = strupr(szInStr);
MessageBox(NULL,szInStr,"",MB_OK);
//从 C标准字符串 直接转换到 BSTR字符串
CComBSTR bstrTemp2(szInStr);
*outStr = bstrTemp2.Detach();