Win32 API編程——前言

一丶什麼是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用戶層的程序必須得調用Win32APIwindows

  Windows採用分層結構,大體來講就是(用戶層->內核層->硬件抽象層->硬件層),每一層使用下一層提供的接口來與下一層進行交互。咱們平常使用的應用程序都是運行在用戶層,經過調用內核層提供的接口(Win32API)來與內核層交互,而後系統會請求中斷(調用nt*.dll函數),調用內核中的中斷服務程序,進而對硬件抽象層進行操做,從而實現用戶到硬件的交互。固然,也有許多程序是運行在內核層的(好比驅動程序),Windows沒有公佈用於內核層編程的源碼,可是提供了WDK(Windows Driver Kit)來給程序員編寫驅動程序,驅動程序可經過內核API,編寫中斷服務例程來操控硬件抽象層。  安全

二丶爲何要學Win32 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原創,轉載請標明出處。

相關文章
相關標籤/搜索