我想知道为什么这么多Win API函数只定义了它们在MinGW中的实际实现。
示例:
MessageBox()
功能,如MSDN documenation:
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);
正如您在大多数情况下所看到的,这些函数是作为实际实现的宏实现的。
有没有理由这样做?为什么它们没有被实现为“真正的”函数(使用它们的真实姓名)?
答案 0 :(得分:6)
Unicode和ANSI名称:
GetVersionExW
(Unicode)和GetVersionExA
(ANSI)
来自Conventions for Function Prototypes documentation:
预处理器将宏扩展为Windows代码页或Unicode函数名。根据需要,在通用函数名称的末尾添加字母
"A"
(ANSI)或"W"
(Unicode)。然后,头文件提供两个特定的原型,一个用于Windows代码页,另一个用于Unicode,如以下示例所示。
在您的情况下,GetVersionEx
会扩展为GetVersionExA
,因为您似乎正在使用Windows code page。
答案 1 :(得分:2)
使用DEFINE
,您可以使用带有差异编译器选项的相同代码。例如:如果使用MessageBox
,则MessageBoxW
将使用unicode
,如果不是MessageBoxA
则会{{1}}。只需更改方法名称就必须通过整个代码库。
编辑:另见Christoph的参考,这个答案是指。