2008年4月27日日曜日

BSTR型⇒_bstr_t型へ型変換

前回BSTR型を調べてリンク集がありますので前提知識としてどぞ
知識のゴミ箱:BSTR型[http://mzs184.blogspot.com/2008/03/bstr.html]

BSTR型を_bstr_t型へ型変換について。
_bstr_tはBSTRのスマートポインタですね。
BSTRはそのまま使うとメモリリークが怖いので一度_bstr_tに型変換して使った方が良いですね。

// OK
{
BSTR testBSTR;
// BSTR型のメモリ確保と解放
testBSTR = ::SysAllocString(L"testBstr");
::SysFreeString(testBSTR);
}

// OK
{
BSTR testBSTR;
testBSTR = ::SysAllocString(L"testBstr");

// 第二引数がfalseなのでtestBSTRをコピーせずに_bstr_t内部で保持
_bstr_t testBstrT(testBSTR, false);

// スコープ抜ける際に_bstr_tのデストラクタでtestBSTRを解放
}

// OK
{
BSTR testBSTR;
testBSTR = ::SysAllocString(L"testBstr");

// 第二引数がtrueなのでtestBSTRをコピーして_bstr_t内部で保持
_bstr_t testBstrT(testBSTR, true);

// testBSTRを解放
::SysFreeString(testBSTR);

// スコープ抜ける際に_bstr_tのデストラクタでコピーしたtestBSTRを解放
}

// NG
{
BSTR testBSTR;
testBSTR = ::SysAllocString(L"testBstr");

// testBSTRをコピーして_bstr_t内部で保持
_bstr_t testBstrT(testBSTR); // コンストラクタで引数をコピーして保持する

// スコープ抜ける際に_bstr_tのデストラクタでコピーしたtestBSTRを解放
// ※testBSTR自身が解放されない。
}

.

ラベル