MFCでの各種文字列タイプと相互変換

10282 ワード


MFCにおける共通文字列データ型表現の意味:
L:Long長P:PointポインタC:Const定数W:Wchar_tワイド文字T:TCHAR STR:String文字列
MFCの下で各種のデータ型の定義を見ます:
 1     typedef char *LPSTR;

 2     typedef const char *LPCSTR;

 3 

 4     typedef wchar_t *LPWSTR; 

 5     typedef const wchar_t *LPCWSTR; 

 6     typedef wchar_t WCHAR;

 7 

 8 #ifdef  UNICODE 

 9     typedef LPCWSTR  LPCTSTR;

10     typedef WCHAR TCHAR;

11 

12 #else

13     typedef LPCSTR LPCTSTR;

14     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.A 2 W:ここでUSESを使いましたCONVERSIONマクロ定義の_convert変数
1 #define A2W(lpa) (\

2  ((_lpa = lpa) == NULL) ? NULL : (\

3  _convert = (lstrlenA(_lpa)+1),\

4  (INT_MAX/2<_convert)? NULL :  \

5  ATLA2WHELPER((LPWSTR) alloca(_convert*sizeof(WCHAR)), _lpa, _convert, _acp)))

3.ATLA2WHELPER
1  #define ATLA2WHELPER AtlA2WHelper

 
4.AtlA 2 WHElper:マルチバイトからワイドバイトへの変換という、実際にはMultiByteToWideCharが呼び出されています
 1  _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()

 2  {

 3   ATLASSERT(lpa != NULL);

 4   ATLASSERT(lpw != NULL);

 5   if (lpw == NULL || lpa == NULL)

 6    return NULL;

 7   *lpw = '\0';

 8   int ret = MultiByteToWideChar(acp, 0, lpa, -1, lpw, nChars);

 9   if(ret == 0)

10   {

11    ATLASSERT(FALSE);

12    return NULL;

13   }  

14   return lpw;

15  }

5.alloca
#define alloca  _alloca

6._alloca:この関数はスタックからバイト単位のメモリを割り当て、void*を返します.
1 void *_alloca( 

2   size_t size 

3   );

 
使用方法の例:
1  USES_CONVERSION;//USES_CONVERSION ATL       ,      ,                

2 

3  WCHAR *pWch = L"WCHAR* TO CHAR*";

4  CHAR *pCh = W2A(pWch);

5  

6  TCHAR *pTch = _T("TCHAR* TO CHAR*");

7  CHAR *pCh2 = T2A(pTch);

 
USESの使用CONVERSIONは、呼び出した関数が戻るまでスタックからメモリを割り当て、メモリが解放されないことに注意してください.1サイクルでこのマクロが数万回繰り返し呼び出されると、stackoverflowが発生することは避けられない.
しかしスタック空間のサイズを考慮すると(デフォルト2 M)使用時に注意すべき点:1、短い文字列の変換にのみ適していること、2、1回のサイクル内で変換しようとしないこと、3、文字型ファイルの内容を変換しようとしないこと、ファイルサイズが一般的に大きいこと、4、ケース2と3、MultiByteToWideChar()WideCharToMultiByte()と;
参照http://www.cnblogs.com/wind-net/archive/2012/10/31/2718329.html
5、文字変換を関数にカプセル化する
1 void DoA2W()

2 {

3     USES_CONVERSION;

4     DoSomething(A2W("SomeString"));

5 }

 
その他、C言語提供する関数:
 1     char * pstr = "abc";

 2 

 3     size_t nLen = _mbstrlen(pstr) + 1;

 4     //    mbstowcs(NULL, pstr, 0);,                     

 5     

 6     wchar_t * pwstr = new wchar_t[nLen];

 7     mbstowcs(pwstr, pstr, nLen);//multibyte string to widechar string

 8 

 9     size_t nwLen = wcslen(pwstr) + 1;//wcstombs(NULL, pwstr, 0)

10     char *pstr2 = new char[nwLen];

11     wcstombs(pstr2, pwstr, nwLen);//widechar string to multibyte string

12 

13     delete []pwstr;

14     pwstr = NULL;

15 

16     delete []pstr2;

17     pstr2 = NULL;