gpt4 book ai didi

c++ - 获取字符串后对 CompStr(BSTR, BSTR) 的访问冲突?

转载 作者:太空宇宙 更新时间:2023-11-04 11:28:20 26 4
gpt4 key购买 nike

在尝试与 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);
}

关于我做错了什么或为什么失败的任何想法?

最佳答案

您没有初始化 myString,也没有检查 GetString() 是否有错误结果。

BSTR myString = NULL; // CComBSTR initializes for you
if (SUCCEEDED(pSomeObject->GetString(&myString)))
{
if (!CompStr(someOtherString, myString))
{
//do stuff
}
}

STDMETHODIMP SomeObject::GetString(BSTR* outStr)
{
if (!outStr) return E_POINTER;

*outStr = ::SysAllocString(m_memberString);
if (!*outStr) return E_OUTOFMEMORY;

return S_OK;
}

此外,确保 someOtherString 被分配为 BSTR,否则 SysStringLen() 将无法在其上运行。我建议将 CompStr() 改为使用 WCHAR*lstrlenW()。您可以将 BSTR 传递给 WCHAR*:

inline bool CompStr(WCHAR* str1, WCHAR* str2)
{
UINT len1 = ::lstrlenW(str1);
UINT len2 = ::lstrlenW(str2);

return CompStr(str1, len1, str2, len2);
}

关于c++ - 获取字符串后对 CompStr(BSTR, BSTR) 的访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25797697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com