一丶什麼是Win32 API?程序員
簡單來講,就是微軟爲了保護操做系統的安全性和穩定性,不容許運行在用戶層的進程隨意操控系統內核,而是必須按照必定方式。咱們用戶層要與系統內核層交互(好比對內存、進程操做),只能經過調用Windows內核層提供的接口函數,也就是Win32API來操控。這些API以DLL(動態連接庫)的形式保存(在SYSTEM32文件夾中,你能夠發現許多DLL文件),最經常使用的是kernel32.dll、user32.dll和gdi32.dll。編程
全部基於NT內核(XP到Win10都是基於NT內核開發)的Windows API均可以稱爲Win32,即使是64位系統,也用這個名稱,由於64位系統是徹底兼容32位程序的(32位系統不能徹底兼容16位程序),因此你能夠看到這些DLL名稱都有個"32"的後綴。那咱們用C/C++寫程序,沒用到Win32,怎麼也可以執行分配內存,打開進程等操做呢?實際上在Windows系統上的C/C++的運行庫內部也是封裝了Win32API。進一步說,全部運行在Windows用戶層的程序必須得調用Win32API。windows
Windows採用分層結構,大體來講就是(用戶層->內核層->硬件抽象層->硬件層),每一層使用下一層提供的接口來與下一層進行交互。咱們平常使用的應用程序都是運行在用戶層,經過調用內核層提供的接口(Win32API)來與內核層交互,而後系統會請求中斷(調用nt*.dll函數),調用內核中的中斷服務程序,進而對硬件抽象層進行操做,從而實現用戶到硬件的交互。固然,也有許多程序是運行在內核層的(好比驅動程序),Windows沒有公佈用於內核層編程的源碼,可是提供了WDK(Windows Driver Kit)來給程序員編寫驅動程序,驅動程序可經過內核API,編寫中斷服務例程來操控硬件抽象層。 安全
如今用於windows平臺的程序開發方式突飛猛進,種類繁多,好比使用Dephi、WPF、Qt等,開發效率遠高於使用Win32 API開發,那爲何還要學習使用Win32 API開發呢?
ide
①理解Windows程序底層運行機制。函數
②幫助學習Windows上其餘的編程語言、平臺。學習
③實現其餘庫沒有提供的高級功能,好比修改其餘進程內存等。編碼
三丶開始前你必須知道spa
語言基礎: C/C++
開發平臺: Visual Studio
編碼格式:Unicode
----------------------
爲何區分編碼格式?
windows程序的編碼格式分爲兩種:ANSI(MBCS:多字節字符集)和Unicode,Windows會按程序的編碼格式解碼字符。
ANSI:根據系統當前設置的語言採用不一樣編碼,好比系統語言設置爲簡體中文,則ANSI採用GBK編碼。
Unicode:統一的字符集,在全部系統中均相同,每一個字符佔用兩個字節。
爲何使用Unicode?
①Windows NT是使用Unicode開發的,調用API時要把ANSI字符轉換成Unicode字符,直接使用Unicode能夠提升運行效率。
②使你的程序在不一樣語言的系統上運行時不會出現亂碼。
③一些API只能處理Unicode字符。
怎麼設置Unicode?
修改編譯器設置
項目->屬性->高級->字符集:使用Unicode字符集
設置後觀察
項目->屬性->C/C++->命令行:看到兩個選項 /D "_UNICODE" /D "UNICODE",說明已成功設置爲Unicode編碼,不然看到選項 /D "_MBCS",說明使用的是MBCS編碼。
其中_UNICODE定義在C運行庫的頭文件中,UNICODE定義在Windows的頭文件中。
----------------------
儘可能使用Windows數據類型
在平時使用C/C++編程時,咱們都使用C/C++標準庫提供的數據類型,好比:char,shot,int,long int等等,可是在使用Windows API編程時,咱們應該儘可能使用Windows提供的數據類型,由於Win32 API函數都是使用Windows數據類型編寫的,因此你必需要認識它。事實上,這些Windows數據類型都是在windows頭文件中對C/C++庫原生類型的宏定義,本質上並沒有差異。下面列舉常見的Windows數據類型。
類型前綴:
c=const 常量
u=unsigned 無符號
p=pointer 指針
h=handle 句柄
w=word 字
dw=double word 雙字
sz=strinszg terminated with a zero 以0結尾的字符串
lp=long pointer 長指針
函數後綴:
A=ansi字符 參數接受ANSI字符
W=wide寬字符 參數接受Unicode字符
EX=expand 擴展版函數,在原函數基礎上增長某些新的特性
Windows類型舉例:
typedef int INT; typedef int BOOL; typedef unsigned int UINT; typedef unsigned short WORD; typedef WORD near *PWORD; typedef WORD far *LPWORD;
其餘定義詳見 <minwindef.h>
near指針NP,far指針FP,long指針LP,是爲了兼容16位程序,在32位編程中都爲P(32位指針)
------------------------
在字符串前添加 L標誌:該字符串將按寬字符(Unicode)編碼
TEXT、__TEXT(winnt.h內定義的宏)
若是 UNICODE被定義,則在字符串前添加L
_T、__T、_TEXT(tchar.h內定義的宏)
若是 _UNICODE被定義,則在字符串前添加L
#ifdef UNICODE #define __TEXT(x) L##x #else #define __TEXT(x) x #endif
------------------------
帶T前綴的數據類型,根據是否認義UNICODE使用寬/窄字符
#ifdef UNICODE typedef wchar_t TCHAR #else typedef char TCHAR #endif
四丶其餘
筆者學習中,儘可能在保持準確性、嚴謹性的同時使用比較天然的語言來寫。
水平有限,不足之處歡迎批評指正。
本文由Celng原創,轉載請標明出處。