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

  • 相关阅读:
    10 个十分难得的 javascript 开发经验
    牛人推荐的跨浏览器兼容性总结
    不可不看!CSS3中三十一种选择器用法
    jQuery制作鼠标经过显示图片大图,生成图片tips效果
    解决IE6中 PNG图片透明的终极方案-八种方案!
    关于JavaScript代码的执行效率总结
    【我们开发有力量之二】利用javascript制作批量网络投票机器人(自动改IP)
    网页制作中最有用的免费Ajax和JavaScript代码库
    纯javascript代码实现浏览器图片选择预览、旋转、批量上传
    悲催的IE6 七宗罪大吐槽(带解决方法)第二部分
  • 原文地址:https://www.cnblogs.com/mqxs/p/3473350.html
Copyright © 2011-2022 走看看