繁体   English   中英

winapi函数的函数指针(stdcall / cdecl)

[英]Function pointers for winapi functions (stdcall/cdecl)

请问有人可以给我一些创建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;

修复调用约定不匹配,如下所示:

LRESULT (__stdcall * dwp)(HWND, UINT, WPARAM, LPARAM) = DefWindowProc;

typedef可以使它更具可读性:

typedef LRESULT (__stdcall * WindowProcedure)(HWND, UINT, WPARAM, LPARAM);
...
WindowProcedure dwp = DefWindowProc;

但是, <windows.h>已经有了一个typedef,你可以使用它:

WNDPROC dwp = DefWindowProc;

你的原型中缺少__stdcall 除了匹配的原型之外,您还需要具有匹配的调用约定 WINAPI函数都是__stdcall ,而C ++的默认函数是__cdecl

使用extern "C" { code }是一种可行的替代方案。

这不是'疯狂'的MS ascii / wide宏,你只有2个不同的函数声明。

如果用它周围的“extern C”装饰你的内部函数,你将使用与原始函数相同的调用类型公开你的函数,它将被编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM