zoukankan      html  css  js  c++  java
  • 【转】MFC 各类型相互转换

    MFC下的常用字符串数据类型表示的含义:

    L:Long  长  P:Point  指针  C:Const  常量  W:Wchar_t  宽字符  T:TCHAR   STR:String  字符串

    在看看MFC下各种数据类型的定义:

        typedef char *LPSTR;
        typedef const char *LPCSTR;
    
        typedef wchar_t *LPWSTR; 
        typedef const wchar_t *LPCWSTR; 
        typedef wchar_t WCHAR;
    
    #ifdef  UNICODE 
        typedef LPCWSTR  LPCTSTR;
        typedef WCHAR TCHAR;
    
    #else
        typedef LPCSTR LPCTSTR;
        typedef char TCHAR;

    MFC下提供的ATL 转换宏:

    T2A  T2W  T2CA T2CW         W2A  W2CA W2T  W2CT         A2W  A2CW A2T  A2CT 

    T:TCHAR  2:To  C:CONST  A:CHAR(ANSI)  W:WCHAR

    先到atlconv.h头文件下看看这些宏的定义,

    1.USES_CONVERSION:注意int _convert; (_convert);这种用法是为了屏蔽编译器的警告:未引用的局部变量。。。

    #ifndef _DEBUG
    #define USES_CONVERSION int _convert; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw; (_lpw); LPCSTR _lpa; (_lpa)
    #else
    #define USES_CONVERSION int _convert = 0; (_convert); UINT _acp = ATL::_AtlGetConversionACP() /*CP_THREAD_ACP*/; (_acp); LPCWSTR _lpw = NULL; (_lpw); LPCSTR _lpa = NULL; (_lpa)
    #endif

    可见,USES_CONVERSION宏定义了一些转换所需要的变量,如_convert。所以使用那些宏的时候必须加上该宏。

    2.A2W:这里就用到了USES_CONVERSION宏定义的_convert变量

    #define A2W(lpa) (
     ((_lpa = lpa) == NULL) ? NULL : (
     _convert = (lstrlenA(_lpa)+1),
     (INT_MAX/2<_convert)? NULL :  
     ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))

    3.ATLA2WHELPER

    #define ATLA2WHELPER AtlA2WHelper

    4.AtlA2WHelper:实际上还是在调用MultiByteToWideChar,即多字节转换为宽字节

    _Ret_opt_z_cap_(nChars) inline LPWSTR WINAPI AtlA2WHelper(_Out_z_cap_(nChars) LPWSTR lpw, _In_z_ LPCSTR lpa, _In_ int nChars, _In_ UINT acp) throw()
     {
      ATLASSERT(lpa != NULL);
      ATLASSERT(lpw != NULL);
      if (lpw == NULL || lpa == NULL)
       return NULL;
      *lpw = '';
      int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);
      if(ret == 0)
      {
       ATLASSERT(FALSE);
       return NULL;
      }  
      return lpw;
     }

    5.alloca

    #define alloca  _alloca

    6._alloca:该函数从堆上分配以字节为单位的内存,返回void *

    void *_alloca( 
     size_t size 
     );

    使用方法举例:

    USES_CONVERSION;//USES_CONVERSION是ATL中的一个宏定义,用于编码转换,它定义了转换宏所需的一些局部变量
    
     WCHAR *pWch = L"WCHAR* TO CHAR*";
     CHAR *pCh = W2A(pWch);
     
     TCHAR *pTch = _T("TCHAR* TO CHAR*");
     CHAR *pCh2 = T2A(pTch);

    使用USES_CONVERSION一定要小心,它们从堆栈上分配内存,直到调用它的函数返回,该内存不会被释放。如果在一个循环中,这个宏被反复调用几万次,将不可避免的产生stackoverflow。

    但是考虑到栈空间的尺寸( 默认2M),使用时要注意几点:     1、只适合于进行短字符串的转换;     2、不要试图在一个次数比较多的循环体内进行转换;     3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;     4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();

      参见http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html

        5、将字符转换封装到函数里面

    void DoA2W()
    {
         USES_CONVERSION;
         DoSomething(A2W("SomeString"));
    }

    除此之外,还可以使用C语言<stdlib.h>提供的函数:

    char * pstr = "abc";
    
        size_t nLen = _mbstrlen(pstr) + 1;
        //也可以用mbstowcs(NULL, pstr, 0);,第一个和第三个参数为空即得到非空字符的长度
        
        wchar_t * pwstr = new wchar_t[nLen];
        mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string
    
        size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)
        char *pstr2 = new char[nwLen];
        wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string
    
        delete []pwstr;
        pwstr = NULL;
    
        delete []pstr2;
        pstr2 = NULL;

    原文地址:http://www.cnblogs.com/wind-net/archive/2012/10/31/2746995.html

  • 相关阅读:
    递归函数及Java范例
    笔记本的硬盘坏了
    “References to generic type List should be parameterized”
    配置管理软件(configuration management software)介绍
    WinCE文件目录定制及内存调整
    使用Silverlight for Embedded开发绚丽的界面(3)
    wince国际化语言支持
    Eclipse IDE for Java EE Developers 与Eclipse Classic 区别
    WinCE Heartbeat Message的实现
    使用Silverlight for Embedded开发绚丽的界面(2)
  • 原文地址:https://www.cnblogs.com/mqxs/p/3473350.html
Copyright © 2011-2022 走看看