4

これまでのところ、着信 BSTR を 2 つの (多くの?) 方法で ANSI に変換できることを発見しました。速度や効率などに関して、一方が他方よりも「優れている」かどうか知りたいです。

私がしばらくの間使用してきた方法は、USES_CONVERSIONW2Aマクロを使用することです。

BSTR __stdcall F(BSTR p1, BSTR p2 ) {
    USES_CONVERSION;

    LPSTR sNum1 = W2A( p1 );
    LPSTR sNum2 = W2A( p2 );

ただし、最近、別の手法に出くわしました。

BSTR __stdcall F(BSTR p1, BSTR p2 ) {
    long amt = wcstombs( NULL, p1, 1 );
    sNum1 = (char *) malloc( amt ); 
    wcstombs( sNum1, p1, amt );
    *(sNum1 + amt) = '\0';

    amt = wcstombs( NULL, p2, 1 );
    sNum2 = (char *) malloc( amt ); 
    wcstombs( sNum2, p2, amt );
    *(sNum2 + amt) = '\0';

確かに、それはより冗長で、2 つの呼び出しがありますが、とマクロがあらゆる種類の楽しみとゲームを隠している可能性があることはwcstombsわかっています。USES_CONVERSIONW2A

より効率的/高速なコードはどれですか? または、より良い仕事をするために使用できる別のテクニックはありますか?

4

4 に答える 4

6

MSDNから:

[...] BSTR 文字列との変換に推奨される方法は、CComBSTRクラスを使用することです。BSTR に変換するには、既存の文字列を CComBSTR のコンストラクターに渡します。BSTR から変換するには、COLE2T などの COLE2[C]DestinationType[EX] を使用します。

CComBSTR ページから:

[...]CComBSTR クラスは、ANSI または Unicode 文字列を引数として取る多数のメンバー (コンストラクター、代入演算子、および比較演算子) を提供します。これらの関数の ANSI バージョンは、一時的な Unicode 文字列が内部で作成されることが多いため、対応する Unicode よりも効率的ではありません。効率を高めるために、可能な場合は Unicode バージョンを使用してください。

于 2009-02-23T05:48:43.437 に答える
4

Nick による承認された回答に注意してください。これは、マクロを説明する MSDN ドキュメントと同じ問題を共有しています。

問題は、@Nick によってリストされたものなどの一部のマクロ - COLE2A が実際には存在しないことです。

ただし、MSDN ページのさらに下に、この事実の手がかりとなり、正しいマクロを理解できるように導くテキストがいくつかあります。

テキストは、次のテキストの下の表にリストされています。

古い文字列変換マクロと新しい文字列変換クラスの間には、いくつかの重要な違いがあります。

[新しい ATL 7.0 変換クラス] 列。

それは言う:

OLE は常に W と同等です

したがって、@Nick の例のマクロは実際にはCW2A です。

于 2010-03-04T12:43:31.257 に答える
3

ノート:

COLE2[C]DestinationType[Ex] などの ATL マクロを使用する場合 (おそらく使用する必要があります)、作成した非 const バージョンではなく、可能な限り 'C' バージョンを使用してください。これらは、明示的な BSTR->ASCII 変換 (例: COLE2A) と同等である可能性がありますが、実際の変換が不要な変換 (例: UNICODE 用にコンパイルする場合の COLE2T) では、「C」バージョンは noops に展開できますが、非-'C' バージョンは、ソース文字列が const の場合でもコピーします (結果の文字列を非 const にする必要があることを表現しているため)。

また、次の点にも注意してください。

新しい ATL7 マクロは常に USES_CONVERSION を必要とするわけではありませんが、一時的な r-value オブジェクトを割り当てますが、古いマクロは _alloca を使用します。これは、使用状況に応じて重要な場合とそうでない場合があります (たとえば、何度も実行されるループで古いマクロを使用しないでください。スタックを吹き飛ばす可能性があります)。

于 2009-02-23T18:41:35.453 に答える
1

COM や BSTR を使用してから長い時間が経ちましたが、私の提案は、BSTR を特別なものとして扱うのをやめることです。それらをワイド文字のゼロで終了する文字列へのポインターのように扱います...そうすれば、ANSIに変換する方が簡単かもしれません。エリックのBSTRセマンティクスの完全ガイドを確認 してください...

于 2009-02-24T05:33:49.567 に答える