1、導入 關於Win32的錯誤認知: (1)已經有malloc()函數了,為什麼還要學Win32 API? (2)學MFC就可以了,為什麼要學Win32? Win32課程包含的內容: 01、字元 09、文件系統 02、多線程 10、記憶體映射 03、線程同步 11、DLL 04、視窗的本質 12、遠程 ...
1、導入
關於Win32的錯誤認知:
(1)已經有malloc()函數了,為什麼還要學Win32 API?
(2)學MFC就可以了,為什麼要學Win32?
Win32課程包含的內容:
01、字元 09、文件系統
02、多線程 10、記憶體映射
03、線程同步 11、DLL
04、視窗的本質 12、遠程註入
05、Windows消息機制 13、模塊隱藏
06、子視窗的使用 14、進程通信
2、字元編碼
在我們的Win32 編程中有許多的字元串,有些是ASCII碼,有些是Unicode編碼,Unicode編碼又分為 UTF-8和UTF-16
①原始的ASCII編碼:
ASCII ----- Ameriacan Standard Code for Information Interchange
②ASCII編碼的擴展:GB2312或GB2312-80
將兩個 ASCII碼拼成一個 GBK(漢字編碼)
很大的弊端:難以避免出現亂碼(因為各個國家標準不盡相同)
③UNICODE編碼 <1>什麼是UNICODE? 這是一個編碼方案,說白了就是一張包含全世界所有文字的一個編碼表,只要這個世界上存在的文字元號,統統給你一個唯一的編碼: Unicode編碼範圍是:0-0x10FFFF,可以容納100多萬個符號! <2> UNICODE的問題: Unicode只是一個符號集,它只規定了符號的二進位代碼,卻沒有規定這個二進位代碼應該如何存儲。(因為Unicode可能是一個位元組或者多個位元組)
④如何存儲UNICODE: UTF-16 / UTF-8 是Unicode的實現方式 <1> UTF-16(預設): UTF-16編碼以16位無符號整數為單位,註意是16位為一個單位,不表示一個字元就只有16位。(即為一個存儲單位是兩個位元組的大小)這個要看字元的unicode編碼處於什麼範圍而定,有可能是2個位元組,也可能是4個位元組(當兩個位元組儲存不下,就需要用兩個單位的Unicode,而就是因為這種原因導致之後的網路傳輸,增大了傳輸的的大小,但是更加直觀)現在機器上的unicode編碼一般指的就是UTF-16。 <2> UTF-8: Unicode編碼(16進位) || UTF-8 位元組流(二進位) 000000 - 00007F || 0xxxxxxx 000080 - 0007FF || 110xxxxx 10xxxxxx 000800 - 00FFFF || 1110xxxx 10xxxxxx 10xxxxxx 010000 - 10FFFF || 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8位元組流中的xxxxx取出來轉為16進位即為Unicode編碼
UTF-16 的優點是:拆分解析的時候很簡單,很直觀
UTF-8 的優點是:節約空間,變長字元
在網路傳輸中,如果英文字母比較多的話,推薦使用UTF-8編碼;如果中文漢字比較多的話,推薦使用UTF-16編碼。
(以此推出 UTF-32即為所有編碼都是四個位元組,更加簡潔明瞭,能夠直接解析)
<3>BOM(Byte Order Mark 位元組順序標識):
UTF - 8 || EF BB BF
UTF - 16LE(小端存儲) || FF FE
UTF - 16BE(大端存儲) || FE FF
在文本文件的起始位置存儲順序標識,來表明自己是以什麼方式存儲的
3、C語言中的寬字元
①字元和字元串在記憶體中的值 我們觀察以下在記憶體中的值: char szStr[] =“中國”; (vc6會預設以ASCII碼的形式進行編碼) wchar_t swzStr[]=L“中國”; (vc6這樣表示字元串以Unicode格式進行編碼)
且字元串結尾會有一個 "/0" 在 ASCII碼中占一個位元組,而在Unicode中最小的單位是兩個位元組,所以在Unicode編碼中,結尾的 “/0” 占兩個位元組。
②列印寬字元
③字元串長度
char szStr]] = "中國";
wchar_t swzStr[] = L"中國";
strlen(szStr); //取得多位元組字元串中字元長度,不包含00
wcslen(swzStr); //取得多位元組字元串中字元長度,不包含00 00
④常用函數
char wchar_t //多位元組字元類型 寬字元類型 printf wprintf //列印到控制台函數 strlen wcslen //獲取長度 strcpy wcscpy //字元串複製 strcat wcscat //字元串拼接 strcmp wcscmp //字元串比較 strstr wcsstr //字元串查找
4、Win32 API 中的寬字元
①什麼是Win32 API?有哪些?在哪裡?
API (application process interface) 應用程式介面
主要是存放在 C:\WINDOWS\system32 下麵所有的dll(實際上system32中存儲的是 64位的dll,而sysWOW64中存儲的是 32位的dll)
幾個重要的DLL: <1> Kernel32.dll:最核心的功能模塊,比如管理記憶體、進程和線程相關的函數等。 <2> User32.dll:是Windows用戶界面相關應用程式介面,如創建視窗和發送消息等。 <3> GDI32.dll:全稱是Graphical Device Interface(圖形設備介面),包含用於畫圖和顯示文本的函數。
②關於Win32的數據類型:
int MessageBox
{
HWND hWnd, //handle to owner window
LPCTSTR IpText, //text in message box
LPCTSTR IpCaption, //message box title
UINT uType // message box style
};
如果想要使用Win32 API 只需要包含 windows.h 這個頭文件,初學者看到許多不認識的數據類型,可以通過編譯器查詢發現實際上的不同的數據類型,本質上都是我們所熟知的。
彙編: byte BYTE PBYTE word WORD PWORD dword DWORD PDWORD C語言: char CHAR PCHAR unsigned char UCHAR PUCHAR short SHORT PSHORT unsigned short USHORT PUSHORT int INT PINT unsigned int UINT PUINT
C++語言:
bool BOOL
而給類型起別名,是為了適應不同的平臺以及版本的更新,如果出現需要修改,可以直接在巨集定義中修改,程式可以不做任何的變動。
④在Win32中使用字元串:
字元類型: CHAR szStr[] = "中國”; //ASCII WCHAR swzStr[] = L"中國”; //Unicode TCHAR stzSr[] = TEXT(“中國”); //能夠自動的選擇預設的編碼格式,更適應跨平臺操作 字元串指針: PSTR pszStr = “中國”; PWSTR pwszStr =L“中國”; PTSTR ptszStr = TEXT("中國”);
因為編碼格式的不同,Win32 API中的函數都是提供的兩份函數,一個是 ASCII 碼,一個是Unicode編碼的。
在理論上來講,在Windows 內核當中所有的字元串都是寬字元的,使用Unicode編碼格式更好,不需要重覆轉化,性能更加的好。
⑤第一個Win32 API的使用:
CHAR szTitle[]= "標題";
CHAR szContent]= "歡迎大家來的Win32 API世界!";
MessageBoxA(O,szContent,szTitle,MB_OK);
WCHAR swzTitle[]=L"標題";
WCHAR swzContent[]= L"歡迎大家來的Win32 API世界!";
MessageBoxW(O,swzContent,swzTitle,MB_OK);
TCHAR stzTitle[] = TEXT("標題"); //第三個是自動適配的
TCHAR stzConten[]=TEXT("歡迎大家來的Win32 API世界!");
MessageBox(0,stzContent,stzTitle,MB_OK);