【发布时间】:2025-12-20 18:55:05
【问题描述】:
请有人给我一些关于为 MS winapi 函数创建函数指针的提示吗?我正在尝试为 DefWindowProc (DefWindowProcA/DefWindowProcW) 创建一个指针,但收到此错误:
LRESULT (*dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;
error C2440: 'initializing' : cannot convert from
'LRESULT (__stdcall *)(HWND,UINT,WPARAM,LPARAM)'
to 'LRESULT (__cdecl *)(HWND,UINT,WPARAM,LPARAM)'
我不知道我需要使用什么,因为我不习惯 MS ascii/wide 宏。顺便说一句,我正在创建一个函数指针来快速破解,不幸的是我没有时间解释原因 - 但无论如何,我认为这个问题对需要创建 winapi 函数指针的人会有帮助。
更新:
此代码有效,但我担心这是不好的做法(并且不遵守 unicode/ascii 编译选项)。我应该定义两个规范吗?
LRESULT (__stdcall* dwp)(HWND, UINT, WPARAM, LPARAM) = &DefWindowProc;
更新 2:
这更好(感谢 nobugz):
WNDPROC dwp = DefWindowProc;
【问题讨论】:
-
我认为确保您的调用约定匹配没有任何不好的做法。
-
然而,MS 有 3 种不同的调用约定太疯狂了,他们应该选择一个并坚持下去!
-
MS 不负责 __cdecl,几乎不负责 __fastcall。 64 位代码只有一种调用约定。谁添加另一个将被枪杀。
-
Nobugz,微软也有thiscall,这是methods的默认设置。它与 cdecl、stdcall 或 thiscall 中的任何一个都不兼容。而且微软的 thiscall 和 Borland 的不一样。
标签: c++ winapi function-pointers