gpt4 book ai didi

c++ - "The Parameter Is Incorrect"MFC异常

转载 作者:太空宇宙 更新时间:2023-11-03 10:42:57 25 4
gpt4 key购买 nike

这是 native C++。不涉及 .NET 框架。

我试图找出当 CListBox 获取无效参数时抛出的异常。事实证明 MFC 经常使用此异常,但我无法确定抛出的实际异常类型。我在 catch (int, const char , std:) 上尝试了很多不同的类型,但除了 catch(...) 之外唯一捕获它的是 (const void *)。查看内存结构,我仍然不知道实际抛出的是什么。有谁知道它是什么或如何确定它抛出的是什么?

这是一个示例 MFC 应用程序。 ListBox 是一个 CListBox。该应用程序只不过是 VS 自动构建的默认基于 DialogBox 的 MFC 应用程序。唯一的变化是我添加了一个列表框和您在下面的“确定”按钮处理程序中看到的代码。

void CMFCApplication1Dlg::OnBnClickedOk()
{
try
{
CString Value;
ListBox.GetText( -1, Value );
Value = "none";
}
catch ( CException & exception )
{
exception.Delete();
}
catch ( const void * e )
{
}
catch (...)
{
}

CDialogEx::OnOK();
}

最佳答案

为了解释为什么会出现异常,看起来当您使用 CListBox::GetText()CString 版本时,如果传递索引无效。跟踪 MFC 代码需要一些工作,但 CListBox::GetText() 看起来像:

void CListBox::GetText(int nIndex, CString& rString) const
{
ASSERT(::IsWindow(m_hWnd));
GetText(nIndex, rString.GetBufferSetLength(GetTextLen(nIndex)));
rString.ReleaseBuffer();
}

CListBox::GetTextLen(-1) 将返回 LB_ERR,即 -1。如果您遵循 CString::GetBufferSetLength() 的代码,您最终会在 CString::SetLength() 中结束:

void SetLength(_In_ int nLength)
{
ATLASSERT( nLength >= 0 );
ATLASSERT( nLength <= GetData()->nAllocLength );

if( nLength < 0 || nLength > GetData()->nAllocLength)
AtlThrow(E_INVALIDARG);

GetData()->nDataLength = nLength;
m_pszData[nLength] = 0;
}

nLength == -1,因此异常。

关于c++ - "The Parameter Is Incorrect"MFC异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30486290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com