ATL と MFC の文字列変換マクロ
The string ここで説明する変換マクロを ATL と MFC の両方で有効です。MFC の文字列変換の詳細については、TN059: MFC 割り当てるの変換マクロを使用して と MFC マクロとグローバルを参照してください。
ATL 7.0 の文字列変換マクロとクラス
ATL 3.0 の文字列変換マクロ
ATL 7.0 の文字列変換マクロとクラス
ATL 7.0 では、既存のマクロより大きなアップグレードを提供するいくつかの新しい変換クラスとマクロについて説明します。
新しい文字列変換マクロとクラス名の形式は、です:
CSourceType2[入力]CDestinationType[入力]EX
それぞれの文字について以下に説明します。
SourceType と DestinationType は、次の表で説明します。
[入力]C先の型を設定する必要がある場合は、現在はです。
[入力]バッファーEXの初期サイズがテンプレートの引数として指定する必要があるときに、現在はです。
SourceType/DestinationType
説明
A
ANSI 文字列。
W
Unicode 文字列。
T
一般的な文字列 (_UNICODE が定義されている場合と同等の W、別の方法で A と同じ)。
OLE
OLE 文字列 (W) に相当します。
たとえば、変換された文字列を変更せずに Unicode 文字列から汎用の文字列に変換するには、を使用 CW2CT。
変換された文字列の長さが 64 文字が低いことがわかっている場合にスタック領域を節約するために EX のバージョン、**CW2CTEX<64>**など) で使用できます。
[!メモ]
BSTR 文字列との間で変換する方法をお勧め CComBSTR のクラスを使用することです。BSTR に変換するには、CComBSTR.のコンストラクターに既存の文字列を渡します。BSTR に変換するには、COLE2[ COLE2TなどのC入力]DestinationType[入力]EX、を使用します。
変換の結果を格納するバッファー (CA2AEX、CA2WEX、CW2AEXと CW2WEX) の使用を固定サイズ バッファー静的必要な新しい変換クラス。結果が静的バッファーに収まらない場合、クラスは、メモリを解放する mallocを使用してオブジェクトがスコープ外に出るとメモリを割り当てます。これは、古いテキスト変換マクロとは異なり、これらのクラスは、ループで使用しても安全、この動作しなくなります。
ATL 7.0 で導入された変換マクロは、入力 null の文字列を認識するのに最適です。これらのマクロは、入力パラメーターがメモリを追加割り当てせず null 場合 null を返します。
既定では、ATL 変換クラスとマクロは、変換の現在のスレッドの ANSI コード ページを使用します。クラス CA2WEX か CW2AEXに基づいてマクロを使用して特定の変換の動作は、クラスのコンストラクターに対する 2 番目のパラメーターとしてコード ページを指定できます。オーバーライドする場合は。
セキュリティに関するメモ |
---|
これらのマクロに発生する可能性のあるバッファー オーバーランを回避するために渡す前に文字列の長さをチェックします。スタック オーバーフローはまた、およびを除くキャッチされる例外です。 |
古い文字列変換マクロと新しい文字列変換クラスのいくつかの重要な違いがあります:
古い ATL 3.0 の変換マクロ |
新しい ATL 7.0 の変換クラス |
---|---|
スタックにメモリを割り当てます。 |
短い文字列の使用スタックにメモリ。スタックが十分な大きさヒープを使用します。 |
関数が終了すると The string よって解放され。 |
変数がスコープ外に出ると The string よって解放され。 |
例外ハンドラーで使用することはできません。 |
例外ハンドラーで使用できます。 |
ループの使用に適したされていない。メモリの使用は、関数が終了するまで拡張されます。 |
サポートは、ループで使用します。ループのスコープは、メモリが各イテレーションで解放されるようにします。 |
長い文字列のために使う。スタック領域は制限されます。 |
大きな文字列に問題がない。文字列は、ヒープ上に割り当てられます。 |
通常 USES_CONVERSION を定義することを要求します。 |
は USES_CONVERSION を定義することを要求しないようにします。 |
OLE の意味は OLE2ANSI の定義によって異なります。 |
OLE では、W.と同じ常にです。 |
例
コード
//Example 1
// Convert LPCWSTR to LPCSTR.
void ExampleFunction1(LPCWSTR pszW)
{
// Create an instance of CW2A, called pszA,
// and initialize it with pszW.
CW2A pszA(pszW);
// pszA works like an LPCSTR, and can be used thus:
ExampleFunctionA(pszA);
// Note: pszA will become invalid when it goes out of scope.
}
// Example 2
// Use a temporary instance of CW2A.
void ExampleFunction2(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// and initialize it with pszW.
ExampleFunctionA(CW2A(pszW));
// Note: the temporary instance becomes invalid
// after the execution of the statement above.
}
// Example 3
// Incorrect use of conversion macros.
void ExampleFunction3(LPCWSTR pszW)
{
// Create a temporary instance of CW2A,
// save a pointer to it and then delete
// the temportary instance.
LPCSTR pszA = CW2A(pszW);
// The pszA in the following line is an invalid pointer,
// as the instance of CW2A has gone out of scope.
ExampleFunctionA(pszA);
}
一時的なクラスのインスタンスに関する警告
次のないコードではないことに重点を置く必要があります:
LPCTSTR szr = CA2T(szReplaceFile);
ATL を使用して 3.0 のマクロ、を使用することはできていません:
LPCTSTR szr = A2T(szReplaceFile);
現在の関数が終了するまで変換関数で割り当てられたメモリは解放されません。同じコードが新しいクラスは使用しません。
このコード:
LPCTSTR szr = CA2T(szReplaceFile);
これと同じです:
LPCTSTR szr;
{
CA2T temp(szReplaceFile);
szr = temp.operator LPTSTR();
}
一時的なオブジェクトによって割り当てられ、キャスト演算子から返されるメモリとして一時オブジェクトが破棄される szr の値を使用すると、望ましくない結果が破棄されます。
代わりに、このコードを使用する:
CA2T szr(szReplaceFile);
キャスト演算子は CA2T のオブジェクトを LPCTSTRに見えます。
高度な使用
既定の静的なバッファー サイズは 128 文字です。バッファー サイズが特定の変換に変更する必要がある場合は、マクロの前のバージョンを使用し、テンプレート引数としてバッファー サイズを指定します。
// Example 4
// Changing the size of the buffer.
void ExampleFunction4(LPCWSTR pszW)
{
// Use a 16-character buffer.
ExampleFunctionA(CW2AEX<16>(pszW));
}
クラス コンストラクターの 2 番目のパラメーターとしてのコード ページを指定する例を次に示します。
// Example 5
// Specifying the code page.
void ExampleFunction5(LPCWSTR pszW)
{
// Convert to the Macintosh code page
ExampleFunctionA(CW2A(pszW, CP_MACCP));
}
ATL 3.0 の文字列変換マクロ
元のテキスト変換マクロは現在でも使用できますが、次のように表に示す:
ATL 3.0 の文字列変換マクロ
A2BSTR |
OLE2A |
T2A |
W2A |
A2COLE |
OLE2BSTR |
T2BSTR |
W2BSTR |
A2CT |
OLE2CA |
T2CA (使用されていません。T2CA_EX か CT2CA を代わりに使用します)。 |
W2CA |
A2CW |
OLE2CT |
T2COLE |
W2COLE |
A2OLE |
OLE2CW |
T2CW |
W2CT |
A2T |
OLE2T |
T2OLE |
W2OLE |
A2W |
OLE2W |
T2W |
W2T |
これらのマクロを使用する構文は次のとおりです。:
MACRONAME( string_address )
以下はその例です。
A2W(lpa);
マクロ名には、元の文字列型は左側にあります (A) とコピー先の文字列型は右側にあります (W)。A は LPSTRを意味します OLE は LPOLESTRを意味します T は LPWSTRの LPTSTRと W の立場を意味します。
マクロ名の C がある場合、マクロは const に文字列を変換します。たとえば、W2CA は LPCSTRに LPWSTR を変換します。
したがって、A2W は LPTSTRに LPWSTR、OLE2T に LPSTR を変換します LPOLESTR などを変換します。
ATL 文字列変換マクロの動作は、コンパイラ ディレクティブであれば、仮想異なります。コピー元とコピー先の型が同じ場合、変換は行われません。次のようにコンパイラ ディレクティブの変更 T と OLE :
コンパイラ ディレクティブ仮想 |
T は |
OLE は |
---|---|---|
なし |
A |
W |
_UNICODE |
W |
W |
OLE2ANSI |
A |
A |
_UNICODE と OLE2ANSI |
W |
A |
変換後の文字列は、_allocaを使用して、コピー先の型が BSTRの場合を除き作成されます。_を使用してalloca はスタックから、関数から制御が戻るときに、自動的にクリーンアップされるように、メモリを割り当てます。既定では、このマクロは 500KB までしか一度に変換します。
ATL 文字列変換マクロを使用すると、コンパイラ エラーを回避するには、関数の最初に USES_CONVERSION のマクロを指定します。以下はその例です。
void StringFunc(LPSTR lpsz)
{
USES_CONVERSION;
LPWSTR x = A2W(lpsz);
// Do something with x
wprintf_s(L"x is %s", x);
}
要件
Header file: AtlBase.h、AtlConv.h (AtlConv.h で宣言)
参照
関連項目
DEVMODE および TEXTMETRIC の各文字列変換マクロ