• [转]VC数据类型转换


     

    int i = 100;
    long l = 2001;
    float f=300.2;
    double d=12345.119;
    char username[]="
    程佩";
    char temp[200];
    char *buf;
    CString str;
    _variant_t v1;
    _bstr_t v2;
    一、其它数据类型转换为字符串
    1.   
    短整型(int)
    itoa(i,temp,10);///
    i转换为字符串放入temp,最后一个数字表示十进制
    itoa(i,temp,2); ///
    按二进制方式转换
    2.   
    长整型(long)
    ltoa(l,temp,10);
    3.   
    浮点数(float,double)
    fcvt可以完成转换,这是MSDN中的例子:
    int decimal, sign;
    char *buffer;
    double source = 3.1415926535;
    buffer = _fcvt( source, 7, &decimal, &sign );
    运行结果:source: 3.1415926535 buffer: '31415927' decimal: 1 sign: 0
    decimal
    表示小数点的位置,sign表示符号:0为正数,1为负数
    4.   CString
    变量
    str = "2008
    北京奥运";
    buf = (LPSTR)(LPCTSTR)str;
    5.  BSTR
    变量
    BSTR bstrValue = ::SysAllocString(L"
    程序员");
    char * buf = _com_util::ConvertBSTRToString(bstrValue);
    SysFreeString(bstrValue);
    AfxMessageBox(buf);
    delete(buf);
    6.   CComBSTR
    变量
    CComBSTR bstrVar("test");
    char *buf = _com_util::ConvertBSTRToString(bstrVar.m_str);
    AfxMessageBox(buf);
    delete(buf);
    7.  _bstr_t
    变量
    _bstr_t
    类型是对BSTR的封装,因为已经重载了=操作符,所以很容易使用
    _bstr_t bstrVar("test");
    const char *buf = bstrVar;///
    不要修改buf中的内容
    AfxMessageBox(buf);
    8.   
    通用方法(针对非COM数据类型)
    sprintf完成转换

      char  buffer[200];

      char  c = '1';

    int   i = 35;

    long  j = 1000;

     float f = 1.7320534f;

    sprintf( buffer, "%c",c);

     sprintf( buffer, "%d",i);

     sprintf( buffer, "%d",j);

     sprintf( buffer, "%f",f);
    二、字符串转换为其它数据类型
    strcpy(temp,"123");
    1.   
    短整型(int)
    i = atoi(temp);
    2.  
    长整型(long)
    l = atol(temp);
    3.   
    浮点(double)
    d = atof(temp);
    4.   CString
    变量
    CString name = temp;
    5.   BSTR
    变量
    BSTR bstrValue = ::SysAllocString(L"
    程序员");

     ///完成对bstrValue的使用
    ... SysFreeString(bstrValue);
    6.    CComBSTR
    变量
    CComBSTR
    类型变量可以直接赋值
    CComBSTR bstrVar1("test");
    CComBSTR bstrVar2(temp);
    7. _bstr_t
    变量
    _bstr_t
    类型的变量可以直接赋值
    _bstr_t bstrVar1("test");
    _bstr_t bstrVar2(temp);
    三、其它数据类型转换到CString
    使用CString的成员函数Format来转换,例如:
    1.   
    整数(int)
    str.Format("%d",i);
    2.   
    浮点数(float)
    str.Format("%f",i);
    3.  
    字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值
    str = username;
    4.   
    对于Format所不支持的数据类型,可以通过上面所说的关于其它数据类型转化到char *的方法先转到char *,然后赋值给CString变量。
    四、BSTR_bstr_tCComBSTR
    1.   CComBSTR
    ATLBSTR的封装,_bstr_tC++BSTR的封装,BSTR32位指针,但并不直接指向字串的缓冲区。
    char *
    转换到BSTR可以这样:
    BSTR b=_com_util::ConvertStringToBSTR("
    数据");///使用前需要加上comutil.hcomsupp.lib
    SysFreeString(bstrValue);
    反之可以使用
    char *p=_com_util::ConvertBSTRToString(b);
    delete p;
    具体可以参考一,二段落里的具体说明。

    CComBSTR
    _bstr_t对大量的操作符进行了重载,可以直接进行=,!=,==等操作,所以使用非常方便。
    特别是_bstr_t,建议大家使用它。

     

    CString str;
    char temp[200];

    bool value_bool;

    float float_value_max;

    DATE  datetime_value_time_max;

    //bool to string
    str=(value_bool?"1":"0");

    //float to string
    sprintf( temp, "%f",float_value_max);
    str=temp;

    //datetime to string
    CTime   valueTime   = datetime_value_time_max;//  CTime::GetCurrentTime();
    str =   valueTime.Format( "%Y-%m-%d %H:%M:%S");

     

    //_bstr_t to CString

    CString   m_str   =   (char   *)your_bstr_t_string


    五、VARIANT _variant_t COleVariant
    1.    VARIANT
    的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
    对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
    VARIANT va;
    int a=2001;
    va.vt=VT_I4;///
    指明整型数据
    va.lVal=a; ///
    赋值

    对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:
    Byte bVal;     // VT_UI1.
    Short iVal;     // VT_I2.
    long lVal;     // VT_I4.
    float fltVal;     // VT_R4.
    double dblVal;     // VT_R8.
    VARIANT_BOOL boolVal;     // VT_BOOL.
    SCODE scode;     // VT_ERROR.
    CY cyVal;     // VT_CY.
    DATE date;     // VT_DATE.
    BSTR bstrVal;     // VT_BSTR.
    DECIMAL FAR* pdecVal     // VT_BYREF|VT_DECIMAL.
    IUnknown FAR* punkVal;     // VT_UNKNOWN.
    IDispatch FAR* pdispVal;     // VT_DISPATCH.
    SAFEARRAY FAR* parray;     // VT_ARRAY|*.
    Byte FAR* pbVal;     // VT_BYREF|VT_UI1.
    short FAR* piVal;     // VT_BYREF|VT_I2.
    long FAR* plVal;     // VT_BYREF|VT_I4.
    float FAR* pfltVal;     // VT_BYREF|VT_R4.
    double FAR* pdblVal;     // VT_BYREF|VT_R8.
    VARIANT_BOOL FAR* pboolVal;     // VT_BYREF|VT_BOOL.
    SCODE FAR* pscode;     // VT_BYREF|VT_ERROR.
    CY FAR* pcyVal;     // VT_BYREF|VT_CY.
    DATE FAR* pdate;     // VT_BYREF|VT_DATE.
    BSTR FAR* pbstrVal;     // VT_BYREF|VT_BSTR.
    IUnknown FAR* FAR* ppunkVal;     // VT_BYREF|VT_UNKNOWN.
    IDispatch FAR* FAR* ppdispVal;     // VT_BYREF|VT_DISPATCH.
    SAFEARRAY FAR* FAR* pparray;     // VT_ARRAY|*.
    VARIANT FAR* pvarVal;     // VT_BYREF|VT_VARIANT.
    void FAR* byref;     // Generic ByRef.
    char cVal;     // VT_I1.
    unsigned short uiVal;     // VT_UI2.
    unsigned long ulVal;     // VT_UI4.
    int intVal;     // VT_INT.
    unsigned int uintVal;     // VT_UINT.
    char FAR * pcVal;     // VT_BYREF|VT_I1.
    unsigned short FAR * puiVal;     // VT_BYREF|VT_UI2.
    unsigned long FAR * pulVal;     // VT_BYREF|VT_UI4.
    int FAR * pintVal;     // VT_BYREF|VT_INT.
    unsigned int FAR * puintVal;     //VT_BYREF|VT_UINT. 
    2.   _variant_t
    VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
    使用时需加上#include <comdef.h>
    例如:
    long l=222;
    ing i=100;
    _variant_t lVal(l);
    lVal = (long)i;
    2.1   COleVariant
    的使用与_variant_t的方法基本一样,请参考如下例子:
    COleVariant v3 = "
    字符串", v4 = (long)1999;
    CString str =(BSTR)v3.pbstrVal;
    long i = v4.lVal;
    六、其它一些COM数据类型
    1. 
    根据ProgID得到CLSID
    HRESULT CLSIDFromProgID( LPCOLESTR lpszProgID,LPCLSID pclsid);
    CLSID clsid;
    CLSIDFromProgID( L"MAPI.Folder",&clsid);
    2.    
    根据CLSID得到ProgID
    WINOLEAPI ProgIDFromCLSID( REFCLSID clsid,LPOLESTR * lplpszProgID);
    例如我们已经定义了 CLSID_IApplication,下面的代码得到ProgID
    LPOLESTR pProgID = 0;
    ProgIDFromCLSID( CLSID_IApplication,&pProgID);
    ...///
    可以使用pProgID
    CoTaskMemFree(pProgID);//
    不要忘记释放
    七、ANSIUnicode
    Unicode
    称为宽字符型字串,COM里使用的都是Unicode字符串。
    1.   
    ANSI转换到Unicode
    (1)
    通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
    (2)
    通过MultiByteToWideChar函数实现转换,例如:
    char *szProgID = "MAPI.Folder";
    WCHAR szWideProgID[128];
    CLSID clsid;
    long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
    szWideProgID[lLen] = '\0';
    (3)
    通过A2W宏来实现,例如:
    USES_CONVERSION;
    CLSIDFromProgID( A2W(szProgID),&clsid);
    2.   
    Unicode转换到ANSI
    (1)
    使用WideCharToMultiByte,例如:
    //
    假设已经有了一个Unicode wszSomeString...
    char szANSIString [MAX_PATH];
    WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
    (2)
    使用W2A宏来实现,例如:
    USES_CONVERSION;
    pTemp=W2A(wszSomeString);
    八、其它
    1.  
    对消息的处理中我们经常需要将WPARAMLPARAM32位数据(DWORD)分解成两个16位数据(WORD),例如:
    LPARAM lParam;
    WORD loValue = LOWORD(lParam);///
    取低16
    WORD hiValue = HIWORD(lParam);///
    取高16
    2.   
    对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
    WORD wValue;
    BYTE loValue = LOBYTE(wValue);///
    取低8
    BYTE hiValue = HIBYTE(wValue);///
    取高8
    3.   
    两个16位数据(WORD)合成32位数据(DWORD,LRESULT,LPARAM,WPARAM)
    LONG MAKELONG( WORD wLow, WORD wHigh );
    WPARAM MAKEWPARAM( WORD wLow, WORD wHigh );
    LPARAM MAKELPARAM( WORD wLow, WORD wHigh );
    LRESULT MAKELRESULT( WORD wLow, WORD wHigh );
    4.  
    两个8位的数据(BYTE)合成16位的数据(WORD)
    WORD MAKEWORD( BYTE bLow, BYTE bHigh );
    5.  
    R(red),G(green),B(blue)三色得到COLORREF类型的颜色值
    COLORREF RGB( BYTE byRed,BYTE byGreen,BYTE byBlue );
    例如COLORREF bkcolor = RGB(0x22,0x98,0x34);
    6.  
    COLORREF类型的颜色值得到RGB三个颜色值
    BYTE Red = GetRValue(bkcolor); ///
    得到红颜色
    BYTE Green = GetGValue(bkcolor); ///
    得到绿颜色
    BYTE Blue = GetBValue(bkcolor); ///
    得到兰颜色
    九、注意事项
    假如需要使用到ConvertBSTRToString此类函数,需要加上头文件comutil.h,并在setting中加入comsupp.lib或者直接加上#pragma comment( lib, "comsupp.lib" )
    后记:本文匆匆写成,错误之处在所难免,欢迎指正.
    关于把BSTR类型数据转换成CString 类型数据时的问题?
    当我在把BSTR类型数据转换成CString “char* 类型数据时,发现在BSTR类型字符串较短的情况下没问题,当较长时就会出现
    内存读写错了。(在NT2000下都测试是这样的。)
    根据你所说:
    1
    )字符串指针(char *)等已经被CString构造函数支持的数据类型 可以直接赋值 str = username;
    2
    )当b BSTR类型时可以使用
    char *p=_com_util::ConvertBSTRToString(b);
    于是以下是对的:
    CString cstr;
    BSTR bstr;
    ....
    cstr=com_util::ConvertBSTRToString(bstr);
    ...
    可是当bstr非常大时(其实,较大时就会)就会出现内存读写错,不知何故。
    此外我发现cstr=com_util::ConvertBSTRToString(bstr);
    可以简化为 cstr=bstr; 但当bstr较大时同样出现这个问题。
    请兄弟帮忙!急。谢谢!
    如何转化((list*)fileip.bian)->liang
    关于把CString转化成LPCTSTR的问题 作者:jakiesun 发表日期:2001-9-5 20:08:48
    我记的我以前写过这样一段代码
    void function()
    {
    CString str,str1,str2;
    function((char*)(LPCTSTR)str1);
    str=str1;
    ...//
    调试道此发现str2的值随着str的改变而改变,请问能解释一下为什么,如有回答,请通知
    wangshaohong@sohu.com,tx


    }
    添加lib支持 作者:磨刀霍霍 发表日期:2001-9-10 11:32:12
    如果不添加会产生错误,在setting中加入comsupp.lib或者直接#pragma comment( lib, "comsupp.lib" )
    微软认为缺省的设置call convention如果不设置成__cdecl也会出现同样的错误。

    ====================================================================

     

    char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char;

    TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符

    #ifdef UNICODE
       typedef wchar_t TCHAR;
       #else
       typedef char TCHAR;
       #endif

    所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t.
    至于String,CString他们都是一种封装了字串处理的操作!
    你可以打开他们的源代码找寻究竟!
    CString属于VC的类库
    string是标准C++的类库
    string.h是C的库函数。

    研究它们的源代好些!

    TCHAR,char是可以同整型互换的类型。
    String,CString代表了一块内存区域。

    TCHAR 赋值

    #include <tchar.h>

    TCHAR szWindowText[256]=_T("QQ2006");

    char*、TCHAR*转换CString
    CString str(****)

    下面详细写一下其它转换

    view plaincopy to clipboardprint?
    /* *********************************************************************  
    * 函数: TransCStringToTCHAR  
    * 描述:将CString 转换为 TCHAR*  
    * 日期: 
    ***********************************************************************/ 
    TCHAR* CPublic::CString2TCHAR(CString &str)   
    {   
    int iLen = str.GetLength();   
    TCHAR* szRs = new TCHAR[iLen];   
    lstrcpy(szRs, str.GetBuffer(iLen));   
    str.ReleaseBuffer();   
    return szRs;   
    }  
    /* *********************************************************************
    * 函数: TransCStringToTCHAR
    * 描述:将CString 转换为 TCHAR*
    * 日期:
    ***********************************************************************/
    TCHAR* CPublic::CString2TCHAR(CString &str)
    {
    int iLen = str.GetLength();
    TCHAR* szRs = new TCHAR[iLen];
    lstrcpy(szRs, str.GetBuffer(iLen));
    str.ReleaseBuffer();
    return szRs;
    }

    view plaincopy to clipboardprint?
    /***********************************************************************  
    * 函数: THCAR2Char  
    * 描述:将TCHAR* 转换为 char*  
    * 日期: 
    ***********************************************************************  
    */   
    char* CPublic::THCAR2char(TCHAR* tchStr)   
    {   
    int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度   
    char* chRtn = new char[iLen+1]   
    wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值   
    return chRtn;   
    }  
    /***********************************************************************
    * 函数: THCAR2Char
    * 描述:将TCHAR* 转换为 char*
    * 日期:
    ***********************************************************************
    */
    char* CPublic::THCAR2char(TCHAR* tchStr)
    {
    int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度
    char* chRtn = new char[iLen+1]
    wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值
    return chRtn;
    }

    view plaincopy to clipboardprint?
    /*  
    ***********************************************************************  
    * 函数: CString2char  
    * 描述:将CString转换为 char*  
    * 日期: 
    ***********************************************************************  
    */   
    char* CPublic::CString2char(CString &str)   
    {   
    int len = str.GetLength();   
    char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度   
    memset(chRtn, 0, 2*len+1);   
    USES_CONVERSION;   
    strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));   
    return chRtn;   
    }  
    /*
    ***********************************************************************
    * 函数: CString2char
    * 描述:将CString转换为 char*
    * 日期:
    ***********************************************************************
    */
    char* CPublic::CString2char(CString &str)
    {
    int len = str.GetLength();
    char* chRtn = (char*)malloc((len*2+1)*sizeof(char));//CString的长度中汉字算一个长度
    memset(chRtn, 0, 2*len+1);
    USES_CONVERSION;
    strcpy((LPSTR)chRtn,OLE2A(str.LockBuffer()));
    return chRtn;
    }

    //参考
    ///////////////////////
    //Pocket PC上的UNICODE和ANSI字符串
    //By Vassili Philippov, September 26, 2001.
    //杨方思歧 译
    ////////////////////////
    view plaincopy to clipboardprint?
    /*  
    ***********************************************************************  
    * 函 数 名:GetAnsiString  
    * 描 述:将CString(unicode)转换为char*(ANSI)  
    * 参 数:CString &s 要转换的CString  
    * 返 回 值:返回转换结果  
    * 创建日期: 
    * 最后修改: 
    ***********************************************************************  
    */   
    char* GetAnsiString(const CString &s)   
    {   
    int nSize = 2*s.GetLength();   
    char *pAnsiString = new char[nSize+1];   
    wcstombs(pAnsiString, s, nSize+1);   
    return pAnsiString;   
    }

    本文来自CSDN博客:  http://blog.csdn.net/lsldd/archive/2009/08/05/4412531.aspx

    以下是自己调试中遇到的问题:

    /////////////在TCHAR*中存储的中文字符转换为char*时遇到的问题,

    TCHAR tszName[MAX_PATH]=TEXT("刘小猪");

    我一直认为求长度, 直接用 nLen = _tcslen(tszName)*sizeof(TCHAR);就可以了

    调试过程中发现, 转换过来的字符总是少一个汉字.不明白为什么.

    如果利用

    int nLen = WideCharToMultiByte(CP_ACP, 0, tszName, -1, NULL, 0, NULL, NULL);

    求出实际转换成char时的字符长度.

    再去分配实际需要的内存空间的话就没有问题了.

    char* pszName = new char[nLen*sizeof(char)];

    WideCharToMultiByte(CP_ACP, 0, tszName, -1, pszName, nLen, NULL, NULL);

    MultiByteToWideChar的使用:

    int nLen = MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, -1, NULL, 0);

    TCHAR* pWideChar = new TCHAR[nLen * sizeof(TCHAR)];

    MultiByteToWideChar(CP_ACP, 0, pMultiByteStr, -1, pWideChar, nLen);

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lxpspring/archive/2009/10/29/4745474.aspx


  • 相关阅读:
    用原生JS判断素(质)数,并找出100~1000之间的所有素(质)数
    用原生JS找出所有的水仙花数
    break、continue和return语句的区别
    用原生JS写16进制随机颜色
    JavaScript函数
    JavaScript数组
    JavaScript流程控制
    新的开始,新的历程
    异常处理
    DictionaryBase
  • 原文地址:https://www.cnblogs.com/furenjun/p/1654742.html
Copyright © 2020-2023  润新知