我可以给你例子,是关于_variant_t和BSTR的,大部分的数据类型已经被包括。
暂时贴一点给你看:
如何互相转换 BSTR 和 标准C字符串
以下代码是用在我的一个Com组件中的,原理可以借鉴:
STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr)
{
/*
要 求:
com接口传入的参数除了基本的非指针类型(如ing ,long ,bool等),其余的都要使用com特定的类型 --
对于字符串,应该使用BSTR类型,这种类型是一种模糊类型,微软并没有公开内部结构,所有必须使用支持的API去操纵它
其他的还有VARIANT, SAFEARRAY等类型,可以参考资料( ATL或者 VC开发COM组件方面的资料),此处不多说了
相关类型转换:
从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);
MessageBox(NULL,szInStr,"",MB_OK);
//处理多字符集的最安全的函数是 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, szNewOleString ,nLen); //注意这里是nLen,而不是nAlloc!!
//从 Unicode字符串 转换到 BSTR字符串
BSTR bstrTemp;
bstrTemp = SysAllocString( szNewOleString);
*outStr = bstrTemp;
---------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------
//以下为按照补充中说明的使用 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();
-----------------------------------------------------------------------------------------*/
return S_OK;
}
下面是另外一些代码,演示_variant_t到字符串的转换:
/*
将 _variant_t 类型的变量,转换成字符串(如果是数字,则转换成数字对应的字符串 :如 10.2 -> "10.200000", 如果是逻辑变量,则转换成字符串"TRUE","FALSE")
*/
_variant_t var;
CString str; //转换以后的字符串
//以下代码演示如何转换为C标准字符串型
if (var.vt == VT_I4)
{
long lNum;
char szCh[21];
str=var.bstrVal;
WideCharToMultiByte
(CP_ACP, 0, var.bstrVal, -1,
szCh, sizeof(szCh), NULL, NULL);
}
//以下代码演示如何转换成逻辑型
if( var.vt == VT_BOOL)
{
BOOL bVar;
lNum=var.lVal;
bVar= var.boolVar==0? FALSE : TRUE;
}
//以下代码演示为其余类型(补充)
switch(var.vt)
{
case VT_BSTR: //var is BSTR type
str=var.bstrVal;
break;
case VT_I2: //var is short int type
str.Format("%d",(int)var.iVal);
break;
case VT_I4: //var is long int type
str.Format("%d",var.lVal);
break;
case VT_R4: //var is float type
str.Format("%10.6f",(double)var.fltVal);
break;
case VT_R8: //var is double type
str.Format("%10.6f",var.dblVal);
break;
case VT_CY: //var is CY type
str=COleCurrency(var).Format();
break;
case VT_DATE: //var is DATE type
str=COleDateTime(var).Format();
break;
case VT_BOOL: //var is VARIANT_BOOL
str= (var.boolVal==0) ?"FALSE": "TRUE";
break;
default:
str.Format("Unk type %d/n",var.vt);
TRACE("Unknown type %d/n",var.vt);
}
http://www.cnblogs.com/henryzc/archive/2005/11/11/273874.html