Windows API 編程入門


Windows 工作原理的中心思想就是“動態鏈接”概念。Windows 自身帶有一大套函數,應用程序就是通過調用這些函數

來實現它的用戶界面和在屏幕上顯示文本和圖形的。這些函數都是在動態鏈接庫里實現的。

這些文件的名稱都帶有后綴 .dll,或有時帶有 .exe。

 

Windows 的 3 個主要子系統:內核(kernel),用戶(user),GDI。

內核 負責操作系統的傳統工作:如 內存管理,文件輸入/輸出 以及任務管理等。

用戶 指的是用戶界面,負責所有的窗口管理。

GDI 就是圖形設備接口,負責在屏幕或打印機上顯示文本與圖形。

 

在 Windows 程序中,調用 Windows 函數與調用 C 語言的庫函數沒有什么兩樣。

最主要的區別就是 C 語言庫函數的機器代碼會直接鏈接到你的程序代碼中去,而 Windows 函數則是放到你的程序之外的 DLL 里。

 

Windows 程序運行時,它通過一個叫“動態鏈接”的進程與 Windows 接口。

每個 Windows 的 EXE 文件包含它所要用到的各個動態鏈接庫以及庫中的函數的引用地址。

當一個 Windows 程序被裝入內存后,程序中的函數調用都被解析 DLL 函數入口的指針,同時這些被調用的函數也被裝入內存。

當鏈接 Windows 程序以生存可執行文件時,一定得鏈接你的編程環境所提供的特殊的“導入庫”。

這些導入庫包含所有 Windows 函數調用要碰到的動態鏈接庫的名字及引用信息。鏈接程序利用這些信息構建 EXE 文件中的表格,

當裝入程序的時候,Windows 要靠這些表格來解析 Windows 函數調用。

 

另外值得提醒的一點是,MFC 是對 API 的封裝,隱藏了許多復雜的情節。

Windows 的 Hello World!程序:

#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
     MessageBox (NULL, TEXT ("Hello, World!"), TEXT ("HelloMsg"), MB_OKCANCEL) ;    
     return 0 ;
}

該程序的 #include<windows.h> 就是像 C 語言的 #include<stdio.h> 一樣重要的頭文件。

而 int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)

就像 C 語言的 int main(void) 一樣,都是程序的入口。C 程序的入口是 main,Windows 程序的入口是 WinMain。

 

絕大多數的 Windows 程序都遵循“匈牙利標記法”:
變量名前都有一個短前綴,用以表明該變量的數據類型。

前綴 數據類型
c char 或 WCHAR 或 TCHAR
by BYTE(無符號字符)
n short(短整型)
i int(整型)
x,y int,表示 x 坐標和 y 坐標
cx,cy int,表示 x 或 y 的長度,c 表示“count”(計數)
B 或 f BOOL(int); f 表示“flag”
w WORD(無符號短整型)
l LONG(長整型)
dw DWORD(無符號長整型)
fn 函數
s 字符串
sz 以零結束的字符串
h 句柄
p 指針

 

WinMain的第一個參數叫做"實例句柄"(Instance Handle)。句柄就是一個數值,用它來標識某些東西。

句柄是一個 4byte 的數值,可用來標識 窗口,按鈕,圖標,滾動條,輸出設備,控件或者文件等等。

WinMain的第二個參數通常是 NULL。

WinMain的第三個參數是用來運行程序的命令行(CommandLine)。

 WinMain的第四個參數是用來指明程序最初如何顯示。(最大化到全屏,正常顯示,最小化到任務欄)。

 

MessageBox函數:

 函數原型:int WINAPI MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);

第一個參數通常是一個窗口句柄

第二個參數是在信息框里出現的文本字符串。

第三個參數是標題欄上顯示的文本字符串。

第四個參數是以前綴MB_開頭的一些常量組合。用以對話框中的按鈕,圖標等等。

 

函數的調用: MessageBox( hWnd, TEXT("信息框里的內容“), TEXT("標題框里的標題”), MB_OK);

                      該函數一般都如此調用,第四個參數都是 MB_***,以 MB 開頭的常量。

 (函數的有些參數設置為 NULL, 或者 0 效果是一樣的,因為大多數編譯器把 NULL 宏定義為 0)

(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)

(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)

(注意:遇到程序在弄懂之后一定要自己去敲,一定要自己去敲,一定要自己去敲)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM