2012-03-19 5 views
3

Я получаю сообщение об ошибке 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); 
} 
+0

Вы использовали GetLastError? –

+0

'1.' Что является результатом вызова RegisterClassEx? '2.' Вы когда-нибудь называли свое окно? –

+0

@ Mr.Disappointment Я назвал GetLastError(), вот как я знаю, что получаю ERROR_INVALID_WINDOW_HANDLE. – Joshua

ответ

8

Я думаю, проблема связана с вашим вызовом DefWindowProc.

Попробуйте изменить строку:

return DefWindowProc(mainhwnd, uMsg, wParam, lParam); 

Для этого:

return DefWindowProc(hwnd, uMsg, wParam, lParam); 

Я только что собрали свой код здесь с этим изменением, и он работает нормально.

+0

Спасибо! Это была глупая ошибка, я не хотел набирать mainhwnd. – Joshua

1

Я бы сказал, что ваш MainWndProcIS называется, и проблема заключается в том, что вы передаете mainhwnd как DefWindowProc аргумент, в то время как он все еще не инициализирован. Вы должны делать это:

return DefWindowProc(hwnd, uMsg, wParam, lParam); 
+0

Спасибо! Извините, я могу отметить только один ответ как окончательный. – Joshua

Смежные вопросы