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

WINAPI identifiers in function declaration C++ in DLL entrypoint function

本文关键字:标识符 函数 入口 DLL WINAPI 声明 C++      更新时间:2023-10-16

我只是在学习如何用C++创建一个dll

出现这个:

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)

而且我不明白DllMain()"WINAPI"是什么?

我知道一个函数是:

typeReturn functionName (params) { function body }

typeReturn:是函数返回的值,
functionName:是函数的名称,
params:是函数的参数,
{函数体}:是函数内部的代码。
...

那么,按照解释,WINAPIC++那个或__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. 函数名称由'@'字符前置并附加'@'和参数所需的空间字节数(十进制(来修饰。

考虑阅读此链接


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

默认情况下,x64应用程序二进制接口 (ABI( 使用四寄存器快速调用约定。


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

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

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

动态链接库,用于Windows操作系统,因此如果DLL函数在Windows上运行,则DLL函数的入口点应以"WINAPI"加冕。