簡體   English   中英

簡單的字符串比較如何導致OleException?

[英]How can a simple string comparison cause an OleException?

我有這段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)一個空字符串時發生崩潰時,我立即認為這是問題的出路。 但是,我已經意識到這段代碼通常可以正常工作(我只是仔細檢查了一下),再看一看,我看到該異常不是訪問沖突或nullpointerexception而是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字符串而引發了異常。 可能發生這種情況的常見方式是尚未構建或已被破壞。 存儲在COleException的錯誤代碼是E_FAIL

調用順序如下所示:

  • CompareNoCase調用AtlIsValidString (如果將timeOut轉換為const char *時為NULL,則在您的情況下將返回false)。
  • 由於AtlIsValidString返回false,因此與ATLENSURE宏關聯的代碼將調用AtlThrow(E_FAIL)AtlThrow是定義為ATL::AtlThrowImpl的宏。
  • 由於錯誤代碼不是E_OUTOFMEMORY AtlThrowImpl調用AfxThrowOleException

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM