2

我有一个 C++ 控制台应用程序和一个 DLL。在 C++ 应用程序中,我看到以下代码片段::

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

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

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

但是想了解上面代码片段中的第一 2 行 ::

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

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

提前致谢。

4

3 回答 3

4
  1. ' functABC ' 是返回DWORD的函数的 typedef,该函数采用无符号长指针作为参数

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

  3. WINAPI ”是一个宏,通常扩展为“ __stdcall ”,这是微软用来从 . 动态链接库

于 2013-09-20T09:16:30.860 回答
3

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

于 2013-09-20T09:20:02.290 回答
2

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

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

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

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

于 2013-09-20T09:17:01.440 回答