創建 Win32 應用程序項目後編譯報錯:「未定義 WinMain 函數」 或鏈接器找不到入口點。
Windows GUI 程序(非控制台)的入口點是 WinMain,而非標準 C++ 的 main。函數簽名固定:
int WINAPI WinMain(
HINSTANCE hInstance, // 當前實例句柄
HINSTANCE hPrevInstance, // 已棄用,總為 NULL
LPSTR lpCmdLine, // 命令行參數
int nCmdShow // 窗口顯示狀態
);
main,無法直接寫 GUI 代碼。#include
// 窗口過程函數前置聲明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
// 1. 註冊窗口類
WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.hInstance = hInstance;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wcex.lpszClassName = L"MyWindowClass";
RegisterClassEx(&wcex);
// 2. 創建窗口
HWND hWnd = CreateWindow(
L"MyWindowClass", L"標題", WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, NULL, hInstance, NULL
);
if (!hWnd) return FALSE;
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// 3. 消息循環
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
// 窗口過程實現
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_DESTROY: PostQuitMessage(0); break;
default: return DefWindowProc(hWnd, msg, wParam, lParam);
}
return 0;
}
L"字符串" 和 W 結尾 API(如 RegisterClassExW)。L 前綴,API 用 A 結尾。int main() → 鏈接錯誤 unresolved external symbol WinMain。WINAPI(即 __stdcall)調用約定 → 棧平衡錯誤。WNDCLASSEX.cbSize 未設置 → 結構體大小錯誤導致註冊失敗。Win32 GUI 程序必須提供 WinMain 入口,包含窗口類註冊、窗口創建、消息循環三大核心步驟。新建項目時選對類型,補全標準模板代碼即可解決。