Я получаю нарушение прав доступа, которое я не могу понять, пытаясь сравнить со строками BSTR в функции C ++. По какой-то причине большую часть времени код работает нормально. Но иногда, казалось бы, случайным образом, он генерирует исключение. Вот что я делаю:
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
? - person Ross Ridge   schedule 12.09.2014str2
. Также ранее могло быть неопределенное поведение (например, переполнение буфера), и только когда вы выделяете другую строку, это повреждение проявляется. - person M.M   schedule 12.09.2014SysAllocString
(или семейством). BSTR - строка с подсчетом длины; если вы попытаетесь передать строку с завершающим нулем (без подсчета длины), тогда у вас возникнут некоторые проблемы - person M.M   schedule 12.09.2014