熱線電話:13121318867

登錄
首頁精彩閱讀句柄與指針_數據分析師
句柄與指針_數據分析師
2014-12-29
收藏

句柄與指針_數據分析師


所謂 句柄實際上是一個數據,是一個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;

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢