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

VC6.0 使用 ON_REGISTERED_MESSAGE 添加消息映射報錯 C2440 解決方法

     編輯:程式設計綜合問答

錯誤分析

編譯錯誤 C2440: cannot convert from 'long (__cdecl *)(UINT, LONG)' to 'long (CWnd::*)(UINT, LONG)' 表明消息處理函數簽名與宏期望的成員函數指針類型不匹配。

根本原因

ON_REGISTERED_MESSAGE 宏要求處理函數為 CWnd 的非靜態成員函數,簽名必須為:

afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam);

你的代碼中 OnFind 可能被聲明為 static、全局函數、或所在類非 CWnd 衍生類,導致 thiscall 約定不匹配。

修正步驟

  1. 確保類繼承自 CWnd(如 CFrameWnd、CDialog、CView)。
  2. 在類聲明中加入:afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
  3. 在消息映射中使用:ON_REGISTERED_MESSAGE(wm_Find, OnFind)
  4. 實現函數時返回 LRESULT,而非 long(雖在 32 位下相同,但語義更正確)。

完整示例

class CMainFrame : public CFrameWnd {
    DECLARE_MESSAGE_MAP()
    afx_msg LRESULT OnFind(WPARAM wParam, LPARAM lParam);
};

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_REGISTERED_MESSAGE(wm_Find, OnFind)
END_MESSAGE_MAP()

LRESULT CMainFrame::OnFind(WPARAM wParam, LPARAM lParam) {
    // 處理尋找/替換對話框消息
    return 0;
}

注意事項

  • RegisterWindowMessage 返回的 UINT 必須為全局/靜態變量,確保多模塊間一致。
  • VC6.0 年代久遠,建議遷移至 VS2019+,享受更完善的標準支持與調試體驗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved