Я получаю сообщение об ошибке ERROR_INVALID_WINDOW_HANDLE, когда CreateWindowEx() сбой в моей программе. Я использую C++ с собственным API Win32.ERROR_INVALID_WINDOW_HANDLE от CreateWindowEx()
Я понятия не имею, почему, и я попытался сыграть с некоторыми параметрами в CreateWindowEx, но он все равно производит ту же самую ошибку каждый раз.
Я также попытался добавить W
к случайным функциям и типам данных, надеясь, что версия UNICODE как-то работает ... ничего не изменилось, конечно.
Это функция, которая вызывает CreateWindowEx():
int InitMainWindow(HWND *hwnd, WNDCLASSEXW *wnd, WNDPROC wndproc)
{
memset(wnd, NULL, sizeof(WNDCLASSEXW));
wnd->cbSize = sizeof(WNDCLASSEXW);
wnd->lpszClassName = L"MainWClass";
wnd->lpfnWndProc = wndproc;
wnd->hInstance = GetModuleHandle(NULL);
if(NULL == RegisterClassExW(wnd))
{
printf("InitMainWindow::RegisterClassexW() error: %d\r\n", GetLastError());
return GetLastError();
}
*hwnd = CreateWindowExW
(
WS_EX_ACCEPTFILES | WS_EX_APPWINDOW, //extended styles
wnd->lpszClassName, //class name
L"MainWindow", //window name
WS_OVERLAPPEDWINDOW | WS_VISIBLE, //style tags
CW_USEDEFAULT, //horizontal position
CW_USEDEFAULT, //vertical position
900, //width
600, //height
GetDesktopWindow(), //parent window
NULL, //class menu
GetModuleHandle(NULL), //some HINSTANCE pointer
NULL //Create Window Data?
);
if(NULL == *hwnd)
{
printf("InitMainWindow::CreateWindowEx() error: %d\r\n", GetLastError());
return GetLastError();
}
return 0;
}
Это основной метод:
static HWND mainhwnd;
void main()
{
DWORD time;
time = GetTickCount();
MSG msg;
WNDCLASSEXW wnd = { 0 };
NOTIFYICONDATA nid;
InitMainWindow(&mainhwnd, &wnd, MainWndProc);
InitNotifyIcon(&mainhwnd, &nid);
ShowWindow(mainhwnd, true);
UpdateWindow(mainhwnd);
time = (GetTickCount() - time);
std::cout << "Time: " << time << "\r\n" << std::endl;
for(; ;) //message loop
{
while(GetMessage(&msg, NULL, 0, 0))
{
if(WM_CLOSE == msg.message) //reassign close button to minimize to tray
{
printf("close\r\n");
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
/*if(!IsDialogMessage(hwndListDialog, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}*/
}
Sleep(5);
}
}
Это моя процедура для Windows:
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_CREATE:
printf("Main Window Create.......SUCCESS");
break;
default:
break;
}
return DefWindowProc(mainhwnd, uMsg, wParam, lParam);
}
Вы использовали GetLastError? –
'1.' Что является результатом вызова RegisterClassEx? '2.' Вы когда-нибудь называли свое окно? –
@ Mr.Disappointment Я назвал GetLastError(), вот как я знаю, что получаю ERROR_INVALID_WINDOW_HANDLE. – Joshua