第一个WinAPI 函数(WinAPI图形系列二)

发布时间 2023-08-26 16:23:44作者: 这是个坑

一、第一个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);
}