就像C語言的main是它的程序路口一樣,windows的程序入口是WinMain,WinMain的定義可以查看winbase.h文件。
Hello Windows(c語言中的Hello world!)
#include <Windows.h> int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow){ MessageBox(NULL,TEXT("Hello windows"),TEXT("HelloMSG"),0); return 0; }
效果為顯示一個彈框,效果如下:
對整個程序的分析
(1)#include <Windows.h>
猶如c中的#include <stdio.h>一樣,在這里#include <Windows.h>也是預處理指令,Windows.h是最重要的包含文件,它囊括了若干個其它Windows頭文件,以下為最重要也是最基本的頭文件:
- windef.h 基本數據類型定義
- winnt.h 支持Unicode的類型定義
- winbase.h 內核函數
- winuser.h 用戶界面函數
- wingdi.h 圖形設備接口函數
(2)WINAPI
WINAPI的定義為__stdcall,__stdcall是一種函數調用規則:
- 進行函數調用,函數參數的入棧方式是最右邊先入棧
- 被調用的函數負責棧的回收(調用者只負責壓棧)。
當然這種函數調用規則還有別的,比如__cdecl、__pascal等規則。只是絕大多數Windows函數調用都定義成WINAPI。
(3)WINAPI
①:第一個參數 HINSTANCE hInstance
HINSTANCE為實例句柄,句柄無非是一個數值,程序用它來標識某些東西。在此該句柄唯一標識我們這個程序。
②:第二個參數 HINSTANCE hPrevInstance
前一個實例句柄,在win32程序中這一概念已不再采用,因此WinMain的第二個參數通常是NULL。
③:第三個參數 PSTR szCmdLine
PSTR是一個字符指針,用來運行程序的命令行,有些程序在啟動時用它來把文件裝入內存。
④:第四個參數 int iCmdShow
用來指明程序最初如何顯示:正常顯示、最大化到全屏、最小化到任務欄。
網上有一位網友舉了一個特別通俗易懂的列子來理解這些參數,在此引薦過來:
雙擊QQ快捷方式, 會啟動一個qq程序, 假設給它個編號9527;
再雙擊QQ快捷方式, 又啟動了一個新的qq, 假設編號9528;
對於9528來說, hInstance=9528, hPrevInstance=9527;
不過, msdn說hPrevInstance的這個判斷沒效果, hPrevInstance實際上是無意義的。
iCmdShow表示窗口的初始狀態, 最大化, 最小化, 隱藏, 還是一般大小的顯示等等。
szCmdLine是命令行參數, 在windows的命令行工具cmd中啟動程序的話,
有時能帶上其它參數, 比如"ping www.qq.com -t",這個命令就帶了很多參數, 用空格分開了, 分別是 ping www.qq.com -t。
原文參考地址為:點擊查看原文。
本文作為自己學習中的筆記與大家分享,主要摘自《Windows程序設計》第五版。