我正在学习如何使用 C++ 创建一个 dll。
出现这个:
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
而且我无法理解 DllMain()
中的 "WINAPI"
是什么?
我知道一个函数是:
typeReturn functionName (params) { function body }
typeReturn
: 是函数返回的值,
functionName
: 是函数的名称,
params
: 是函数的参数,
{function body} : 是函数内部的代码。
...
那么,根据解释,WINAPI
在C++中是什么意思,或者__stdcall
?
我不是在问 WINAPI
本身是什么意思。
************ 更新 **************
C++ 有(调用约定)用于将以特殊方式给出的每个参数放入内存。
请正确阅读问题并避免将其标记为重复,因为学习c/c++的人需要学习而不是陷入困惑
WINAPI
定义为 __stdcall
。
其实__stdcall
是一个调用约定 不同的调用约定以不同的方式推送参数,下面是一些c/c++
调用约定:
在 x86 中:
C
调用约定 (__cdecl
)。 __cdecl
调用约定的主要特征是:
- 参数从右向左传递,并入栈。
- 堆栈清理由调用者执行。
- 函数名称通过在其前面加上下划线字符 '_' 进行修饰。
标准调用约定 (__stdcall
)。 __stdcall
调用约定的主要特征是:
- 参数从右向左传递,并入栈。
- 堆栈清理由调用的函数执行。
- 函数名通过在前面加上一个下划线字符并附加一个“@”字符和所需堆栈空间的字节数来修饰。
快速调用约定 (__fastcall
)。 __fastcall
调用约定的主要特征是:
- 前两个需要 32 位或更少位的函数参数被放入寄存器 ECX 和 EDX。其余的从右到左压入堆栈。
- 参数由调用的函数从堆栈中弹出。
- 函数名通过在前面加上一个
'@'
字符并附加一个'@'
和参数所需的空间字节数(十进制)来修饰。
Consider to Read This Link
在 x64 中:
在 x64
中,只有 __fastcall
存在。所有其他属性都将被忽略。
x64
应用程序二进制接口(interface) (ABI) 默认使用四寄存器 fast-call 调用约定。
注意:
当你调用一个函数时,在汇编级别发生的事情是所有传入的参数被压入堆栈或放入寄存器或放入静态存储,然后程序跳转到不同的代码区域。新的代码区域查看堆栈并期望将参数放在那里。
不同的调用约定以不同的方式推送参数。有些人可能会先推送第一个参数,有些人可能会最后推送第一个参数。或者有些人可能将参数保存在寄存器中,根本不推送它。
通过指定调用约定,您告诉编译器如何推送参数。