Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么该指针(WinProc中的pGame)为空?_C++_Windows_Oop_Winapi_Pointers - Fatal编程技术网

C++ 为什么该指针(WinProc中的pGame)为空?

C++ 为什么该指针(WinProc中的pGame)为空?,c++,windows,oop,winapi,pointers,C++,Windows,Oop,Winapi,Pointers,这是我的WinMain: int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nShowCmd) { if(SUCCEEDED(CoInitialize(NULL))) { { Game game; game.CreateRessources(hInst); game.ShowMainS

这是我的WinMain:

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);
    }
}
这是游戏::CreateResources:

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

    pD2DResources=CreateD2DResources(m_hWnd);
    pMessageLog=CreateMessageLog();
    pWinsock=CreateWinsock();
}
最后,我的WinProc在以下几行之后稍微向上:if(pGame==NULL) MessageBox(NULL,“指针pGame为NULL”,“错误”,NULL)

LRESULT回调WinProc(HWND-HWND,UINT-msg,WPARAM-WPARAM,LPARAM-LPARAM)
{
如果(msg==WM_CREATE)
{
LPCREATESTRUCT pcs=(LPCREATESTRUCT)lpram;
游戏*pGame=(游戏*)PC->lpCreateParams;
::SetWindowLongPtrW(
hWnd,
GWLP_用户数据,
PtrToUlong(pGame)
);
}
否则如果(msg==WM_)
{
PostQuitMessage(0);
返回0;
}
其他的
{
游戏*pGame=重新解释施法(静态施法)(
::GetWindowLongPtrW(
hWnd,
GWLP_用户数据
)));
if(pGame==NULL)
MessageBox(NULL,“指针pGame为NULL”,“错误”,NULL);
如果(pGame->pD2DResources!=NULL)
{
开关(msg)
{
由于某种原因,由于MessageBox弹出,pGame为空。为什么


编辑:顺便说一下,我正在动态创建一些对象,我的游戏对象中的私有指针被分配给这些动态创建的对象。这可能与问题有关吗?

因为
WM\u CREATE
不是窗口过程得到的第一条消息。请参阅
WM\u NCCREATE
,因为
WM\u CREATE
不是窗口过程获取的第一条消息。如果(msg==WM\u CREATE),请参见下面的提示中的
WM\u NCCREATE

下面还有几行。很高兴知道。在WM_CREATE之前发送了什么消息?
WM_NCCREATE
WM_CREATE
之前发送,但这不是问题,因为
这个
指针是与
WM_CREATE
消息一起发送的。我看不到所有代码,但调用后应该返回
TRUE
ODE > StWistWORLPORTWR>代码>这里,你会发现一个更好的C++应用模板:它得到所有指针的东西和窗口创建消息。你试过用调试器来步进你的WNDPROC吗?如果没有,为什么不呢?在下面的BrAuSts中(MSG==WMYCube)下面还有几行。很高兴知道。在WM_CREATE之前发送了什么消息?
WM_NCCREATE
WM_CREATE
之前发送,但这不是问题,因为
这个
指针是与
WM_CREATE
消息一起发送的。我看不到所有代码,但调用后应该返回
TRUE
ODE > StWistWORLPORTWR>代码>这里,你会发现一个更好的C++应用程序模板:它得到所有指针的东西和窗口创建消息。你试过用调试器来跳过WNDPROC吗?如果没有,为什么不呢?我甚至见过像“代码> WMGGETMIXMAX WMYNCCREATE/<代码>之前的实例。n在
WM\u NCCREATE
之前出现的消息实例,如
WM\u GETMINMAX
info。
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)
            {