第一个WinAPI 函数(WinAPI图形系列二)
一、第一个WinAPI 函数
函数声明
基于windows图形应用程序的入口函数
int __clrcall WinMain([in] HINSTANCE hInstance,[in] HINSTANCE hPrevInstance,[in] LPSTR lpCmdLine,[in] int nShowCmd);
参数
参数 | 类型 | 解释 |
---|---|---|
[in] hInstance | HINSTANCE | 应用程序当前实例句柄 |
[in] hPrevInstance | HINSTANCE | 应用程序上一个实例句柄,此参数始终为NULL,在Win32环境下,没有任何意义。它用于16位Windows,但现在总是为零。只是在进行WinMain函数书写时需要传入一个参数. |
[in] lpCmdLine | LPSTR | 应用程序的命令行,不包括程序名称 |
[in] nShowCmd | int | 控制窗口的显示方式,指示主应用程序窗口是否将被最小化,最大化或正常显示 |
返回值
类型:int
如果函数成功,在收到WM_QUIT消息时终止,它应返回该消息的wParam参数中包含的退出值。如果函数在输入消息循环之前终止,则应返回0.
二、调用约定WINAPI
一般我们写c的控制台程序,入口函数如: int main(...),但是这里winapi图形程序入口是 int WINAPI WinMain(...),这里WINAPI其实是一个宏定义:#define WINAPI __stdcall
关于__stdcall
指的是一种调用约定,用于指定函数的参数传递方式和堆栈的清理方式。它用于C语言中,特别是用于Windows平台的API函数。该约定具体为:要求函数的参数从右往左一次入栈,并由调用者负责清理堆栈.这种约定保证了函数调用的可靠性和一致性。使得在不用的编程语言和编译器之间的函数调用都能正常进行。
注意__stdcall 不是默认的调用约定,如果不显示指定,默认的调用约定为C的调用约定cdecl. 同类的约定还有如__pascal(__stdcall), __fastcall. 由于WinMain函数由系统调用,Windows系统规定由系统调用的函数都遵守pascal调用方式,所以需要在函数前显示声明WINAPI
三、来一个小Demo
#include<windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
return MessageBoxW(NULL,L"中午好",L"您好ʾ",0);
}