[英]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.