2013-03-18 2 views
0

Это мой WinMain:Почему этот указатель (pGame внутри WinProc) NULL?

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) 
{ 
    if(SUCCEEDED(CoInitialize(NULL))) 
    { 
     { 
      Game game; 

      game.CreateRessources(hInst); 

      game.ShowMainScreen(); 

      HWND hwnd=game.Getm_hWnd(); 
      HWND* pHWND=&hwnd; 

      game.pWinsock->Initialize(hwnd); 

      ShowWindow(game.Getm_hWnd(),SW_MAXIMIZE); 
      UpdateWindow(game.Getm_hWnd()); 

      MSG msg; 
      ZeroMemory(&msg,sizeof(MSG)); 

      while(GetMessage(&msg,NULL,0,0)) 
      { 
       TranslateMessage(&msg); 
       DispatchMessage(&msg); 
      } 
     } 
     CoUninitialize(); 
    } 

    return 0; 
} 

Существует мой класс создания окна:

void Game::CreateWindowClass(HINSTANCE hInst) 
{ 
    // Create a window class 
    WNDCLASSEX wClass; 
    ZeroMemory(&wClass,sizeof(WNDCLASSEX)); 
    wClass.cbClsExtra=NULL; 
    wClass.cbSize=sizeof(WNDCLASSEX); 
    wClass.cbWndExtra=NULL; 
    wClass.hbrBackground=(HBRUSH)COLOR_WINDOW; 
    wClass.hCursor=LoadCursor(NULL,IDC_ARROW); 
    wClass.hIcon=NULL; 
    wClass.hIconSm=NULL; 
    wClass.hInstance=hInst; 
    wClass.lpfnWndProc=WinProc; 
    wClass.lpszClassName="Window Class"; 
    wClass.lpszMenuName=NULL; 
    wClass.style=CS_HREDRAW|CS_VREDRAW; 

    if(!RegisterClassEx(&wClass)) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL,"Failed to register window class","Window Class Failed",MB_ICONERROR); 
    } 

    m_hWnd=CreateWindowEx(NULL, 
      "Window Class", 
      "Game", 
      WS_OVERLAPPEDWINDOW|WS_MAXIMIZE, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      NULL, 
      NULL, 
      hInst, 
      this); 

    if(!m_hWnd) 
    { 
     int nResult=GetLastError(); 

     MessageBox(NULL,"Window class creation failed","Window Class Failed",MB_ICONERROR); 
    } 
} 

Это игры :: CreateRessources:

void Game::CreateRessources(HINSTANCE hInst) 
{ 
    CreateWindowClass(hInst); 

    pD2DResources=CreateD2DResources(m_hWnd); 
    pMessageLog=CreateMessageLog(); 
    pWinsock=CreateWinsock(); 
} 

И, наконец, мой WinProc до слегка после строк: if (pGame == NULL) MessageBox (NULL, «Pointer pGame NULL», «Error», NULL);

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    if(msg==WM_CREATE) 
    { 
     LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam; 
      Game* pGame = (Game*)pcs->lpCreateParams; 

      ::SetWindowLongPtrW(
       hWnd, 
       GWLP_USERDATA, 
       PtrToUlong(pGame) 
       ); 
    } 

    else if(msg==WM_DESTROY) 
    { 
     PostQuitMessage(0); 
     return 0; 
    } 

    else 
    { 
     Game* pGame = reinterpret_cast<Game*>(static_cast<LONG_PTR>(
      ::GetWindowLongPtrW(
       hWnd, 
       GWLP_USERDATA 
       ))); 

     if(pGame==NULL) 
      MessageBox(NULL,"Pointer pGame is NULL","Error",NULL); 

     if(pGame->pD2DResources!=NULL) 
     { 
      switch(msg) 
      { 

По какой-то причине pGame имеет значение NULL с момента появления MessageBox. Почему так?

Редактировать: Кстати, я динамически создаю несколько объектов, и частные указатели внутри моего игрового объекта назначаются этим динамически созданным объектам. Может ли это иметь дело с проблемой?

+0

В следующих брейках if (msg == WM_CREATE), а еще несколько строк ниже. –

+0

Полезно знать. Какие сообщения отправляются перед WM_CREATE? –

+0

Это сработало бы до того, как я изменил многие вещи внутри своего кода. Я мог бы получить доступ к объекту, созданному вне моего WinProc. –

ответ

4

Потому что WM_CREATE не является первым сообщением, которое обрабатывает окно. См. WM_NCCREATE.

+2

Я даже видел экземпляры сообщений типа 'WM_GETMINMAX', которые случаются до' WM_NCCREATE'. –

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