4

我想知道为什么这么多 Win API 函数只定义为它们在 MinGW 中的实际实现。

例子:

MessageBox()MSDN文档中描述的功能:

int WINAPI MessageBox(
  _In_opt_  HWND hWnd,
  _In_opt_  LPCTSTR lpText,
  _In_opt_  LPCTSTR lpCaption,
  _In_      UINT uType
);

下面是 MinGW ( winuser.h) 的实现:

#define MessageBox MessageBoxA
/* ... */
WINUSERAPI int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);

所以MessageBox不是函数,它只是对真实函数的定义。

另一个(取自winbase.h

#define GetVersionEx GetVersionExA
/* ... */
WINBASEAPI BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA);

正如您所看到的,在大多数情况下,函数是作为宏来实现的。

这样做有什么理由吗?为什么它们没有被实现为“真实”功能(使用它们的真实姓名)?

4

2 回答 2

6

来自GetVersionEx 文档

Unicode 和 ANSI 名称: GetVersionExW (Unicode) 和GetVersionExA(ANSI)

来自Function Prototypes 文档的约定

预处理器将宏扩展为 Windows 代码页或 Unicode 函数名称。字母"A"(ANSI) 或"W"(Unicode) 将酌情添加到通用函数名称的末尾。然后,头文件提供了两个特定的原型,一个用于 Windows 代码页,一个用于 Unicode,如以下示例所示。

在您的情况下,GetVersionEx将扩展为,GetVersionExA因为看起来您正在使用Windows code page

于 2013-06-07T19:15:40.403 回答
2

使用DEFINEs 使您可以使用具有不同编译器选项的相同代码。例如:MessageBox将使用MessageBoxWif using unicode,但MessageBoxA如果不使用。仅仅为了更改方法名称就必须遍历整个代码库会很痛苦。

编辑:另见克里斯托夫的参考,这个答案是指。

于 2013-06-07T19:13:15.053 回答