oll*_*llo 4 c c++ winapi mingw
我想知道为什么这么多的Win API函数只定义了它们在MinGW中的实际实现.
例:
MessageBox()
功能如MSDN文档中所述:
int WINAPI MessageBox(
_In_opt_ HWND hWnd,
_In_opt_ LPCTSTR lpText,
_In_opt_ LPCTSTR lpCaption,
_In_ UINT uType
);
Run Code Online (Sandbox Code Playgroud)
这是MinGW(winuser.h
)的实现:
#define MessageBox MessageBoxA
/* ... */
WINUSERAPI int WINAPI MessageBoxA(HWND,LPCSTR,LPCSTR,UINT);
Run Code Online (Sandbox Code Playgroud)
所以MessageBox
不是一个函数,它只是一个真正函数的定义.
另一个(取自winbase.h
:
#define GetVersionEx GetVersionExA
/* ... */
WINBASEAPI BOOL WINAPI GetVersionExA(LPOSVERSIONINFOA);
Run Code Online (Sandbox Code Playgroud)
正如您在大多数情况下所看到的,函数是作为实际实现的宏实现的.
这样做有什么理由吗?为什么它们没有被实现为"真正的"功能(使用它们的真实姓名)?
Unicode和ANSI名称:
GetVersionExW
(Unicode)和GetVersionExA
(ANSI)
来自函数原型的约定文档:
预处理器将宏扩展为Windows代码页或Unicode函数名.根据需要,在通用函数名称的末尾添加字母
"A"
(ANSI)或"W"
(Unicode).然后,头文件提供两个特定的原型,一个用于Windows代码页,另一个用于Unicode,如以下示例所示.
在您的情况下,GetVersionEx
将扩展为GetVersionExA
因为它看起来像您正在使用Windows代码页.