【发布时间】:2014-11-06 00:11:03
【问题描述】:
在尝试与 C++ 函数中的 BSTR 字符串进行比较时,我遇到了访问冲突,我无法弄清楚。无论出于何种原因,代码大部分时间都正常运行。但有时,看似随机的,它会抛出异常。这就是我正在做的:
BSTR myString; // also tried this with a CComBSTR, same result, but less often it seemed
pSomeObject->GetString(&myString);
if (!CompStr(someOtherString, myString))
{
//do stuff
}
SomeObject::GetString 是:
STDMETHODIMP SomeObject::GetString(BSTR* outStr)
{
if (!outStr) return E_POINTER;
*outStr = ::SysAllocString(m_memberString);
return S_OK;
}
我在 CompStr 中遇到访问冲突:
inline bool CompStr(BSTR str1, BSTR str2)
{
UINT len1 = ::SysStringLen(str1);
UINT len2 = ::SysStringLen(str2); // this is where I'm getting the access violation
return CompStr(str1, len1, str2, len2);
}
关于我做错了什么或为什么失败的任何想法?
【问题讨论】:
-
你确定
str1和str2都被分配了SysAllocString? -
我很确定他们是。我知道我的字符串 (str2) 正在被初始化,但我会更深入地研究其他代码路径,看看 str1 是否没有在某处被初始化。
-
在调试器中检查
str2的值。此外,之前可能存在未定义的行为(例如缓冲区溢出),只有当您分配另一个字符串时才会出现这种损坏。 -
@climbak 不仅仅是“在某处初始化”,它一定是用
SysAllocString(或家族)专门创建的。 BSTR 是一个长度计数的字符串;如果你尝试传递一个以 null 结尾(不计算长度)的字符串,那么你会遇到一些麻烦