c++ - 函数声明中的 WINAPI 标识符 DLL 入口函数中的 C++

标签 c++ c winapi dll calling-convention

<分区>

我正在学习如何使用 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 调用约定的主要特征是:

    1. 参数从右向左传递,并入栈。
    2. 堆栈清理由调用者执行。
    3. 函数名称通过在其前面加上下划线字符 '_' 进行修饰。
  • 标准调用约定 (__stdcall)__stdcall 调用约定的主要特征是:

    1. 参数从右向左传递,并入栈。
    2. 堆栈清理由调用的函数执行。
    3. 函数名通过在前面加上一个下划线字符并附加一个“@”字符和所需堆栈空间的字节数来修饰。
  • 快速调用约定 (__fastcall)__fastcall 调用约定的主要特征是:

    1. 前两个需要 32 位或更少位的函数参数被放入寄存器 ECXEDX。其余的从右到左压入堆栈。
    2. 参数由调用的函数从堆栈中弹出。
    3. 函数名通过在前面加上一个'@' 字符并附加一个'@' 和参数所需的空间字节数(十进制)来修饰。

Consider to Read This Link


在 x64 中:x64 中,只有 __fastcall 存在。所有其他属性都将被忽略。

x64 应用程序二进制接口(interface) (ABI) 默认使用四寄存器 fast-call 调用约定。


注意: 当你调用一个函数时,在汇编级别发生的事情是所有传入的参数被压入堆栈或放入寄存器或放入静态存储,然后程序跳转到不同的代码区域。新的代码区域查看堆栈并期望将参数放在那里。

不同的调用约定以不同的方式推送参数。有些人可能会先推送第一个参数,有些人可能会最后推送第一个参数。或者有些人可能将参数保存在寄存器中,根本不推送它。

通过指定调用约定,您告诉编译器如何推送参数。

关于c++ - 函数声明中的 WINAPI 标识符 DLL 入口函数中的 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51914379/

相关文章:

c++ - 在基类数组中使用子类方法的默认值

c++ - Linux中mremap函数的特点

c++ - C++ 中的多态加法

c - if 语句中的多个条件如何工作

c - 为什么 pthread_create 函数将线程函数名作为参数而不是调用它?

c++ - 数字文字运算符错误

c - 使用 calloc 设置双指针

C++11 和 Win32 wchar_t

c - 如何获取与打开的 HANDLE 关联的名称

c++ - C++ 中带有对象名称的 typedef 结构的前向声明