2012-02-28 51 views
-1

我有一个COM代码,我使用BSTR。:: SysFreeString()崩溃在WINDOWS2008只

在应用程序崩溃使用:: 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'是否'使用宽字符与否不是由UNICODE宏控制,所以用'_T()'宏与它不是(正常情况下,你应该总是使用宽字符,而你想使用宏应该是'OLECHAR()')。除此之外,我们将不得不看到更多的代码来诊断这一点。你能制作一个小的,可编辑的例子来展示这个问题吗? – Sven 2012-02-28 12:16:28

+0

实际代码中没有更多。只是我会使用该变量bstrname并将其分配给接口的另一个成员变量。 – ckv 2012-02-28 12:17:59

+0

但是这个代码本身没有问题(除非你编译时没有UNICODE,由于我提到的宏问题)并且不会导致崩溃。你不能指望我们神奇地理解实际问题。除非你能向我们展示一个能够再现问题的完整例子,否则我们无能为力。 – Sven 2012-02-28 12:20:00

回答

3

我建议停止使用像BSTR这样的原始格式。而是使用类似_bstr_t的封装类来封装原始的BSTR指针。该类在适当时通过对SysAllocString和SysFreeString以及其他BSTR API的函数调用来管理资源分配和释放。在下面的链接

更多信息

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