控制程式碼與指標

yangxi_001發表於2013-12-05

所謂 控制程式碼實際上是一個資料,是一個Long (整長型)的資料。句 柄是WONDOWS用來標識被應用程式所建立或使用的物件的唯一整數,WINDOWS使用各種各樣的控制程式碼標識諸如應用程式例項,視窗,控制,點陣圖,GDI物件等等。WINDOWS控制程式碼有點象C語言中的檔案控制程式碼。 從上面的定義中的我們可以看到,控制程式碼是一個識別符號,是拿來標識物件或者專案的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。從資料型別上來看它只是一個16位的無符號整數。應用程式幾乎總是通過呼叫一個WINDOWS函式來獲得一個控制程式碼,之後其他的WINDOWS函式就可以使用該控制程式碼,以引用相應的物件。

如果想更透徹一點地認識控制程式碼,我可以告訴大家, 控制程式碼是一種指向指標的指標。 我們知道,所謂指標是一種記憶體地址。應用程式啟動後,組成這個程式的各物件是住留在記憶體的。如果簡單地理解,似乎我們只要獲知這個記憶體的首地址,那麼就可以隨時用這個地址訪問物件。但是,如果您真的這樣認為,那麼您就大錯特錯了。我們知道,Windows是一個以虛擬記憶體為基礎的作業系統。在這種系統環境下,Windows記憶體管理器經常在記憶體中來回移動物件,依此來滿足各種應用程式的記憶體需要。物件被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪裡去找該物件呢? 為了解決這個問題,Windows作業系統為各應用程式騰出一些記憶體儲地址,用來專門登記各應用物件在記憶體中的地址變化,而這個地址(儲存單元的位置)本身是不變的。Windows記憶體管理器在移動物件在記憶體中的位置後,把物件新的地址告知這個控制程式碼地址來儲存。這樣我們只需記住這個控制程式碼地址就可以間接地知道物件具體在記憶體中的哪個位置。這個地址是在物件裝載(Load)時由系統分配給的,當系統解除安裝時(Unload)又釋放給系統。 控制程式碼地址(穩定)→記載著物件在記憶體中的地址────→物件在記憶體中的地址(不穩定)→實際物件 本質:WINDOWS程式中並不是用實體地址來標識一個記憶體塊,檔案,任務或動態裝入模組的,相反的,WINDOWS API給這些專案分配確定的控制程式碼,並將控制程式碼返回給應用程式,然後通過控制程式碼來進行操作。 但是必須注意的是程式每次從新啟動,系統不能保證分配給這個程式的控制程式碼還是原來的那個控制程式碼,而且絕大多數情況的確不一樣的。假如我們把進入電影院看電影看成是一個應用程式的啟動執行,那麼系統給應用程式分配的控制程式碼總是不一樣,這和每次電影院售給我們的門票總是不同的一個座位是一樣的道理。

 1、控制程式碼所指的可以是一個很複雜的結構,並且很有可以是與系統有關的,比如說上面所說的執行緒的控制程式碼,它指向的就是一個類或者結構,他和系統有很密切的關係,當一個執行緒由於不可預料的原因,而終止時在系統就可以回它所佔用的資料,如CPU,記憶體等等,反過來想可以知道,這個控制程式碼中的某一些項,是與系統進行互動的。由於Windows系統,是一個多工的系統,它隨時都可能要分配記憶體,回收記憶體,重組記憶體。 2、指標它也可以指向一個複雜的結構,但是通常是使用者定義的,所以的必需的工作都要使用者完成,特別是在刪除的時候。 但在VC++6.0中也有一些指標,它們都是處理一些小問題才用的,如最常見的字元的指標,它也是要使用者處理的如果你動態分配了記憶體;但是Cstring就不要使用者處理了,它其實是VC++中的一個類,所以的操作都由成員函式完成,產生(分配)由建構函式,刪除(回收)由解構函式完成。 3.控制程式碼是標號,指標是記憶體地址

 控制程式碼和指標根本就不是一回事,基本上沒有共同的地方。我對控制程式碼的定義是:. 控制程式碼是系統內部受保護的資料結構的標誌或者說索引. 我的解釋: 當你的應用程式或者系統建立核心物件,使用者物件,GUI物件的時候實際上這些物件是一些記憶體資料結構(這個就不要我解釋了吧)顯然這些物件需要受到保護,不能讓使用者隨便修改訪問,否則系統很容易崩潰所以提供了一個機制來保護性的訪問這些物件,那就是API控制程式碼是這些物件的標記,或者說是索引在記憶體中往往會存在一張控制程式碼表,一般至少有如下結構 索引(也就是控制程式碼) 指標(指向記憶體物件資料結構) 其他項 1 ox???????? 2 ox???????? 3 ox???????? 4... 系統採用API,查詢控制程式碼表,取得控制程式碼所對應的指標,這個指標才是真正的指標,用它可以訪問修改受保護的記憶體. . 假如控制程式碼是指標 . 1 你自己輸出一些控制程式碼的值來看,控制程式碼一般都是一些很小的整數值, 比如1,2,3,4...... 如果是指標的話,它起不是指向受保護的區域?豈不是NULL指標??? 2 控制程式碼如果是指標的話,那麼使用者豈不可以直接訪問記憶體物件了?那系統還有什麼穩定性,安全性? 3 你把得到的控制程式碼,比如hwnd做hwnd++,hwnd--等運算,你看錯不錯 其他理由我都不想說了 如果有人說看到控制程式碼的定義為指標(我沒有看到過) 那你就去當指標吧,反正指標也是32位的值,和無符號整數沒有任何區別.

附註:獲得視窗控制程式碼三種方法

 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)

指標 控制程式碼之間的轉換

a.由指標獲得控制程式碼 CWnd * pWnd; CWnd HWnd; HWnd = pWnd->GetSafeHWnd();

b.由控制程式碼得到指標:

CWnd* pWnd=FromeHandle(hMyHandle); pWnd->SetWindowText("Hello World!"); or CWnd* pWnd; pWnd->Attach(hMyHandle); MFC類中有的還提供了標準方法,比如Window 控制程式碼 : static CWnd* PASCAL FromHandle( HWND hWnd ); HWND GetSafeHwnd( ) const; 對於點陣圖: static CBitmap* PASCAL FromHandle( HBITMAP hBitmap ); static CGdiObject* PASCAL FromHandle( HGDIOBJ hObject ); HGDIOBJ GetSafeHandle( ) const;

相關文章