1. 程式人生 > >MFC中控制代碼和指標的區別

MFC中控制代碼和指標的區別

控制代碼原始碼:

#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

從視窗指標獲取視窗控制代碼:GetSafeHwnd();
從視窗控制代碼獲取臨時視窗指標:
FromHandle(); 
從視窗控制代碼獲取永久視窗指標:
 FromHandlePermanent();


MFC在建立視窗的時候用鉤子函式溝住HCBT_CREATEWND訊息,然後通過CWnd::Attach()函式把二者捆綁在一起。以後就可以用上述三個函式可以互相得到了。

具體分析  :    

     控制代碼是一個32位的整數,實際上是windows在記憶體中維護的一個物件(視窗等)記憶體實體地址列表的整數索引由於MS未完全公開相關技術,在一定程度上只能如此理解,這個索引更像是一種對映關係從控制代碼到物件指標的對映)。因為windows的記憶體管理經常會將當前空閒物件的記憶體釋放掉,當需要時訪問再重新提交到物理儲存,所以物件的實體地址是變化的,不允許程式直接通過實體地址來訪問物件。程式將想訪問的物件的控制代碼傳遞給系統,系統根據控制代碼檢索自己維護的物件列表就能知道程式想訪問的物件及其實體地址

了。控制代碼是一種指向指標的指標

      所謂指標是一種記憶體地址。應用程式啟動後,組成這個程式的各個物件是駐留在記憶體的。如果簡單地理解,似乎我們只要獲知這個記憶體的首地址,那麼就可以隨時用這個地址訪問物件了。

      但是,windows是一個虛擬記憶體為基礎作業系統。在這種情況下,windows記憶體管理器經常在記憶體中來回移動物件,以此來滿足各種應用程式的記憶體需要,物件被移動意味著它的地址變化了。如果地址總是如此的變化,我們應該去那裡找物件呢?為了解決這個問題,windows作業系統為各個應用程式騰出一些記憶體地址用來專門登記各個應用物件在記憶體中的地址變化,而這個地址(儲存單元的位置)本身是不變

的。

windows記憶體管理器移動物件在記憶體中的位置後,把物件新的地址告知這個控制代碼地址來儲存。這樣我們只需要記住這個控制代碼地址就可以間接地知道物件具體在記憶體中哪個位置了。這個地址是在物件裝載(load)時由系統分配的,當系統解除安裝時又釋放給系統。必須注意,程式每次重新啟動,系統不保證分配跟這個程式的控制代碼還是原來哪個控制代碼,而絕大多數情況下的確不一樣。

控制代碼地址(穩定)----->記載著物件在記憶體中的地址-------->物件在記憶體中的地址(不穩定)----->實際物件

      windows系統用控制代碼標記系統資源,用控制代碼隱藏系統資訊。你只需要知道有這個東西,然後去呼叫它就行了,它是32bituint。指標則標記某個實體記憶體的地址,是不同的概念。