c++ - 简单的字符串比较如何导致 OleException?

标签 c++ crash ole

我有这段 C++ 代码:

static CString timeout(_T("TIMEOUT"));
if(strError.Left(7).CompareNoCase(timeout) == 0) return TRUE;

在我的直接窗口中,我看到 strError 的以下值:

? strError
L""
ATL::CSimpleStringT<wchar_t,1>: L""

我遇到以下异常(我正在调试故障转储):

Unhandled exception at 0x74B4A9F2 in CRASH.DMP: Microsoft C++ exception: 
COleException at memory location 0x01BFFD14. occurred

我的调用堆栈如下:

   KERNELBASE.dll!_RaiseException@16()  Unknown
   msvcr110.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Line 152  C++
   mfc110u.dll!AfxThrowOleException(long)   Unknown
   mfc110u.dll!ATL::AtlThrowImpl(long)  Unknown
   mfc110u.dll!ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > >::CompareNoCase(wchar_t const *)  Unknown
>  <Application>.exe!<Own_Class>::<Own_Function>(const ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t> > > & strError) Line 106 C++

因为我在检查.Left(7)时发生了崩溃一个空字符串,我立即认为这就是问题的根源。然而,我意识到这段代码通常运行良好(我只是仔细检查了这一点),并且在再看一遍时,我发现该异常不是访问冲突或空指针异常,而是 Ole 相关异常。与此同时,我了解到该问题不在 strError.Left(7) 范围内。部分:好像是CompareNoCase()方法,出错了,但是怎么办?

有人能告诉我我的代码出了什么问题吗?

strError就其而言,它的创建方式如下:

CString strError;
...
strError = <function>();

哪里<function>()是这样的:

CString <function>(){
...
  return _T("fix string"); // or:
  return <Complicated_function_handling>();

在这种特殊情况下,我不知道如何strError已创建(我知道它是空的,如在立即窗口中清楚地看到的那样,但我只有故障转储,因此我可以读取当前值,但我不知道它们的历史记录)。

有一件事可能会有所帮助:我要求提供 strError 的内存地址。 ,我查看了内存中的数据(使用 Visual Studio 内存调试窗口),并得到以下数据:

5c 18 9c 71 38 d9 ca 00 03 00 00 00 cc 3d c2 00 70 fe bf 01 94 13 b3 00 39 00 00 00 80 fe bf 01 be 58 aa 00 b0 3d c2 00 10 0c cd 00 44 03 00 00 01 00 00 00 d3 5f ac 00 8a 40 1d 72 8e f2 d6 73

提前致谢

最佳答案

通过 MFC 的源代码,会抛出异常,因为 timeOut 是 NULL 字符串。发生这种情况的常见方式是尚未 build 或已被摧毁。 COleException 中存储的错误代码是 E_FAIL

调用顺序如下:

  • CompareNoCase 调用 AtlIsValidString (在转换为 const char 时,如果 timeOut,则在您的情况下将返回 false *,为 NULL)。
  • 由于 AtlIsValidString 返回 false,因此与 ATLENSURE 宏关联的代码调用 AtlThrow(E_FAIL) (AtlThrow是一个定义为 ATL::AtlThrowImpl 的宏。
  • AtlThrowImpl 调用 AfxThrowOleException,因为错误代码不是 E_OUTOFMEMORY

关于c++ - 简单的字符串比较如何导致 OleException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54666981/

相关文章:

Android Webview 视频或 Youtube 抛出错误

go - 如何获取进程所有者使用 WMI 请求

powershell - 无法在PowerShell函数中运行[System .__ ComObject] .InvokeMember

c++ - 使用 boost::tuple<bool, T> 来指示是否找到 T 是否好?

c++全局命名空间编译问题

iphone - StoreKit SKProducts请求崩溃

java - SWT 浏览器似乎在我丢弃后仍然存在

c++ - "final"指令的 "task"子句是否正确?

c++ - 比较 C++ 中的 #include 和 using namespace std 与 Python 中的 import

swift - iOS App崩溃时向服务器发送数据