BSTRについて

[戻る]
あき 2009/12/07(月) 09:38:42
こんにちは

BSTR型についてわからないことがあり、質問させて頂きます。

私の理解では、

typedef struct _BSTR {
int length;
LPWSTR string;           ← ここがBSTR
} BSTR;

のようなイメージだと解釈おり、SysAllocString などは、length 部分を考慮した動作をして
いると思っています。

分からないことというのは、MSDN の COM サンプルで、BSTR を引数とするメソッドの呼び出し
で、

L"文字列"

を渡している部分です。これでは length の部分はめちゃくちゃですし、そもそも原則アクセ
ス不可のはずだと思います。
なぜ BSTR に WCHAR* を渡すことができるのでしょうか?(const は省いています。)

aetos 2009/12/07(月) 09:52:59
> MSDN の COM サンプルで、BSTR を引数とするメソッドの呼び出しで、
> L"文字列"
> を渡している部分です。

そんなのがありますか。ダメですね。
COM となると直される確率は低いですが、一応、こちら
http://social.msdn.microsoft.com/Forums/ja-JP/vddocumentsja/threads
から修正依頼を出して頂けますか。

まぁ、length の部分が使われるのは VB 等の他言語やマーシャリングが絡む場合だと思
うので、相手が C++ で書かれているとわかっていれば、動かないことはないと思いま
す。

あき 2009/12/07(月) 10:12:41
[[解決]]
aetos様

やはり駄目ですよね。現在WMIを勉強中で、個人のホームページでのサンプルにはあっても良い
としても、MSDNにもそう記載されているとなると、なんらかの暗黙の変換ルールがあるのかと
思っていました。

MSDNのサンプルでもBSTRに渡す場合の書き方として、

_bstr_t(L"ほげほげ")
SysAllocString(L"ほげほげ")
L"ほげほげ"

なんて3通りあるもので、一体何を基準に使い分けしているんだろう、と勘繰ってしまいまし
た。まあ、人間が書くものですから...

ただ、単に引数にBSTRを渡すだけでSysAllocStringって、何かすごく無駄な(というかオー
バーヘッドが大きい)感じがしますね。あくまで感覚的に、です。

ところで、WMIってなんでもできるのは良いのですがいかんせん抽象的過ぎて、WMIのルールと
いうか世界観に馴染むのが大変ですね。

すっきりしました。
ありがとうございました。

古いスレッドには追加発言できません。