2012-07-25 169 views
1

所以我试图进入一些directX编程,所以我正在关注这本名为“Beginning DirectX 11 Game Programming”的书,但我已经在第二个示例中卡住了。DirectX无法解析的外部错误

我花了大概一个小时寻找这个问题的解决方案,但没能找到任何可以帮助我的东西。

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

Main.obj : error LNK2019: unresolved external symbol "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" ([email protected]@[email protected]@[email protected]) referenced in function [email protected] 

而这里的代码 - 正好写在书中,除了LRESULT CALLBACK的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; 
} 
+1

您的WndProc函数定义在哪里? – 2012-07-25 21:50:00

+1

如果用'WndProc'替换分号';',并且返回'{return 0; }错误会消失,但这只会解开更多的问题。找到一个好的工作示例。了解它是如何工作的。 – 2012-07-25 21:52:30

回答

4

返回0WndProc回调IS一个可怕的想法如果你不处理任何消息。所以,你可以定义它自己处理的消息,或者干脆使用默认的程序:

wndClass.lpfnWndProc = DefWindowProc; 

或者:

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

,只要你不处理你的信息,你应该做的。

+1

不知道你可以做到这一点,总是写我的WndProc做些事情。好答案。 – 2012-07-25 22:54:11

+0

你需要在正文中调用DefWindowProc。 – Puppy 2012-07-29 17:02:48

0

你从来没有定义

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

任何地方。 @RomanR。有一个完美的答案,我同意这是一个不好的解决方案。回头看看第一个练习,看看它是否没有实现。

+0

从来没有任何提及任何WndProc,除了它只是在书中被称为 - 这是我不得不搜索和在网上找到的东西,因为我是全新的Windows编程 但非常感谢所有你的答案,它真的帮了我很大的时间:) – 2012-07-25 22:26:48

0

当我们讨论DirectX时,将WndProc定义为DefWindowProc并不是解决方案。大量用户以窗口模式运行游戏,这意味着您可以通过程序更新您的屏幕高宽比XMMatrixPerspectiveFovLH,更改缓冲区分辨率并在窗口大小调整后更新视口。另外,如果你想避免DirectInput本身,你可以简单地使用窗口消息WM_MOUSEMOVE; WM_LBUTTONDOWN; WM_LBUTTONUP等来管理你的鼠标和键盘状态 - 许多人仍然厌恶dinput8。

0

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

相关问题