将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?
需要调试代码。只有这样。我不认为CBT在这里扮演角色。错误代码对自己说 - 你尝试访问或无效的地址或窗口过程中的错误对齐数据。需要看它是否被称为,如果是的话 - 它获得了哪些消息。 – RbMm
@RbMm窗口过程是DefWindowProc--添加窗口类的注册调用问题。 –
并且你没有改变它('DefWindowProc')以后拥有?自定义窗口类与'DefWindowProc'有什么意义?无论如何,错误是为了自我。看起来像你有'STATUS_DATATYPE_MISALIGNMENT'或者可能(直到'STATUS_ACCESS_VIOLATION'之前说的可能性更小) – RbMm