C++ DirectX未解决的外部错误

C++ DirectX未解决的外部错误,c++,directx,external,C++,Directx,External,因此,我试图进入一些directX编程,所以我遵循这本书,叫做《开始directX 11游戏编程》,但我已经被第二个例子卡住了 我花了大约一个小时来寻找这个问题的解决方案,但没有找到任何对我有帮助的方法 所以我得到的错误代码是: Main.obj : error LNK2019: unresolved external symbol "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc

因此,我试图进入一些directX编程,所以我遵循这本书,叫做《开始directX 11游戏编程》,但我已经被第二个例子卡住了

我花了大约一个小时来寻找这个问题的解决方案,但没有找到任何对我有帮助的方法

所以我得到的错误代码是:

Main.obj : error LNK2019: unresolved external symbol "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) referenced in function _wWinMain@16
这里的代码和书中写的完全一样,除了LRESULT回调WndProc

#include <Windows.h>

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );

int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE prevInstance, LPWSTR cmdLine, int cmdShow )
{
    UNREFERENCED_PARAMETER( prevInstance );
    UNREFERENCED_PARAMETER( cmdLine );

    WNDCLASSEX wndClass = { 0 };
    wndClass.cbSize = sizeof( WNDCLASSEX );
    wndClass.style = CS_HREDRAW | CS_VREDRAW;
    wndClass.lpfnWndProc = WndProc;
    wndClass.hInstance = hInstance;
    wndClass.hCursor = LoadCursor( NULL, IDC_ARROW );
    wndClass.hbrBackground = ( HBRUSH )( COLOR_WINDOW + 1 );
    wndClass.lpszMenuName = NULL;
    wndClass.lpszClassName = "DX11BookWindowClass";

    if( !RegisterClassEx( &wndClass ) )
        return -1;

    RECT rc = { 0,0,640,480 };
    AdjustWindowRect( &rc, WS_OVERLAPPEDWINDOW, FALSE );

    HWND hwnd = CreateWindowA( "DX11BookWindowClass", "Blank Win32 Window", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left,
                                rc.bottom - rc.top, NULL, NULL, hInstance, NULL );

    if( !hwnd )
        return -1;

    ShowWindow( hwnd, cmdShow );

    return 0;
}
#包括
LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM);
int-WINAPI-wWinMain(HINSTANCE-HINSTANCE、HINSTANCE-prevInstance、LPWSTR-cmdLine、int-cmdShow)
{
未引用的_参数(prevInstance);
未引用的_参数(cmdLine);
wndClass x wndClass={0};
wndClass.cbSize=sizeof(WNDCLASSEX);
wndClass.style=CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.hInstance=hInstance;
wndClass.hCursor=LoadCursor(空,IDC_箭头);
wndClass.hbrBackground=(HBRUSH)(颜色窗口+1);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=“DX11BookWindowClass”;
如果(!RegisterClass(&wndClass))
返回-1;
RECT rc={0,0640480};
AdjustWindowRect(&rc,WS_OVERLAPPEDWINDOW,FALSE);
HWND HWND=CreateWindowA(“DX11BookWindowClass”、“空白Win32窗口”、WS_重叠窗口、CW_使用默认值、CW_使用默认值、rc.right-rc.left、,
rc.bottom-rc.top,NULL,NULL,hInstance,NULL);
如果(!hwnd)
返回-1;
ShowWindow(hwnd、cmdShow);
返回0;
}
您从未定义

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );
任何地方@罗曼。有一个完美的答案,我同意这是一个糟糕的解决方案。回到第一个练习,看看它是否没有实现。

您从未定义过

LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );

任何地方@罗曼。有一个完美的答案,我同意这是一个糟糕的解决方案。回到第一个练习,看看它是否没有实现。

如果不处理任何消息,从
WndProc
回调返回
0
是一个糟糕的主意。因此,您可以自己定义它来处理消息,也可以简单地使用默认过程:

wndClass.lpfnWndProc = DefWindowProc;
或者:

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { return DefWindowProc(hWnd, msg, wParam, lParam); }

当您不处理邮件时,您应该这样做。

如果您不处理任何邮件,则从
WndProc
回调返回
0
是一个糟糕的主意。因此,您可以自己定义它来处理消息,也可以简单地使用默认过程:

wndClass.lpfnWndProc = DefWindowProc;
或者:

LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { return DefWindowProc(hWnd, msg, wParam, lParam); }

当您不处理邮件时,您应该这样做。

在讨论DirectX时,将WndProc定义为
DefWindowProc
不是解决方案。许多用户在窗口模式下运行游戏,这意味着您可以为
XMMatrixPerspectiveFovLH
更新纵横比,更改缓冲区的分辨率,并在窗口变大时更新视口。以后如果你想避免直接输入,你只需使用windowmessages
WM\u MOUSEMOVE;沃姆·布顿顿顿;WM_LBUTTONUP
等来管理您的鼠标和键盘状态-许多人仍然讨厌dinput8。

当我们讨论DirectX时,将WndProc定义为
DefWindowProc
不是解决方案。许多用户在窗口模式下运行游戏,这意味着您可以为
XMMatrixPerspectiveFovLH
更新纵横比,更改缓冲区的分辨率,并在窗口变大时更新视口。以后如果你想避免直接输入,你只需使用windowmessages
WM\u MOUSEMOVE;沃姆·布顿顿顿;WM_LBUTTONUP
,等等来管理您的鼠标和键盘状态-许多人仍然讨厌dinput8。

我刚刚在阅读这本书时犯了同样的错误,如果你在图2.4之后继续阅读,你会注意到它实际上为你回答了这个问题,并且有一个关于windows回调过程的完整小节。

我刚刚在阅读这本书时犯了同样的错误,如果您在图2.4之后继续阅读,您会注意到它实际上回答了您的问题,并且有一个关于windows回调过程的完整小节。

您的
WndProc
函数定义在哪里?如果您替换分号
在带有
WndProc
{return 0;}
的行中,错误将消失,但这只会解锁更多问题。找到一个好的工作样本。了解它是如何工作的。您的
WndProc
函数定义在哪里?如果您替换分号
在带有
WndProc
{return 0;}
的行中,错误将消失,但这只会解锁更多问题。找到一个好的工作样本。了解它是如何工作的。除了书中提到的WndProc之外,从来没有提到过任何WndProc——这是我必须在网上搜索和查找的东西,因为我对windows编程是全新的,但非常感谢你所有的答案,它真的帮了我大忙:)从来没有提到过任何WndProc,除了在书中被称为之外——这是我必须在网上搜索和查找的东西,因为我对windows编程是全新的,但非常感谢你所有的回答,这真的帮了我很大的忙:)不知道你能做到这一点,总是写我的WndProc来做一些事情。回答得好。你需要在身体里调用DefWindowProc。不知道你可以这么做,总是写我的WndProc来做一些事情。回答得好。你需要在正文中实际调用DefWindowProc。