【问题标题】:Access violation on CompStr(BSTR, BSTR) after getting string?获取字符串后CompStr(BSTR,BSTR)上的访问冲突?
【发布时间】: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);
}

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

【问题讨论】:

  • 你确定str1str2 都被分配了SysAllocString
  • 我很确定他们是。我知道我的字符串 (str2) 正在被初始化,但我会更深入地研究其他代码路径,看看 str1 是否没有在某处被初始化。
  • 在调试器中检查str2 的值。此外,之前可能存在未定义的行为(例如缓冲区溢出),只有当您分配另一个字符串时才会出现这种损坏。
  • @climbak 不仅仅是“在某处初始化”,它一定是用SysAllocString(或家族)专门创建的。 BSTR 是一个长度计数的字符串;如果你尝试传递一个以 null 结尾(不计算长度)的字符串,那么你会遇到一些麻烦

标签: c++ com bstr


【解决方案1】:

您没有初始化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);
}

【讨论】:

  • 不幸的是,我仅限于 BSTR,但我会​​查看 someOtherString 并查看它在其他代码中是否有任何未初始化的路径。感谢您的提示。
  • @climbak 你不需要初始化myString,因为你设置了GetString并且没有检查SysAllocString的返回值不会导致SysStringLen崩溃,因为它返回0如果传递了一个 NULL 指针。但是,将代码更改为使用 lstrlenWwcslen 值得一试,看看它是否会导致代码行为不同。
  • 如果这似乎解决了问题,那么 OP 一定没有正确分配 str1,所以应该修复,否则同样的问题可能会出现在不同的代码中。
  • 我从另一个函数中获取字符串,该函数根据条件从不同的地方获取它。其中一个没有使用 SysAllocString 并且什么也没返回。
猜你喜欢
  • 2012-05-14
  • 2013-08-12
  • 2012-09-19
  • 2011-12-04
  • 1970-01-01
  • 2014-09-08
  • 2014-05-15
  • 2020-09-28
  • 2013-06-10
相关资源
最近更新 更多