常用Win32 API函式簡介
現在很多講Windows程式設計的書都是講基於MFC庫和OWL庫的Windows設計,對Windows實現的細節都鮮有討論,而除錯程式都是和系統底層打交道,所以有必要掌握一些Win32
API函式的知識,這樣我們可快捷地找出程式呼叫錯在哪?是哪個引數出了問題。
Windows程式模組包括KERNEL、USER和GDI,其中KERNEL完成記憶體管理、程式的裝人與執行和任務排程等功能,它需要呼叫原MSDDOS中的檔案管理、磁碟輸入輸出和程式執行等功能;USER是一個程式庫,它用來對聲音、時鐘、滑鼠器及鍵盤輸入等操作進行管理;GDI是一功能十分豐富的子程式庫,它提供了圖形與文字輸出、圖象操作和視窗管理等各種與顯示和列印有關的功能。上述KERNEL、USER和GDI模組中的庫函式可被應用程式呼叫,也可被其他程式模組呼叫。把包含庫函式的模組稱為輸出者(export)。你應明白為什麼跟蹤軟體時經常在KERNEL32!.text和USER32.text等系統領空轉的問題吧。
這裡列出幾個經常碰到的Win 32 API函式,它們都是存在Windows系統核心檔案KERNEL32.DLL中和視窗管理檔案USER32.DLL中。
Windows函式是區分字符集的:A表示ANSI,W表示Wide,即Unicode (Wide character-set),前者就是通常使用的單位元組方式,但這種方式處理象中文這樣的雙位元組字元不方便,容易出現半個漢字的情況。而後者是雙位元組方式,方便處理雙位元組字元。Windows的所有與字元有關的函式都提供兩種方式的版本。儘管你程式設計時使用GetWindowText,但實際上編譯程式會根據設定自動呼叫GetWindowTextA或GetWindowTextW。函式的最後一個字母告訴我們函式是使用單位元組還是雙位元組字串。
1、 Hmemcpy函式
void hmemcpy(hpvDest, hpvSource, cbCopy)
void _huge*
hpvDest; // 目的資料地址
const void _huge* hpvSource; // 源資料地址
long cbCopy;
// 資料大小 (Bytes)
這個函式在KERNEL32.DLL中,它很常用,俗稱萬能斷點,但一般的程式設計書籍上很少提到,原因它是底層的東西,沒有特殊需要,一般不直接呼叫。但的確它是很有用的!有意思的是它執行的操作很簡單,只是將記憶體中的一塊資料複製到另一個地方。
注意:此函式只在Windows 9x系統上有效,在Win NT/2K系統上相關的函式是memcpy,但在Win NT/2K上不同於Windows 9x上,很少再呼叫memcpy來處理資料了,用此函式設斷基本上什麼也攔不住。
2、 GetWindowText函式
此函式在USER32.DLL使用者模組中,它的作用是複製指定視窗中的字元到緩衝區。函式原型:
int GetWindowText(
HWND hWnd//欲獲取文字的那個視窗的控制程式碼
LPTSTR lpString //預定義的一個緩衝區,至少有cch+1個字元大小;隨同視窗文字載入
int nMaxCount//lpString緩衝區的長度
);
16位:GetWindowText
32位:GetWindowTextA,GetWindowTextW
3、 GetDlgItemText
此函式在USER32.DLL使用者模組中,它的作用是返回對話方塊中某一個視窗的標題或文字。函式原型:
UINT GetDlgItemText(
HWND hDlg, // 對話方塊控制程式碼
int nIDDlgItem, //控制識別符號
LPTSTR
lpString, / 預定義的一個字元緩衝區
int nMaxCount// 字元緩衝區的長度
);
16位:GetDlgItemText
32位:GetDlgItemTextA,GetDlgItemTextW
4、 MessageBox函式
此函式是在USER32.DLL使用者模組中,它的作用建立、顯示和操作資訊框。函式原型:
int MessageBox(
HWND hWnd, //視窗控制程式碼
LPCTSTR lpText, // 資訊框中文字的地址
LPCTSTR
lpCaption, // 資訊框標題地址
UINT uType // 資訊框型別
);
16位:MessageBox
32位:MessageBoxA,MessageBoxW