控制程式碼的本質(整理-收藏)
一、書上定義:
<
在Windows環境中,控制程式碼是用來標識專案的,這些專案包括:模組(module)、任務(task)、例項 (instance)、檔案(file)、記憶體塊(block of memory)、選單(menu)、控制(control)、字型(font)、資源(resource),包括圖示(icon),游標 (cursor),字串(string)等、GDI物件(GDI object),包括位圖(bitmap),畫刷(brush),元檔案(metafile),調色盤(palette),畫筆(pen),區域 (region),以及裝置描述表(device context)。
<
控制程式碼是WONDOWS用來標識被應用程式所建立或使用的物件的唯一整數,WINDOWS使用各種各樣的控制程式碼標識諸如應用程式例項,視窗,控制,點陣圖,GDI物件等等。WINDOWS控制程式碼有點象C語言中的檔案控制程式碼。
二、MS原始碼:
#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
DECLARE_HANDLE(HMODULE);
DECLARE_HANDLE(HINSTANCE);
DECLARE_HANDLE(HLOCAL);
DECLARE_HANDLE(HGLOBAL);
DECLARE_HANDLE(HDC);
DECLARE_HANDLE(HRGN);
DECLARE_HANDLE(HWND);
DECLARE_HANDLE(HMENU);
DECLARE_HANDLE(HACCEL);
DECLARE_HANDLE(HTASK);
三、理解:
HANDLE就是PVOID,也就是無型別指標,
上面這些資源的控制程式碼Handles都不過是指向struct的指標,至於這個struct的用處,連M$都說unused了,現在解釋下M$這麼做的意義,這就是所謂資料封裝,你可以在你的程式中把M$的內部結構指標傳來傳去,可是你卻不知道它到底指向的內容是什麼。
控制程式碼與指標確實是完全不同的兩個概念。控制程式碼僅僅是一個32位整數,WIN32中用於標記某個系統或程式的物件,可以理解為物件索引(由於M$未完全公開相關技術,在一定程度上只能如此理解),這個索引更像是一種對映關係(從控制程式碼到物件指標的對映),而不是純粹意義上的“陣列下標”。
控制程式碼可以理解為用於指向或標識記憶體的一塊“資源”,這些資源如:檔案(file)、記憶體塊(block of memory)、選單(menu)等等。作業系統透過控制程式碼來定位核心物件和系統資源。
指標即為指向記憶體的“資料或指令”某一單元。
說的確切一點,控制程式碼實際上是一種指向某種資源的指標,但與指標又有所不同:指標對應著一個資料在記憶體中的地址,得到了指標就可以自由地修改該資料。Windows並不希望一般程式修改其內部資料結構,因為這樣太不安全。所以Windows給每個使用GlobalAlloc等函式宣告的記憶體區域指定一個控制程式碼(本質上仍是一個指標,但不要直接操作它),平時你只是在呼叫API函式時利用這個控制程式碼來說明要操作哪段記憶體。
控制程式碼是Windows程式設計的一個關鍵性的概念,編寫Windows應用程式總是要和各種控制程式碼打交道。所謂控制程式碼,就是一個唯一的數,用以標識許多不同的物件型別,如視窗、選單、記憶體、畫筆、畫刷等。在Win32裡,控制程式碼是指向一個“無型別物件”(void*)的指標,也就是一個4位元組長的資料。無論它的本質是什麼,控制程式碼並不是一個真正意義上的指標。從構造上看,控制程式碼是一個指標,儘管它沒有指向用於儲存某個物件的記憶體位置。事實上,控制程式碼指向一個包含了對該物件進行的引用的位置。控制程式碼的宣告是這樣的:
typedef void *HANDLE
由於Windows是一個多工作業系統,它可以同時執行多個程式或一個程式的多個副本。這些執行的程式稱為一個例項。為了對同一程式的多個副本進行管理,Windows引入了例項控制程式碼。Windows為每個應用程式建立一張表,例項控制程式碼就好象是這張表的一個索引。
Windows不僅使用控制程式碼來管理例項,也用它來管理視窗、點陣圖、字型、元檔案、圖示等系統資源。
四、引喻:
牧童遙指杏花村
牧童的手為指標,杏花村的牌子為控制程式碼,杏花村酒店為物件的例項.
附註:獲得視窗控制程式碼三種方法
1.HWND FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName)
HWND FindWindowEx(HWND hwndParent, HWND hwndChildAfter,LPCTSTR lpClassName, LPCTSTR lpWindowName)
2.HWND WindowFromPoint(POINT& Point)//獲得當前滑鼠游標位置的視窗HWND
3.BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
BOOL CALLBACK EnumChildWindows(HWND hWndParent, WNDENUMPROC lpEnumFunc,LPARAM lParam)
BOOL CALLBACK EnumWindows(WNDENUMPROC lpEnumFunc, LPARAM lParam)
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/559014/viewspace-805342/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 控制程式碼的本質——撥亂反正篇 (轉)
- 微信小程式的本質微信小程式
- 程式設計的本質程式設計
- 點贊收藏:PyTorch常用程式碼段整理合集PyTorch
- 程式碼收藏
- 程式設計師的本質程式設計師
- 整理課程中將程式碼納入Git程式碼版本控制Git
- OC原始碼剖析物件的本質原始碼物件
- 收藏夾程式碼
- 怎麼理解docker的本質是程式Docker
- 程式設計師差別的本質程式設計師
- 遊戲設計的本質(一):數值的本質遊戲設計
- 乾淨整潔程式碼(Clean Code)的本質是什麼? - mariocervera
- Python 程式碼的質量控制之 flake8 & PylintPython
- 編寫靈活、穩定、高質量的CSS程式碼的規範(推薦收藏)CSS
- IT安全的本質
- Lisp 的本質Lisp
- Python 編碼錯誤的本質原因Python
- 程式語言:型別系統的本質型別
- C++的一個簡單的控制程式碼類别範本C++
- 安全漏洞本質扯談之決戰彙編程式碼
- css程式碼整理CSS
- Category的本質<一>Go
- Battle Pass的本質BAT
- OC物件的本質物件
- 學習的本質
- 聊聊 ChatGPT 的本質ChatGPT
- 理解函數語言程式設計的本質函數程式設計
- 程式設計師可以關注和收藏的幾本好書程式設計師
- 用Python實現《計算的本質:深入剖析程式和計算機》中的程式碼Python計算機
- 嘔心整理收藏的好用免費APIAPI
- 常用的JScript程式碼整理JS
- 用 Pinbox 輕鬆收藏程式碼,這就是我要的收藏工具
- ASP.net本質論之用控制檯應用程式建立Asp.net伺服器ASP.NET伺服器
- 優質程式碼
- 控制程式碼表篇——程式控制程式碼表
- 關於原始碼防洩密的本質問題原始碼
- 關於原始碼防洩漏的本質問題原始碼