blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理

我可以给你例子,是关于_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);
}

posted on 2005-11-11 11:44  henry  阅读(1528)  评论(0编辑  收藏  举报