函数声明中的 WINAPI 标识符C++ DLL 入口点函数中的标识符
WINAPI identifiers in function declaration C++ in DLL entrypoint function
我只是在学习如何用C++创建一个dll。
出现这个:
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
而且我不明白DllMain()
"WINAPI"
是什么?
我知道一个函数是:
typeReturn functionName (params) { function body }
typeReturn
:是函数返回的值,functionName
:是函数的名称,params
:是函数的参数,
{函数体}:是函数内部的代码。
...
那么,按照解释,WINAPI
C++那个或__stdcall
是什么意思?
我不是在问WINAPI
本身意味着什么。
************更新**************
C++具有(调用约定(,用于将以特殊方式给出的每个参数放入内存中。 请正确阅读问题并避免将其标记为重复,因为学习C/C ++的人需要学习而不会陷入混乱
WINAPI
定义为__stdcall
。
实际上__stdcall
是一个调用约定,不同的调用约定以不同的方式推送参数,下面是c/c++
调用约定中的一些:
在 x86 中:
-
C
调用约定(__cdecl
(。__cdecl
调用约定的主要特征是:- 参数从右向左传递,并放置在堆栈上。
- 堆栈清理由调用方执行。
- 函数名称通过在它前面加上下划线字符"_"来装饰。
-
标准调用约定(
__stdcall
(。__stdcall
调用约定的主要特征是:- 参数从右向左传递,并放置在堆栈上。
- 堆栈清理由调用的函数执行。
- 函数名称通过在下划线字符前面加上"@"字符以及所需的堆栈空间字节数来修饰。
-
快速调用约定(
__fastcall
(__fastcall
调用约定的主要特征是:- 需要 32 位或更少位的前两个函数参数被放入寄存器ECX和EDX中。其余的从右到左推到堆栈上。
- 参数由被调用的函数从堆栈中弹出。
- 函数名称由
'@'
字符前置并附加'@'
和参数所需的空间字节数(十进制(来修饰。
考虑阅读此链接
在 x64 :
Inx64
中,只有__fastcall
存在。忽略所有其他属性。
默认情况下,x64
应用程序二进制接口 (ABI( 使用四寄存器快速调用约定。
注意: 当你调用一个函数时,在程序集级别发生的情况是所有传入的参数都被推送到堆栈或放置在寄存器中或放置在静态存储中,然后程序跳转到不同的代码区域。新的代码区域查看堆栈,并期望将参数放置在那里。
不同的调用约定以不同的方式推送参数。有些可能会先推送第一个参数,或者有些可能会最后推送第一个参数。或者有些人可能会将参数保留在寄存器中,根本不推送它。
通过指定调用约定,您可以告诉编译器如何推送参数。
动态链接库,用于Windows操作系统,因此如果DLL函数在Windows上运行,则DLL函数的入口点应以"WINAPI"加冕。
- 在模板化函数中重新定义(忽略)的 SWIG 标识符
- 在 c++ 中找不到此函数的标识符
- 声明与 const 变量和成员函数相同的标识符
- 我的函数调用 (C++) 中的未声明标识符
- 函数声明中的 WINAPI 标识符C++ DLL 入口点函数中的标识符
- 由于值返回函数中的错误,程序无法编译.它说未声明的标识符
- im调用函数时找不到标识符?
- 将函数标识符作为右值引用传递并对其应用 std::move()
- 错误 C2146:语法错误:按函数传递映射时标识符 mType 之前缺少','
- C 如何从构造函数中声明(错误C2065未宣布的标识符)
- C++ 多态构造函数错误;标识符未定义
- 调用函数时未定义标识符"function_name"
- 为什么在函数参数编译中没有标识符的const关键字
- 当通过函数中的参考调用时,标识符不确定
- 在检查传递函数标识符时是否获得模板参数时遇到问题
- 函数参数中未声明和未定义的标识符
- 使用函数模板中静态局部变量的地址作为类型标识符是否安全
- C++构造函数:数字常量之前的预期标识符
- 找不到QT 5.6 update()函数标识符
- 不存在的标识符在非启用函数模板中用作默认参数