指向函数的指针和指向WINAPI函数的指针有什么区别?

时间:2010-06-19 06:49:54

标签: c++ winapi pointers

我来自一个代码段,它检测应用是否在x64 PC上的x32模拟环境中运行 here

一般来说,我理解代码,但有一件事我没有得到:

1)typedef BOOL(WINAPI * LPFN_ISWOW64PROCESS)(HANDLE,PBOOL);

为什么WINAPI必须在那里?为什么知道指针不指向我定义的函数而是指向WINAPI函数是如此重要?这两个指针会不同吗? (以大小,地点等方式创建等)。

谢谢,

克拉

3 个答案:

答案 0 :(得分:4)

WINAPI扩展为__stdcall(在大多数情况下 - 你不应该特别依赖于那个调用约定),这是一个与默认的__cdecl不同的调用约定。区别在于__stdcall中,调用的函数清除堆栈,而在__cdecl中,调用者清理堆栈。 __stdcall不支持像__cdecl这样的varadic(变量参数长度)函数,但__stdcall可以更快并且在某些情况下减少代码大小。

答案 1 :(得分:1)

WINAPI,通常包含与WinAPI函数相关的特定于实现的声明详细信息。就像一个召集会议。上面的指针可以指向任何函数,只要它遵循与WinAPI函数相同的调用约定。

这个宏拼写为WINAPI的事实没有任何意义。它可能拼写为AHELLO_WORLD或其他任何内容。 WINAPI宏的唯一要点是提供一个单独的位置,其中描述了所有这些特定于WinAPI的约定,以便在发生更改时您只需要在一个位置进行修改。

很容易就是一个无法解决的宏。

答案 2 :(得分:0)

同意之前的帖子。 BTW我真的不明白为什么__cdecl仍然被认为是C / C ++的“默认”调用约定。

显然使用__cdecl会产生比__stdcall略大的代码,因为函数只写了一次,并且通常在几个代码段中调用。是的,__cdecl更灵活,因为它允许变量参数长度。但是,只有用...标记的适当函数才能使用IMHO。

例如对于成员函数call(aka thiscall),Msvc就是这样做的:使用__stdcall - 就像调用约定一样,除非函数接受变量参数。 (此外,this通过ECX注册表传递。