2012-02-28 7 views
-1

私はBSTRを使用するCOMコードを持っています。:: WINDOWS2008でSysFreeString()がクラッシュする

アプリケーションがクラッシュしたことで

使用して:: SysFreeStringの()Windows2003の、WIN7で

ただし、同じ作品、WINXPなど

問題やどのような間違っている可能性が原因となっている上の任意のアイデアを。サンプルコードは次のとおりです

class CFoo::IUser 
{ 
BSTR UserName; 

} 
HRESULT CBar::FooMethod(VARIANT *vOut) 
{ 
//create interface, variant and fill the object. 

BSTR bstrname = ::SysAllocString(_T("Username")); 
//use bstrname to fill interface structure. 
//finished using now deallocate memory 

::SysFreeString(bstrname); // crashing here only in windows 2008 R2 

} 
+4

一つの小さな問題:SysAllocString'は、それがにISNでとても '_T()'マクロを使用して、UNICODEマクロによって制御されていないワイド文字を使用していますか 'か(正常な状況では、常にワイド文字を使用し、マクロを使用するには 'OLECHAR()'でなければなりません)。それを超えて、私たちはこれを診断するためにもっと多くのコードを見なければなりません。問題を示す小さいコンパイル可能な例を作成できますか? – Sven

+0

実際のコードには何もありません。その変数bstrnameを使用して、それをインターフェイスの別のメンバ変数に割り当てます。 – ckv

+0

しかし、このコード自体は問題ありません(私が言及したマクロの問題のためにUNICODEなしでコンパイルしない限り)、クラッシュは発生しません。あなたは、私たちが実際の問題が魔法のように神になることを期待することはできません。問題を再現する完全な例を示すことができない限り、私たちは何もできません。 – Sven

答えて

3

BSTRのような生のフォームの使用を中止することをお勧めします。その代わりに、生のBSTRポインタをカプセル化する_bstr_tのようなラッパークラスを使用します。クラスは、必要に応じて、SysAllocStringやSysFreeStringなどのBSTR APIへの関数呼び出しを介して、リソースの割り当てと割り当て解除を管理します。次のリンクで

詳細情報

http://msdn.microsoft.com/en-us/library/zthfhkd6%28v=vs.80%29.aspx

関連する問題