首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Win32 對話框回調函數簽名錯誤:BOOL CALLBACK DialogProc 參數不匹配導致警告與運行異常

     編輯:程式設計綜合問答

錯誤現象

編譯警告:回調函數參數類型不匹配。運行時對話框閃退或不顯示。

標準簽名(MSDN 規範)


// 正確原型
BOOL CALLBACK DialogProc(
    HWND hwndDlg,   // 對話框窗口句柄
    UINT uMsg,      // 消息標識
    WPARAM wParam,  // 消息參數
    LPARAM lParam   // 消息參數
);

常見錯誤對比

錯誤寫法問題後果
void DialogProc(...)返回類型應為 BOOL棧平衡破壞,崩潰
BOOL DialogProc(HWND, int, int, int)缺 CALLBACK、類型寬度錯64位下參數截斷
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM)參數名無所謂,類型必須對正確

完整最小示例


#include 

BOOL CALLBACK MyDialogProc(HWND hDlg, UINT msg, WPARAM w, LPARAM l) {
    switch (msg) {
        case WM_INITDIALOG:
            return TRUE; // 讓系統設置默認焦點
        case WM_COMMAND:
            if (LOWORD(w) == IDOK || LOWORD(w) == IDCANCEL) {
                EndDialog(hDlg, LOWORD(w));
                return TRUE;
            }
            break;
    }
    return FALSE; // 未處理消息交給系統
}

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int) {
    DialogBox(hInst, MAKEINTRESOURCE(IDD_MYDIALOG), NULL, MyDialogProc);
    return 0;
}

資源腳本 (.rc) 關鍵點


IDD_MYDIALOG DIALOGEX 0, 0, 200, 150
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "標題"
FONT 9, "微軟雅黑"
BEGIN
    DEFPUSHBUTTON   "確定", IDOK, 50, 120, 50, 14
    PUSHBUTTON      "取消", IDCANCEL, 110, 120, 50, 14
    LTEXT           "內容文本", IDC_STATIC, 10, 10, 180, 80
END

調試技巧

  1. 啟用「調試時中斷於所有異常」捕獲棧破壞
  2. 用 OutputDebugString 追蹤回調進入
  3. 檢查資源 ID 是否與 MAKEINTRESOURCE 一致

嚴格遵循 BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM) 簽名,是 Win32 對話框正常運行的前提。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved