1.動態鏈接
早期,windows的主要部分只需在三個動態鏈接庫中實現,代表了windows的三個主要子系統:Kernel(內核) User(用戶) GDI。
Kernel:內存管理,文件I/O,任務管理等
User:用戶界面,負責所有的窗口管理
GDI:圖形設備接口,負責在屏幕或打印機上顯示文本和圖形
在windows程序中,調用windows函數和調用C語言庫函數(如strlen),沒什麼區別。最主要的區別在於C語言庫函數的機器代碼會直接鏈接到你的程序代碼中,而windows函數則是放在你的程序之外的dll中。
2.頭文件
windows.h是一個重要的包含文件,它囊括了若干其他windows頭文件,其中某些頭文件又包含另外的一些頭文件。下列幾個是最重要也是最基本的頭文件:
- windef.h 基本數據類型定義文件
- winnt.h 支持Unicode的類型定義
- winbase.h 內核函數
- winuser.h 用戶圖形界面函數
- wingdi.h 圖形設備接口函數
這些頭文件定義了windows的所有數據類型、函數調用、數據結構以及常量標識符
3.程序入口
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
return 0;
}
windows程序的入口是WinMain
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
在WinBase.h中聲明如下
WinMain (
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nShowCmd
);
絕大部分windows程序在命名上都採用“匈牙利標記法”系統。變量名前有一個短前綴,用以表示該變量的數據類型。i表示int,sz“以零結尾的字符串”(String Terminated with a Zero),LP代表常指針(Long Pointer)。
#define WINAPI __stdcall
這條語句規定了一種函數調用的約定,表明如何生成在堆棧中放置函數調用參數的機器代碼。
WinMain的第一個參數一般叫做實例句柄(Instance Handle).在Windwos程序中,句柄無非就是一個數值,程序裏用它來標識某些東西。比如我們這個例子中,這個句柄就唯一標識了我們這個程序。
實際上在某些Windows程序中,把句柄當作參數調用是必須的。比如早期的Windows版本中,當多路併發運行同一個程序時,就需要爲那個程序創建多個實例。同一個程序的所有實例都共享代碼一起只讀存儲(即菜單或者對話框模板之類的資源)。一個程序可以通過查看hPreInstance參數從而知道是否有其他的實例正在運行。它也可以因此跳過某些零散雜務步驟,把一些數據從前一個實例搬到自己的數據區來。在32位Windows中,這一概念已不再採用,因此WinMain的第二個參數通常總是NULL。
WinMain的第三個參數是用來運行程序的命令行(Command Line)。有些Windows程序在啓動時用它來把文件裝入內存。
WinMain的第四個參數用來指示程序最初如何顯示:或正常顯示,或最大化到全屏,或最小化顯示在任務欄。