我有一个在用 VS2013 重建的 Win7 上运行的 MFC C++ 应用程序。它使用自定义 OCX 控件。在大约第 4 次调用 OCX 时,COleDispatchDriver::InvokeHelper 方法调用 Invoke,导致异常 61706“内存不足”。这个应用程序已经在以前版本的 Visual Studio 上成功构建和运行多年(不确定它最初是用哪个版本构建的)。来自生成异常的应用程序代码的调用是:
m_Sig1.LCDWriteString( 0, 2, 100, 100, 0, 0, 0, "Testing 123" );
我已经进入了这个调用,并通过了大约 4 个级别的调用,并在库 dll oledisp2.cpp 中进行了这个调用
void COleDispatchDriver::InvokeHelperV(DISPID dwDispID, WORD wFlags,
VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, va_list argList)
. . .
// make the call
SCODE sc = m_lpDispatch->Invoke(dwDispID, IID_NULL, 0, wFlags,
&dispparams, pvarResult, &excepInfo, &nArgErr);
状态码 sc 返回为 0x80020009,即 DISP_E_EXCEPTION,表示“发生异常”,异常信息为:
exceptInfo
wCode = 61706
bstrSource = "SigPlus"
bstrDescription = "Insufficient memory to perform operation."
bstrHelpFile = 0
scode = 0
我试图进入 m_lpDispatch->Invoke调用,但调试器只显示汇编语言,说被调用模块没有符号信息,这看起来很奇怪,因为它是同一个类(或父级)的成员电话来自。当我逐步了解 InvokeHelper 方法时,我观察到所有 8 个传递的参数都被正确识别和处理,直到调用 Invoke()。无法进入 Invoke 导致无法查看导致“内存不足”问题的内存分配位置。
我也尝试使用 VS2010 构建并得到相同的错误。
我尝试过的其他事情是从静态 MFC 库切换到 DLL MFC,但结果是一样的。我仍然收到“内存不足”错误,并且无法在 Invoke() 调用中使用符号进行调试。
我试图查找 61706 错误以获取 Microsoft 的详细描述,但只发现这个链接信息量不大。