2008年3月21日金曜日

BSTR型

COMをはじめました。
扱いに気をつけないといけない型にBSTR型というものが。。

BSTRがさすアドレスは文字列の先頭を指しているんですが、
BSTRがさすアドレスの前4バイトに文字列の長さが格納されているとのこと。
メモリの確保とか解放も専用の関数を使わないといけないし

メモリの解放のタイミングがまだよく掴めていない。。。
扱いが非常に難しい、きっちり意識して解放していかないと簡単に
メモリリークが起きるとのこと。

BSTR型は _bstr_tに変換して扱った方がよさそう。
変換方法は以下 (間違ったこと書いてないか不安。。。)
----------
void func(BSTR bstr){ // 引数のBSTRは関数処理後にメモリ領域は解放される
_bstr_t str1;
str1 = bstr; // この方法だと内部でメモリを確保(SysAllocString)してコピーして

BSTR bstr2; // ローカル変数を宣言して値を入れた場合は解放する必要あり
_bstr_t str2;
str2 = bstr2; // この方法だと内部でメモリを確保(SysAllocString)してコピーしている
::SysFreeString(bstr2); //ローカル変数の解放
}
---------

以下調べた結果のURLを纏めておきます。

COM のデータ型
http://msdn2.microsoft.com/ja-jp/library/sak564ww(VS.80).aspx

BSTR型の仕様
http://msdn2.microsoft.com/ja-jp/library/ms221069(en-us,VS.80).aspx

BSTR 用のメモリの割り当てと解放
http://msdn2.microsoft.com/ja-jp/library/xda6xzx7(VS.80).aspx

BSTRリークの可能性
http://hp.vector.co.jp/authors/VA014436/prg_memo/windows/COM/002.html

.

0 件のコメント:

ラベル