2017-10-21 80 views
1

将Windows 10更新到Fall Creators更新后,我在CreateWindowEx中遇到间歇性故障。 GetLastError返回0x000003e6 - ERROR_NOACCESS /无效访问内存。通常(虽然不总是),只需用完全相同的参数重复呼叫即可成功。为什么CreateWindowEx在Fall Creators Update(错误998/0x3e6)中间歇性失败?

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?

+0

需要调试代码。只有这样。我不认为CBT在这里扮演角色。错误代码对自己说 - 你尝试访问或无效的地址或窗口过程中的错误对齐数据。需要看它是否被称为,如果是的话 - 它获得了哪些消息。 – RbMm

+0

@RbMm窗口过程是DefWindowProc--添加窗口类的注册调用问题。 –

+0

并且你没有改变它('DefWindowProc')以后拥有?自定义窗口类与'DefWindowProc'有什么意义?无论如何,错误是为了自我。看起来像你有'STATUS_DATATYPE_MISALIGNMENT'或者可能(直到'STATUS_ACCESS_VIOLATION'之前说的可能性更小) – RbMm

回答

2

这是一个Windows 10秋季创作者更新错误,固定在Win10 FCU Update KB4054517 12月12日

公布的问题的影响在Windows 10秋季创更新的64位版本上运行32位大地址识别的应用程序。当内存低于0x80000000的内存不足时,CreateWindowEx失败。

对于纪录片的目的,这些都是我们采取了深入了解问题的行动:

  1. 打开在http://support.microsoft.com/oas
  2. 技术支持请求得到抛去,直到工程结束了技术支持
  3. 已将案例分配给博客文章的作者troubleshooting CreateWindowEx failures
  4. 花费数天时间尝试生成步骤以重新制作故障,以便可以在内核调试程序中检查问题
  5. 未能得到可重复使用的案例
  6. 另一位客户能够发送具有相同错误代码的类似CreateWindowEx故障的重新创建案例(在64位版本的Win10 Fall Creators Update上运行的32位应用程序出现问题)。
  7. 十字指头并等待可能修复十二月补丁星期二
+3

以下是来自MS的官方已知问题:https://support.microsoft.com/zh-CN/help/4054150/issues-when-windows-10-fall-creators-update-calls-createwindowex – peterflynn

相关问题