控制程式碼的本質——撥亂反正篇 (轉)
受M$的幫助文件以及很多書籍的影響,大家對局柄比較普遍的認識是:控制程式碼是一個整數,用以標識Windows,控制程式碼不是一個指標……
而實際上,這些不過是M$進行資料封裝的幌子而已,下面我們一起來分析一下HANDLE到底是什麼。
請先到Windef.h找絕大多數控制程式碼的定義:
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HHOOK);
……
DECLARE_HANDLE(HGDIOBJ);
DECLARE_HANDLE(HBITMAP);
DECLARE_HANDLE(HBRUSH);
……
typedef HANDLE HGLOBAL;
typedef HANDLE HLOCAL;
……
OK, 現在大家跟我一起翻到Winnt.h,看看DECLARE_HANDLE和HANDLE到底是什麼:
#ifdef STRICT
typedef void *HANDLE;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif
typedef HANDLE *PHANDLE;
哈哈,現在知道了吧,HANDLE就是PVOID,也就是無型別指標,
而DECLARE_HANDLE(HWND);就是:
struct HWND__ {
int unused;};
typedef struct HWND__ *HWND;
現在實際上都清楚啦,這些Handles都不過是指向struct的指標,至於這個struct的用處,連M$都說unused了,^o^
現在解釋下M$這麼做的意義,這就是所謂資料封裝,你可以在你的中把M$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼,而且可以編個控制程式碼的瞎話防止大家的質疑:)。而M$的程式大可以這麼寫:
#include
#include "windows_in.h" //這個是M$自用的,外人別想看到^o^
HSOMETHINGELSE DoSomething(HSOMETHING hSomething) {
struct RealSomething* p = (struct RealSomething*)hSomething; //先強制型別轉換成內部結構指標
……do something……
return (HSOMETHINGELSE)pRealSomethingElse;//強制型別逆轉換
}
^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^ ^o^
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990957/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 控制程式碼的本質(整理-收藏)
- oracle 字符集亂碼本質驗證Oracle
- 控制程式碼表篇——程式控制程式碼表
- 反正舉例教你規範寫程式碼
- 控制程式碼表篇——全域性控制程式碼表
- 微信小程式的本質微信小程式
- 程式設計的本質程式設計
- 提高程式碼質量-工具篇
- 程式設計師的本質程式設計師
- 認知篇:CQRS架構模式的本質架構模式
- 並行工程的本質分析(轉)並行
- OC原始碼剖析物件的本質原始碼物件
- C++程式設計批評系列 繼承的本質(轉)C++程式設計繼承
- VC的撥號上網程式 (轉)
- 轉: Windows控制程式碼數的限制Windows
- idea控制檯中文亂碼Idea
- 撥號上網程式 (轉)
- java的中文亂碼轉換Java
- 怎麼理解docker的本質是程式Docker
- 程式設計師差別的本質程式設計師
- idea控制檯中文亂碼的問題Idea
- 程式亂碼探索
- 遊戲設計的本質(一):數值的本質遊戲設計
- 乾淨整潔程式碼(Clean Code)的本質是什麼? - mariocervera
- Python 程式碼的質量控制之 flake8 & PylintPython
- codeblocks 控制檯輸出亂碼BloC
- 控制程式碼表篇——總結與提升
- IT安全的本質
- Lisp 的本質Lisp
- Python 編碼錯誤的本質原因Python
- 地址本的指令碼(轉)指令碼
- 【日誌亂碼】解決Tomcat啟動控制檯亂碼問題Tomcat
- 程式語言:型別系統的本質型別
- 從核心世界透視 mmap 記憶體對映的本質(原始碼實現篇)記憶體原始碼
- “執行力”的本質是“領導力”(轉)
- C++的一個簡單的控制程式碼類别範本C++
- 自己試著隨手亂編的程式碼,好亂
- 軟體質量控制實踐――Microsoft 篇(下)ROS