国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
句柄和指針的區(qū)別
2011-04-27 15:07:17

當把硬盤上的資源調(diào)入內(nèi)存以后,將有一個句柄指向它,但是句柄只能指向一個資源。而且句柄知道所指的內(nèi)存有多大。還有指針,指針指向地址,它不知道分配的內(nèi)存有多大。  

但是如果你定義一個句柄,然后在VC里面右擊鼠標,選擇"go to definition of handle”,你會發(fā)現(xiàn)它的本質(zhì)就是一個指針,但是它的作用不同于指針。它和通常意義上的指針是有區(qū)別的。句柄借用了指針的思想,有它的邏輯特點,但沒 有它的物理功能。句柄是WINDOWS分配給窗口等資源的唯一標識,是一個整數(shù)。


一、書上定義:

<<Microsoft Windows 3 Developer''s Workshop>>(Microsoft Press,by Richard Wilton)

在Windows環(huán)境中,句柄是用來標識項目的,這些項目包括:模塊(module)、任務(task)、實例 (instance)、文件(file)、內(nèi)存塊(block of memory)、菜單(menu)、控制(control)、字體(font)、資源(resource),包括圖標(icon),光標 (cursor),字符串(string)等、GDI對象(GDI object),包括位圖(bitmap),畫刷(brush),元文件(metafile),調(diào)色板(palette),畫筆(pen),區(qū)域 (region),以及設(shè)備描述表(device context)。

<<WINDOWS編程短平快>>(南京大學出版社):

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數(shù),WINDOWS使用各種各樣的句柄標識諸如應用程序?qū)嵗?,窗口,控制,位圖,GDI對象等等。WINDOWS句柄有點象C語言中的文件句柄。

二、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

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);

三、理解:

句柄是一個32位的整數(shù),實際上是windows在內(nèi)存中維護的一個對象(窗口等)內(nèi)存物理地址列表的整數(shù)索引。因為windows的內(nèi)存管理經(jīng)常 會將當前空閑對象的內(nèi)存釋放掉,當需要時訪問再重新提交到物理存儲,所以對象的物理地址是變化的,不允許程序直接通過物理地址來訪問對象。程序?qū)⑾朐L問的 對象的句柄傳遞給系統(tǒng),系統(tǒng)根據(jù)句柄檢索自己維護的對象列表就能知道程序想訪問的對象及其物理地址了。句柄是一種指向指針的指針。我們知道,所謂指針是一 種內(nèi)存地址。應用程序啟動后,組成這個程序的各個對象是駐留在內(nèi)存的。如果簡單地理解,似乎我們只要獲知這個內(nèi)存的首地址,那么就可以隨時用這個地址訪問 對象了。但是,如果真這么認為,那么就大錯特錯了。我們知道windows是一個虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種情況下,windows內(nèi)存管理器經(jīng)常 在內(nèi)存中來回移動對象,以此來滿足各種應用程序的內(nèi)存需要,對象被移動意味著它的地址變化了。如果地址總是如此的變化,我們應該去那里找對象呢?為了解決 這個問題,windows操作系統(tǒng)為各個應用程序騰出一些內(nèi)存地址,用來專門登記各個應用對象在內(nèi)存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。windows 內(nèi)存管理器移動對象在內(nèi)存中的位置后,把對象新的地址告知這個句柄地址來保存。這樣我們只需要記住這個句柄地址就可以間接地知道對象具體在內(nèi)存中哪個位置 了。這個地址是在對象裝載(load)時由系統(tǒng)分配的,當系統(tǒng)卸載時又釋放給系統(tǒng)。句并地址(穩(wěn)定)----->記載著對象在內(nèi)存中的地址 -------->對象在內(nèi)存中的地址(不穩(wěn)定)----->實際對象。但是必須注意,程序每次重新啟動,系統(tǒng)不保證分配跟這個程序的句柄還 是原來哪個句柄,而絕大多數(shù)情況下的確不一樣。假如我們把進入電影院看電影看成是一個應用程序的啟動運行,那么系統(tǒng)給應用程序分配的句柄總是不一樣,這和 每次電影院給我們的門票總是不同的座位是一個道理。

因此,句柄和指針其實是兩個截然不同的概念。windows系統(tǒng)用句并標記系統(tǒng)資源,用句并隱藏系統(tǒng)信息。你只需要知道有這個東西,然后去調(diào)用它就行了,它是32bit的uint。指針則標記某個物理內(nèi)存的地址,是不同的概念。


指針對應著一個數(shù)據(jù)在內(nèi)存中的地址,得到了指針就可以自由地修改該數(shù)據(jù)。Windows并不希望一般程序修改其內(nèi)部數(shù)據(jù)結(jié)構(gòu),因為這樣太不 安全。所以Windows給每個使用GlobalAlloc等函數(shù)聲明的內(nèi)存區(qū)域指定一個句柄(本質(zhì)上仍是一個指針,但不要直接操作它),平時你只是在調(diào) 用API函數(shù)時利用這個句柄來說明要操作哪段內(nèi)存。當你需要對某個內(nèi)存進行直接操作時,可以使用GlobalLock鎖住這段內(nèi)存并獲得指針來直接進行操 作。

句柄是指針的“指針”,使用句柄主要是為了利于windows在進程內(nèi)存地址空間移動分配的內(nèi)存塊,以防止進程的內(nèi)存空間被撕的四分五裂而存在過多的碎片。

句柄是一些表的索引也就是指向指針的指針。間接的引用對象,windows可以修改對象的"物理"地址和 描述器的值,但是句柄的值是不變的。


句柄可以在獲得窗口的時候使用,指針可以進行調(diào)用窗口,兩個使用的地方不一樣.一個括號外,一個括號內(nèi).

從窗口指針獲取窗口句柄:GetSafeHwnd();
從窗口句柄獲取臨時窗口指針:FromHandle(); 
從窗口句柄獲取永久窗口指針: FromHandlePermanent();

其實兩者被沒有關(guān)系,實際上是MFC在創(chuàng)建窗口的時候用鉤子函數(shù)溝住HCBT_CREATEWND消息,
然后通過CWnd::Attach()函數(shù)把二者捆綁在一起。
以后就可以用GetSafeHwnd(),F(xiàn)romHandle(),F(xiàn)romHandlePermanent()這三個函數(shù)可以互相得到了。

MFC之所以要這樣做,主要是為了使原來的SDK面向過程的編程遍成面向?qū)ο蟮木幊?,所有的MFC的窗口都共用一窗口過程函數(shù),在窗口過程函數(shù)里, 通過窗口句柄(HWND)找到窗口對象指針(CWnd *)從而把消息分發(fā)到窗口對象中,這樣以后就可以在窗口類中實行消息響應編程處理了。

附注:獲得窗口句柄三種方法

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)

本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
句柄和指針區(qū)別
句柄 指針
句柄到底是什么意思?!
句柄
什么是句柄?為什么會有句柄?HANDLE
映射窗口句柄對象
更多類似文章 >>
生活服務
分享 收藏 導長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服