我来自一个代码段,它检测应用是否在x64 PC上的x32模拟环境中运行 here
一般来说,我理解代码,但有一件事我没有得到:
1)typedef BOOL(WINAPI * LPFN_ISWOW64PROCESS)(HANDLE,PBOOL);
为什么WINAPI必须在那里?为什么知道指针不指向我定义的函数而是指向WINAPI函数是如此重要?这两个指针会不同吗? (以大小,地点等方式创建等)。
谢谢,
克拉
答案 0 :(得分:4)
WINAPI扩展为__stdcall(在大多数情况下 - 你不应该特别依赖于那个调用约定),这是一个与默认的__cdecl不同的调用约定。区别在于__stdcall中,调用的函数清除堆栈,而在__cdecl中,调用者清理堆栈。 __stdcall不支持像__cdecl这样的varadic(变量参数长度)函数,但__stdcall可以更快并且在某些情况下减少代码大小。
答案 1 :(得分:1)
WINAPI
是宏,通常包含与WinAPI函数相关的特定于实现的声明详细信息。就像一个召集会议。上面的指针可以指向任何函数,只要它遵循与WinAPI函数相同的调用约定。
这个宏拼写为WINAPI
的事实没有任何意义。它可能拼写为A
,HELLO_WORLD
或其他任何内容。 WINAPI
宏的唯一要点是提供一个单独的位置,其中描述了所有这些特定于WinAPI的约定,以便在发生更改时您只需要在一个位置进行修改。
很容易就是一个无法解决的宏。
答案 2 :(得分:0)
同意之前的帖子。
BTW我真的不明白为什么__cdecl
仍然被认为是C / C ++的“默认”调用约定。
显然使用__cdecl
会产生比__stdcall
略大的代码,因为函数只写了一次,并且通常在几个代码段中调用。是的,__cdecl
更灵活,因为它允许变量参数长度。但是,只有用...
标记的适当函数才能使用IMHO。
例如对于成员函数call(aka thiscall
),Msvc就是这样做的:使用__stdcall
- 就像调用约定一样,除非函数接受变量参数。
(此外,this
通过ECX
注册表传递。