首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取字符串后CompStr(BSTR,BSTR)上的访问冲突?

获取字符串后CompStr(BSTR,BSTR)上的访问冲突?
EN

Stack Overflow用户
提问于 2014-09-11 22:05:51
回答 1查看 829关注 0票数 1

在尝试与c++函数中的BSTR字符串进行比较时,我得到了一个无法识别的访问冲突。无论出于什么原因,代码大部分时间都正常运行。但有时,似乎是随机的,它会抛出异常。这就是我要做的:

代码语言:javascript
复制
BSTR myString; // also tried this with a CComBSTR, same result, but less often it seemed
pSomeObject->GetString(&myString);
if (!CompStr(someOtherString, myString))
{
  //do stuff
}

对象::GetString是:

代码语言:javascript
复制
STDMETHODIMP SomeObject::GetString(BSTR* outStr)
{
  if (!outStr) return E_POINTER;

  *outStr = ::SysAllocString(m_memberString);

  return S_OK;
}

我得到了CompStr中的访问违规,即:

代码语言:javascript
复制
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);
}

对我做错了什么或者为什么失败有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-11 23:00:13

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

代码语言:javascript
复制
BSTR myString = NULL; // CComBSTR initializes for you
if (SUCCEEDED(pSomeObject->GetString(&myString)))
{
    if (!CompStr(someOtherString, myString))
    {
        //do stuff
    }
}

代码语言:javascript
复制
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*

代码语言:javascript
复制
inline bool CompStr(WCHAR* str1, WCHAR* str2)
{
    UINT len1 = ::lstrlenW(str1);
    UINT len2 = ::lstrlenW(str2);

    return CompStr(str1, len1, str2, len2);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25797697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档