Windows 7 下 VS2010 創建經典 Win32 專案,`RegisterClass(&wndclass)` 返回失敗 (0),彈出「this program requried windows NT!」錯誤框。
if (!RegisterClass(&wndclass)) {
DWORD err = GetLastError(); // 關鍵:獲取具體錯誤碼
TCHAR msg[256];
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, err,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
msg, 256, NULL);
MessageBox(NULL, msg, TEXT("RegisterClass Failed"), MB_ICONERROR);
return 0;
}
| 錯誤碼 | 符號常量 | 可能原因 | 解決方案 |
|---|---|---|---|
| 1410 | ERROR_CLASS_ALREADY_EXISTS | 同進程已註冊同名窗口類 (如多次調用、上次運行殘留) | 檢查 `szAppName` 唯一性;進程退出時確保 `UnregisterClass`;或用 `GetClassInfo` 檢查是否已存在 |
| 87 | ERROR_INVALID_PARAMETER | `WNDCLASS` 結構體字段非法:`hInstance` 為 NULL、`lpfnWndProc` 為 NULL、`cbSize` 未設置 (WNDCLASSEX) | 確保 `wndclass.hInstance = hInstance`;`wndclass.lpfnWndProc = WndProc`;若用 `WNDCLASSEX` 必須設置 `cbSize = sizeof(WNDCLASSEX)` |
| 1409 | ERROR_CLASS_DOES_NOT_EXIST | 嘗試註冊的父類不存在 (極少見) | 檢查基類註冊順序 |
| 127 | ERROR_PROC_NOT_FOUND | 窗口過程函數符號無法解析 (DLL 導出問題) | 確保 `WndProc` 定義在同一編譯單元或正確導出 |
最佳回答核心:「RegisterClass失敗後,用GetLastError查看一下錯誤信息。是不是你類名等不正確」—— 直接給出標準排查手段,避免盲目猜測。