我用 c 写了一些代码来制作简单的 win32 window 但失败了

I wrote some code in c to make simple win32 window but failed

我收到以下错误:

LNK1120: 第 1 行有 1 个未解决的外部问题

错误 LNK2019:函数 _WinMain@16 C:\Users\giorgi\Documents\Visual Studio 2013\Projects\Hello\Hello\Source.obj Hello

中引用了未解析的外部符号 _winproc@20

我是 WinApi 的新手,请帮忙。

#include <windows.h>


LRESULT CALLBACK winproc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR LpCmdLine, int nCmdShow)
{

WNDCLASSEX class;
ZeroMemory(&class, sizeof(WNDCLASSEX));

class.cbSize = sizeof(WNDCLASSEX);
class.style = CS_HREDRAW | CS_VREDRAW;
class.lpfnWndProc = (WNDPROC)winproc;
class.cbClsExtra = 0;
class.cbWndExtra = 0;
class.hInstance = hInstance;
class.hIcon = NULL;
class.hCursor = LoadCursor(NULL, IDC_ARROW);
class.hbrBackground = (HBRUSH)COLOR_WINDOW;
class.lpszClassName = "window class";
class.lpszMenuName = NULL;
class.hIconSm = NULL;

RegisterClassEx(&class);



HWND hwnd = CreateWindowEx
    (
    WS_EX_ACCEPTFILES,
    "window class",
    "window",
    WS_OVERLAPPED,
    200,
    200,
    800,
    600,
    NULL,
    NULL,
    hInstance,
    NULL
    );


ShowWindow(hwnd, nCmdShow);


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


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

return 0;
}


LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch (msg)
{
case WM_DESTROY:
{
    PostQuitMessage(0);
    return 0;
}
    break;
}

return DefWindowProc(hwnd, msg, wp, lp);

}

正如其他人所说,C 区分大小写,因此 winprocWinProc 将是两个不同的函数。您还需要确保您的 windows 过程的签名与 Windows 期望的相匹配,因此进行以下更改:

  1. LRESULT CALLBACK winproc(WNDPROC lpPrevWndFunc, HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);更改为LRESULT CALLBACK winProc(HWND, UINT, WPARAM, LPARAM);

  2. class.lpfnWndProc = (WNDPROC)winproc;更改为class.lpfnWndProc = (WNDPROC)winProc;

  3. LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)更改为LRESULT CALLBACK winProc(HWND hwnd, UINT mgs, WPARAM wp, LPARAM lp)

最后,自从我在 win32-API 级别编程以来已经有一段时间了,但我相信你的 windows 程序应该如下所示:

    LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {
        switch (msg)
        {
            case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
            break;

            default:
                return DefWindowProc(hwnd, msg, wp, lp);
        }
    }

换句话说,如果您不自己处理消息,您只想 return 默认 window 过程 (DefWindowProc)。