【问题标题】:Why need to use "WINAPI*" for the Syntax for declaring function pointers for functions in a DLL为什么需要使用“WINAPI*”作为为 DLL 中的函数声明函数指针的语法
【发布时间】:2013-09-25 14:45:56
【问题描述】:

我有一个 C++ 控制台应用程序和一个 DLL。在 C++ 应用程序中,我看到以下 sn-p ::

typedef DWORD (WINAPI* functABC)(unsigned long*);

functABC functABC111;
HMODULE handleDLL = LOadLibrary("a.DLL");
functABC111 = (functABC)GetProcAddress(handleDLL,"function_1");

在高层次上,我了解我们正在获取指向 a.DLL“function_1()”中函数的函数指针。

但是想了解上面sn -p ::

中的第12行
typedef DWORD (WINAPI* functABC)(unsigned long*);
functABC functABC111;

2 个问题 :: 1) 名称“functABC”只是一个随机函数指针名称吗?
2)我们在这两条线上在技术上做了什么。声明函数指针。
3) 为什么我们需要在第一行的函数指针声明中使用 WINAPI*。

提前致谢。

【问题讨论】:

    标签: c++ winapi visual-c++ function-pointers stdcall


    【解决方案1】:
    1. 'functABC' 是返回 DWORD无符号长指针 作为参数的函数的 typedef

    2. 第一行定义一个 typedef,第二行使用它创建一个函数指针

    3. 'WINAPI' 是一个宏,通常扩展为 '__stdcall',这是 Microsoft 用于导出的调用约定来自 .DLL

    4. 的函数

    【讨论】:

    • 2 个问题 :: "functABC" 只是一个 typedef 名称,所以显然我们可以赋予 anyName 权利。从这个typedef(在我们的例子中是functABC111)创建的函数指针变量可以用来指向任何具有这个签名的函数吗?如果有多个具有相同签名的函数,那么我们需要创建各种函数指针变量,如 functABC111_1、functABC111_2 等……所有类型为 functABC。我说的对吗?
    • 您的第三点有些误导。从 .dll 导出函数时,不需要使用 __stdcall。您也可以使用__cdecl 导出函数。重要的是函数声明和实现具有匹配的调用约定。 x64 的事情没有那么复杂:只有一个调用约定。
    【解决方案2】:

    3) 几乎所有的 Windows 函数(来自 shell32.dll、user32.dll 和所有其他函数)都被声明为 __stdcallWINAPI(同样的事情)。不需要将DLL中的函数声明为WINAPI,而人们只是跟随微软的脚步。代码会小几个字节,执行时间会缩短几纳秒。

    【讨论】:

      【解决方案3】:

      2) 我们在这 2 行中在技术上做了什么。声明函数指针。

      首先定义一个类型,该类型可用于指向原型DWORD WINAPI funcName(unsigned long*); 之后的任何函数。然后创建该类型的变量。

      3) 为什么我们需要在第一行的函数指针声明中使用 WINAPI*。

      因为function_1 使用WINAPI 调用约定(通常定义为__stdcall)。或者至少这段代码假定它确实如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-13
        • 1970-01-01
        • 2010-09-15
        • 2012-04-05
        • 2011-05-24
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多