Здравствуйте.
Открыл свой, не такой уж и старый, проект на WinApi
и обнаружил, что при закрытии окна в логе вижуалки почти каждый раз вылезает ошибка исключение Microsoft C++: wil::ResultException по адресу памяти 0x...
.
Подумал - где-то накосячил. Создал пустой проект:
#include <Windows.h>
#include <iostream>
LRESULT CALLBACK mainWndProc(HWND wnd, UINT uMessage, WPARAM wParam, LPARAM lParam)
{
switch (uMessage)
{
case WM_KEYDOWN:
DestroyWindow(wnd);
break;
case WM_CREATE:
std::cout << "WM_CREATE" << std::endl;
break;
case WM_DESTROY:
std::cout << "WM_DESTROY" << std::endl;
PostQuitMessage(0);
break;
}
return DefWindowProc(wnd, uMessage, wParam, lParam);
}
int main()
{
const LPCWSTR MYCLASS = L"test_class";
const LPCWSTR MYTITLE = L"test";
const HINSTANCE selfInstance = GetModuleHandle(NULL);
WNDCLASSEX wndClassEx{ 0 };
wndClassEx.cbSize = sizeof(WNDCLASSEX);
wndClassEx.style = CS_HREDRAW | CS_VREDRAW;
wndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndClassEx.hIconSm = NULL;
wndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
wndClassEx.lpfnWndProc = mainWndProc;
wndClassEx.hInstance = selfInstance;
wndClassEx.lpszClassName = MYCLASS;
if (!RegisterClassEx(&wndClassEx))
{
std::cout << "Window class registering failed!" << std::endl;
MessageBox(0, L"Window class registering failed!", MYTITLE, MB_ICONERROR);
return 0;
}
const int windowWidth = 640;
const int windowHeight = 480;
CreateWindow(wndClassEx.lpszClassName, MYTITLE,
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, windowWidth, windowHeight,
NULL, NULL, selfInstance, NULL);
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
if (!UnregisterClass(wndClassEx.lpszClassName, wndClassEx.hInstance))
{
std::cout << "Window class unregistering failed!" << std::endl;
}
return 0;
}
Но нет. Та же ошибка. При закрытии окна, дебаг-лог выдаёт:
Вызвано исключение по адресу 0x00007FFCB5F4531C в Window WinApi.exe: исключение Microsoft C++: wil::ResultException по адресу памяти 0x0000005A8A8FDE40.
Поток 0x3970 завершился с кодом 0 (0x0).
Поток 0x3a88 завершился с кодом 0 (0x0).
Поток 0x5470 завершился с кодом 0 (0x0).
Поток 0x4acc завершился с кодом 0 (0x0).
Поток 0x23ec завершился с кодом 0 (0x0).
Поток 0x428c завершился с кодом 0 (0x0).
Поток 0x5124 завершился с кодом 0 (0x0).
Поток 0x50f4 завершился с кодом 0 (0x0).
Поток 0xbe0 завершился с кодом 0 (0x0).
Программа "[15144] Window WinApi.exe" завершилась с кодом 0 (0x0).
А иногда вот так:
Вызвано исключение по адресу 0x00007FFCB5F4531C в Window WinApi.exe: исключение Microsoft C++: wil::ResultException по адресу памяти 0x000000DD822FDF40.
Вызвано исключение по адресу 0x00007FFCB5F4531C в Window WinApi.exe: исключение Microsoft C++: [rethrow] по адресу памяти 0x0000000000000000.
Поток 0x3714 завершился с кодом 0 (0x0).
Поток 0x1be4 завершился с кодом 0 (0x0).
Поток 0x4218 завершился с кодом 0 (0x0).
Поток 0x5784 завершился с кодом 0 (0x0).
Поток 0x5054 завершился с кодом 0 (0x0).
Поток 0x39f0 завершился с кодом 0 (0x0).
Поток 0x1370 завершился с кодом 0 (0x0).
Поток 0x4684 завершился с кодом 0 (0x0).
Программа "[21328] Window WinApi.exe" завершилась с кодом 0 (0x0).