2017-10-21 81 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

相關問題