• 移植性问题のCString与LPCWSTR、LPSTR、char*、LPWSTR等类型的转换


    一.CString与LPCWSTR

    两者的不同:LPCWSTR 是Unicode字符串指针,初始化时串有多大,申请空间就有多大,以后存贮若超过则出现无法预料的结果,这是它与CString的不同之处。而CString是一个串类,内存空间类会自动管理。

    CString转换成LPCWSTR

    方法一:CString strFileName;

    LPCWSTR lpcwStr = strFileName.AllocSysString();

    方法二:CString str=_T("TestStr");
    USES_CONVERSION;
    LPCWSTR lpcwStr = A2CW((LPCSTR)str);

    MFC中CString和LPSTR是可以通用,其中A2CW表示(LPCSTR) -> (LPCWSTR),USER_CONVERSION表示用来定义一些中间变量,在使用ATL的转换宏之前必须定义该语句。

    LPCWSTR转换成CString

    LPCWSTR lpcwStr = L"TestWStr";
    CString str(lpcwStr);

    二.CString与LPSTR转换

    CString转换成LPSTR:

    方法一:CString strFileName;

    LPSTR lpStr = strFileName.GetBuffer();

    strFileName.ReleaseBuffer();

    方法二:CString strFileName;

    LPSTR lpStr = (LPSTR)(LPCSTR)strFimeName;

    LPSTR转换成CString:

    LPSTR lpStr = L"TestStr";
    CString str(lpStr);

    注意:CString和LPCSTR可直接转换,如下:

    CString str;

    LPCSTR lpcStr = (LPCSTR)str;

    三.CString和char*转换
    CString转换成char*
    方法一:CString str;
    char* p = str.GetBuffer();
    方法二:CString str;
    char* p = (LPSTR)(LPCSTR)str;
    char*转换成CString
    char* p = "test";
    CString str = ("%s",p);

    四.String和int、float的转换

    可以使用atoi,atof,atol等函数来完成。

    五.LPSTR(char*)和LPWSTR的转换

    可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。

    ATL宏介绍:

    A2BSTR OLE2A T2A W2A
    A2COLE OLE2BSTR T2BSTR W2BSTR
    A2CT OLE2CA T2CA W2CA
    A2CW OLE2CT T2COLE W2COLE
    A2OLE OLE2CW T2CW W2CT
    A2T OLE2T T2OLE W2OLE
    A2W OLE2W T2W W2T

    A :ANSI 字符串,也就是 MBCS。
    W、OLE 宽字符串,也就是 UNICODE。
    T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
    C const 的缩写

    利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:

    1、只适合于进行短字符串的转换;
    2、不要试图在一个次数比较多的循环体内进行转换;
    3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
    4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

    void Func1(LPSTR lpStr);

    void Func2(LPWSTR lpwStr);

    TCHAR name[256];

    TCHAR* pName = new TCHAR[256];

    Func1(name); // Func1(pName);

    Func2(name); // Func2(pName);

    注意在VS2005中上面用红色标记的代码已经不成立。

    VS2005中CString已经改为宽字符型,一些转换如下:

    char name[10];
    TCHAR sex[5] ;
    char *p = name;
    TCHAR *pw = sex;

    LPSTR lpstr = name;
    LPCSTR lpcstr = name;
    lpcstr = lpstr;

    lpstr = p;
    p = (char*)sex;
    pw = (WCHAR*)name;
    LPWSTR lpwstr = (LPWSTR)lpstr;
    lpwstr = (LPWSTR)lpcstr;
    LPCWSTR lpcwstr = (LPCWSTR)lpstr;
    lpcwstr = (LPCWSTR)name;

    CString str(lpstr);
    CString str1(lpcstr);
    CString str2(lpwstr);
    CString str3(lpcwstr);
    CString str4(name);
    CString str5(sex);

    lpwstr = (LPWSTR)(LPCWSTR)str;
    lpstr = (LPSTR)(LPCWSTR)str;
    lpcstr = (LPCSTR)(LPCWSTR)str;

    p = (char*)str.GetBuffer();
    pw = str.GetBuffer();

    可以看出转换更加简单了,基本上可以直接转换,A2W等宏基本上不需要啦。

     

  • 相关阅读:
    很久没有写代码日记了。
    Bundle数据类型
    8-18 缓存垃圾清理
    关于 printf
    强制类型转换/隐式类型转换
    JAVA文件扫描(递归)
    字符串
    8-17 安卓内存清理
    【11-29】excel reader
    orale 乱码
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2348594.html
Copyright © 2020-2023  润新知