10

CStringインスタンスを適切に割り当てられたものに変換し、それをCOMメソッドにBSTR渡す必要があります。ANSIとUnicodeの両方で同じようにコンパイルおよび動作するコードを作成するには、任意の形式をBSTRUnicodeBSTRに変換するために使用します。CString::AllocSysString()CString

返されたBSTRは誰も所有していないので、可能な限り最も例外安全な方法で、可能な限り少ないコードで呼び出しが行われた後、それを処理して解放する必要があります。

現在、私ATL::CComBSTRは生涯管理に使用しています:

 ATL::CComBSTR converted;
 converted.Attach( sourceString.AllocSysString() ); //simply attaches to BSTR, doesn't reallocate it
 interface->CallMethod( converted );

ここで私が気に入らないのはATL::CComBSTR、変換結果へのバインドを作成するために2つの別個のステートメントが必要なことです。

同じタスクを実行するためのより良い方法はありますか?

4

3 に答える 3

17

CComBSTRには、 との両方のコンストラクターがオーバーロードされてchar*おり、ユーザーに代わってwchar_t*を呼び出します。SysAllocString()したがって、コード スニペットでの明示的な割り当ては実際には不要です。以下も同様に機能します。

ATL::CComBSTR converted = sourceString;
interface->CallMethod(converted);

さらに、コードの他の場所で変換を使用する必要がない場合はBSTR、次のように、メソッド呼び出しでオブジェクトの構築をインプレースで実行できます。

interface->CallMethod(ATL::CComBSTR(sourceString));

同じことがクラスにも当てはまり、ATL に依存したくない場合_bstr_tの代わりに使用できます。CComBSTR

于 2010-01-18T15:43:58.613 に答える
2

Windowsプログラミングの紛らわしい側面の1つは、VisualBasicスタイルの文字列とC言語スタイルの文字列との間の変換を管理することです。そんなに難しいことではなく、細部を覚えるのが難しいだけです。通常、これは頻繁に行われることはなく、MSDNのドキュメントは膨大であるため、質問に対する回答を見つけるのは困難です。ただし、最悪の部分は、正常にコンパイルされても期待どおりに機能しない型キャストを実行できることです。その結果、コードが機能せず、バグを追跡するのが困難になります。ある程度の経験を積んだ後、文字列変換が期待どおりに機能していることを確認する方法を学びます。

C文字列は、NULL文字で終了する文字の配列です。Visual Basicの文字列は、文字列の長さが文字列内の文字の前にあるという点で異なります。したがって、VB文字列はそれ自体の長さを知っています。さらに、すべてのVB文字列はUnicodeです(1文字あたり16ビット)。文字列タイプ

次の場合、BSTR/C文字列変換が必要です。

You are doing COM programming in C/C++
You are writing multiple language applications, such as C++ DLL's accessed by Visual Basic applications.
于 2012-02-08T19:02:25.807 に答える
2

コンストラクターの 1 つを_bstr_t使用すると、既存のものに簡単にアタッチできるため、割り当てが失敗したときにBSTR必要な例外を取得できます。CString::AllocSysStringBSTR

// _bstr_t simply attaches to BSTR, doesn't reallocate it
interface->CallMethod( _bstr_t(sourceString.AllocSysString(), false) );

_bstr_tコンストラクターのドキュメントには次のように書かれています。

_bstr_t(
   BSTR bstr,
   bool fCopy 
);

fCopy
false の場合、bstrを呼び出してコピーを作成せずに、引数が新しいオブジェクトにアタッチされますSysAllocString

一方、CComBSTRコンストラクターには対応する署名がないようです。ただし、 Phil Boothの回答BSTR述べられているように、割り当て失敗の例外が実際には必要ない場合にも使用できます。

于 2013-01-23T02:17:35.163 に答える