为什么CreateWindowEx在Fall Creators Update中间歇性地失败(错误998 / 0x3e6)?

时间:2017-10-21 22:09:18

标签: winapi mfc windows-10

将Windows 10更新为Fall Creators Update后,我在CreateWindowEx中遇到间歇性故障。 GetLastError返回0x000003e6 - ERROR_NOACCESS /无效访问内存。经常(但并非总是如此),只需使用完全相同的参数重复调用即可。

hwnd = ::CreateWindowEx(0, wndClassName, NULL, WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,   r.left, r.top, r.right, r.bottom, hParent, NULL, AfxGetInstanceHandle(), NULL);

wndClassName是在此次通话中注册的wndClass的名称:

LPCSTR wndClassName = /* clsName passed in */;
WNDCLASS wndcls;
HINSTANCE hInst = AfxGetInstanceHandle();
if (!(::GetClassInfo(hInst, wndClassName, &wndcls)))
{
    ZeroMemory(&wndcls, sizeof(wndcls));
    wndcls.lpfnWndProc = ::DefWindowProc;
    wndcls.hCursor = ::LoadCursor(nullptr, IDC_ARROW);
    wndcls.hInstance = hInst;
    wndcls.lpszClassName = wndClassName;
    wndcls.hbrBackground = (HBRUSH)::GetStockObject(NULL_BRUSH);
    AfxRegisterClass(&wndcls);
}

MSDN文档指出失败的典型原因之一是

  

安装了WH_CBT挂钩并返回失败代码

我的应用确实使用MFC,我相信MFC依赖于CBT钩子。

有关如何调查和解决使用Fall Creators Update开始发生的持续性间歇性故障的任何想法?

1 个答案:

答案 0 :(得分:3)

这是Windows 10 Fall Creators Update错误,已在12月12日发布的Win10 FCU Update KB4054517中修复。

该错误影响了在64位版本的Windows 10 Fall Creators Update上运行的32位大地址识别应用程序。当内核无法使用低于0x80000000的足够内存时,CreateWindowEx失败。

出于纪录目的,这些是我们为了解问题而采取的行动:

  1. http://support.microsoft.com/oas
  2. 打开技术支持请求
  3. 得到改组,直到最终获得工程技术支持
  4. 已将案例分配给关于troubleshooting CreateWindowEx failures
  5. 的博客文章的作者
  6. 花费数天时间尝试制作重现失败的步骤,以便在内核调试器中检查问题
  7. 无法获得可以重现的案例
  8. 另一位客户能够使用相同的错误代码发送具有类似CreateWindowEx故障的repro案例(在64位版本的Win10 Fall Creators Update上运行的32位应用程序出现问题)。
  9. 交叉手指并等待12月补丁星期二的可能修复