句柄概念
句柄(handle),有多種意義,其中第一種是指程序設(shè)計(jì),第二種是指Windows編程。現(xiàn)在大部分都是指程序設(shè)計(jì)/程序開(kāi)發(fā)這類。
第一種解釋:句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。 第二種解釋:整個(gè)Windows編程的基礎(chǔ)。一個(gè)句柄是指使用的一個(gè)唯一的整數(shù)值,即一個(gè)4字節(jié)(64位程序中為8字節(jié))長(zhǎng)的數(shù)值,來(lái)標(biāo)識(shí)應(yīng)用程序中的不同對(duì)象和同類中的不同的實(shí)例,諸如,一個(gè)窗口,按鈕,圖標(biāo),滾動(dòng)條,輸出設(shè)備,控件或者文件等。應(yīng)用程序能夠通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象的信息,但是句柄不是指針,程序不能利用句柄來(lái)直接閱讀文件中的信息。如果句柄不在I/O文件中,它是毫無(wú)用處的。 句柄是Windows用來(lái)標(biāo)志應(yīng)用程序中建立的或是使用的唯一整數(shù),Windows大量使用了句柄來(lái)標(biāo)識(shí)對(duì)象。
中文名句柄 外文名Handle 定????義OS內(nèi)標(biāo)志程序中建立的唯一整數(shù) 使????用使用的一個(gè)唯一的整數(shù)值 由????來(lái)源于內(nèi)存管理機(jī)制—虛擬地址 重要性是整個(gè)windows編程的基礎(chǔ)
1 由來(lái) 2 項(xiàng)目包括 3 原理 4 語(yǔ)句 5 作用 6 注意事項(xiàng) 7 編譯原理
目錄
句柄由來(lái)
編輯 windows 之所以要設(shè)立句柄,根本上源于內(nèi)存管理機(jī)制的問(wèn)題—虛擬地址,簡(jiǎn)而言之?dāng)?shù)據(jù)的地址需要變動(dòng),變動(dòng)以后就需要有人來(lái)記錄管理變動(dòng),(就好像戶籍管理一樣),因此系統(tǒng)用句柄來(lái)記載數(shù)據(jù)地址的變更。 數(shù)據(jù)對(duì)象加載進(jìn)入內(nèi)存中之后即獲得了地址,但是這個(gè)地址并不是固定的,(至于為什么以及什么情況下變動(dòng)具體需要大家研究虛擬地址的原理與機(jī)制,我這里只提我確定知道的例子)數(shù)據(jù)對(duì)象會(huì)根據(jù)需要在內(nèi)存與硬盤(pán)之間游弋移動(dòng)(例如不常用的數(shù)據(jù)會(huì)為常用數(shù)據(jù)讓出其占用的內(nèi)存空間,進(jìn)而被淘汰進(jìn)硬盤(pán)虛擬內(nèi)存之中以優(yōu)化配置整體系統(tǒng)的資源,從而提升效率性能),因此其物理地址總是變動(dòng)的,那么作為管理者 則必須對(duì) 管理對(duì)象所發(fā)生的變化了如指掌才行,因此系統(tǒng)為進(jìn)程分配固定的地址(句柄)來(lái)存儲(chǔ)進(jìn)程下的數(shù)據(jù)對(duì)象變化后的地址,也就是當(dāng)前的地址,其實(shí)設(shè)計(jì)機(jī)制很簡(jiǎn)單 :系統(tǒng)的某個(gè)部門(mén)移動(dòng)了對(duì)象的地址后,同時(shí)上報(bào)給句柄所屬部門(mén)管理者,管理者將改動(dòng)寫(xiě)入句柄即可。該數(shù)據(jù)被重新起用時(shí)去其所屬句柄內(nèi)按內(nèi)容存取即可。 句柄,英文:HANDLE,在Windows編程中是一個(gè)很重要的概念,在許多地方都扮演著重要的角色。但由此而產(chǎn)生的句柄概念也大同小異,比如:《Microsoft Windows 3 Developer's Workshop》(Microsoft Press,by Richard Wilton)一書(shū)中句柄的概念是:在Windows環(huán)境中,句柄是用來(lái)標(biāo)識(shí)項(xiàng)目的。 在程序設(shè)計(jì)中,句柄是一種特殊的智能指針 。當(dāng)一個(gè)應(yīng)用程序要引用其他系統(tǒng)(如數(shù)據(jù)庫(kù)、操作系統(tǒng))所管理的內(nèi)存塊或?qū)ο髸r(shí),就要使用句柄。 句柄與普通指針的區(qū)別在于,指針包含的是引用對(duì)象的內(nèi)存地址,而句柄則是由系統(tǒng)所管理的引用標(biāo)識(shí),該標(biāo)識(shí)可以被系統(tǒng)重新定位到一個(gè)內(nèi)存地址上。這種間接訪問(wèn)對(duì)象的模式增強(qiáng)了系統(tǒng)對(duì)引用對(duì)象的控制。 在上世紀(jì)80年代的操作系統(tǒng)(如Mac OS 和Windows)的內(nèi)存管理中,句柄被廣泛應(yīng)用。Unix系統(tǒng)的文件描述符基本上也屬于句柄。和其它桌面環(huán)境一樣,WindowsAPI大量使用句柄來(lái)標(biāo)識(shí)系統(tǒng)中的對(duì)象,并建立操作系統(tǒng)與用戶空間之間的通信渠道。例如,桌面上的一個(gè)窗體由一個(gè)HWND類型的句柄來(lái)標(biāo)識(shí)。如今,內(nèi)存容量的增大和虛擬內(nèi)存算法使得更簡(jiǎn)單的指針愈加受到青睞,而指向另一指針的那類句柄受到冷落。盡管如此,許多操作系統(tǒng)仍然把指向私有對(duì)象的指針以及進(jìn)程傳遞給客戶端的內(nèi)部數(shù)組下標(biāo)稱為句柄。[1]句柄項(xiàng)目包括
編輯 *.模塊(module) *.任務(wù)(task) *.實(shí)例(instance) *.文件(file) *.內(nèi)存塊(block of memory) *.菜單(menu) *.控件(control) *.字體(font) *.資源(resource),包括圖標(biāo)(icon),光標(biāo)(cursor),字符串(string)等 *.GDI對(duì)象(GDI object),包括位圖(bitmap),畫(huà)刷(brush),元文件(metafile),調(diào)色板(palette),畫(huà)筆(pen),區(qū)域(region),以及設(shè)備描述表(device context)。句柄原理
編輯 WINDOWS程序中并不是用物理地址來(lái)標(biāo)識(shí)一個(gè)內(nèi)存塊,文件,任務(wù)或動(dòng)態(tài)裝入模塊的。相反,WINDOWS API給這些項(xiàng)目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過(guò)句柄來(lái)進(jìn)行操作。 在《WINDOWS編程短平快》(南京大學(xué)出版社)一書(shū)中是這么說(shuō)的:句柄是WINDOWS用來(lái)標(biāo)識(shí)被應(yīng)用程序所建立或使用的對(duì)象的唯一整數(shù),WINDOWS使用各種各樣的句柄標(biāo)識(shí)諸如應(yīng)用程序?qū)嵗?#xff0c;窗口,控件,位圖,GDI對(duì)象等等。WINDOWS句柄有點(diǎn)像C語(yǔ)言中的文件句柄。 從上面的2個(gè)定義中我們可以看到,句柄是一個(gè)標(biāo)識(shí)符,是拿來(lái)標(biāo)識(shí)對(duì)象或者項(xiàng)目的。它就像我們的車(chē)牌號(hào)一樣,每一輛注冊(cè)過(guò)的車(chē)都會(huì)有一個(gè)確定的號(hào)碼,不同的車(chē)號(hào)碼各不相同,但是也可能會(huì)在不同的時(shí)期出現(xiàn)兩輛號(hào)碼相同的車(chē),只不過(guò)它們不會(huì)同時(shí)處于使用之中罷了。從數(shù)據(jù)類型上來(lái)看它只是一個(gè)32位(或64位)的無(wú)符號(hào)整數(shù)。應(yīng)用程序幾乎總是通過(guò)調(diào)用一個(gè)WINDOWS函數(shù)來(lái)獲得一個(gè)句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對(duì)象。在WINDOWS編程中會(huì)用到大量的句柄,比如:HINSTANCE(實(shí)例句柄),HBITMAP(位圖句柄),HDC(設(shè)備描述表句柄),HICON(圖標(biāo)句柄)等等。這當(dāng)中還有一個(gè)通用的句柄,就是HANDLE。句柄語(yǔ)句
編輯 HINSTANCE hInstance; 可以改成: HANDLE hInstance; 上面的2條語(yǔ)句都是對(duì)的,表達(dá)的是一個(gè)意義. 一個(gè)WINDOWS應(yīng)用程序可以用不同的方法獲得一個(gè)特定項(xiàng)的句柄。許多API函數(shù),諸如CreateWindow,GlobalAlloc,OpenFile的返回值都是一個(gè)句柄值。另外,WINDOWS也能通過(guò)應(yīng)用程序的引出函數(shù)將一個(gè)句柄作為參數(shù)傳送給應(yīng)用程序,應(yīng)用程序一旦獲得了一個(gè)確定項(xiàng)的句柄,便可在WINDOWS環(huán)境下的任何地方對(duì)這個(gè)句柄進(jìn)行操作。其實(shí)句柄的大量使用已經(jīng)影響到了每一個(gè)WINDOWS的程序設(shè)計(jì)。 一個(gè)句柄,只有當(dāng)唯一地確定了一個(gè)項(xiàng)目的時(shí)候,它才開(kāi)始有意義。句柄對(duì)應(yīng)著項(xiàng)目表中的一項(xiàng),而只有WINDOWS本身才能直接存取這個(gè)表,應(yīng)用程序只能通過(guò)API函數(shù)來(lái)處理不同的句柄。舉個(gè)例子來(lái)說(shuō)吧,比如:我們可以為我們的應(yīng)用程序申請(qǐng)一塊內(nèi)存塊,通過(guò)調(diào)用API函數(shù)GlobalAlloc,來(lái)返回一個(gè)句柄值: hMem=GlobalAlloc(......); 現(xiàn)在的hMem是個(gè)索引值 不是物理地址,應(yīng)用程序還不能直接存取這塊內(nèi)存。這兒還有一句題外話,是關(guān)于操作系統(tǒng)的內(nèi)存管理的。一般情況下操作系統(tǒng)給應(yīng)用程序分配的內(nèi)存塊都是可以被移動(dòng)的或者是可以丟棄的,這樣能使有限的內(nèi)存資源得到充分利用。所以,我們剛開(kāi)始分配到的那塊內(nèi)存的地址是不確定的,因?yàn)樗强梢员灰苿?dòng)的,所以得先鎖定那塊內(nèi)存塊,這里應(yīng)用程序需要調(diào)用API函數(shù)GlobalLock函數(shù)來(lái)鎖定句柄。如下: lpMem=GlobalLock(hMem); 這樣應(yīng)用程序才能存取這塊內(nèi)存。句柄作用
編輯 句柄是一個(gè)標(biāo)識(shí)符,是拿來(lái)標(biāo)識(shí)對(duì)象或者項(xiàng)目的。 如果想更透徹一點(diǎn)地認(rèn)識(shí)句柄,我可以告訴大家,句柄類似指向指針的指針,僅僅是類似,通過(guò)句柄可以找到對(duì)應(yīng)的數(shù)據(jù),但是不是二級(jí)指針。我們知道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動(dòng)后,組成這個(gè)程序的各對(duì)象是駐留在內(nèi)存中的。簡(jiǎn)單地理解,似乎我們只要獲知這個(gè)內(nèi)存的首地址,就可以隨時(shí)用這個(gè)地址訪問(wèn)對(duì)象了。如果您真的這樣認(rèn)為,那您可就大錯(cuò)特錯(cuò)了。我們知道,Windows是一個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來(lái)回移動(dòng)對(duì)象,以此來(lái)滿足各種應(yīng)用程序的內(nèi)存需要。對(duì)象被移動(dòng)意味著它的地址變化了。如果地址總是如此變化,我們?cè)摰侥睦锶フ夷且粋€(gè)對(duì)象呢? 為了解決這個(gè)問(wèn)題,Windows操作系統(tǒng)為全體應(yīng)用程序騰出一些內(nèi)存單元,用來(lái)專門(mén)登記各應(yīng)用程序的對(duì)象在內(nèi)存中的地址的變化,而前者的物理地址在系統(tǒng)運(yùn)行期間是始終保持不變的。Windows內(nèi)存管理器移動(dòng)了對(duì)象在內(nèi)存中的位置后,會(huì)把該對(duì)象新的地址及時(shí)地告知給對(duì)應(yīng)的句柄進(jìn)行更新。這樣我們只要知道這個(gè)句柄,就可以間接地知道對(duì)象具體在內(nèi)存中的哪個(gè)位置了。這個(gè)地址是在對(duì)象裝載(Load)時(shí)由系統(tǒng)分配給的,當(dāng)對(duì)象卸載時(shí)(Unload)又釋放給系統(tǒng)。句柄注意事項(xiàng)
編輯 內(nèi)核對(duì)象句柄,是用來(lái)標(biāo)識(shí)某個(gè)內(nèi)核對(duì)象的一個(gè)ID 同一個(gè)對(duì)象的該id對(duì)于每個(gè)進(jìn)程是不同的,具體如何實(shí)現(xiàn)是ms不公開(kāi)的算法,以下是一個(gè)近似的,可能的算法: 進(jìn)程創(chuàng)建時(shí),windows系統(tǒng)為進(jìn)程構(gòu)造了一個(gè)句柄表 當(dāng)該進(jìn)程希望獲得一個(gè)內(nèi)核對(duì)象句柄或者創(chuàng)建一個(gè)內(nèi)核對(duì)象從而獲得該對(duì)象句柄時(shí) 系統(tǒng)會(huì)將在句柄表中增加一個(gè)表項(xiàng),表項(xiàng)的內(nèi)容中存儲(chǔ)了指向目標(biāo)內(nèi)核對(duì)象的指針 同時(shí),系統(tǒng)返回這個(gè)表項(xiàng)在句柄表中的索引作為句柄。句柄編譯原理
編輯 一個(gè)句型的最左直接短語(yǔ)稱為該句型的句柄,句型的句柄是和某產(chǎn)生式右部匹配的子串,并且,把它規(guī)約成該產(chǎn)生式左部的非終結(jié)符, 句柄 代表了最右推導(dǎo)過(guò)程的逆過(guò)程的一步。 如右圖,在推導(dǎo)過(guò)程中,S→aABe→aAde→aAbcde→abbcde,此四步的句柄分別為aABe,d,Abc,b 句柄的特征: 1. 它是直接短語(yǔ),即某規(guī)則右部。 2. 它具有最左性。 注意:短語(yǔ)、直接短語(yǔ)和句柄都是針對(duì)某一句型的,特指句型中的哪些符號(hào)子串能構(gòu)成短語(yǔ)和直接短語(yǔ),離開(kāi)具體的句型來(lái)談短語(yǔ)、直接短語(yǔ)和句柄是無(wú)意義的。另外句柄的右邊僅含終結(jié)符如果文法二義,那么句柄可能不唯一。[2]總結(jié)
- 上一篇: 薪水增长多少,新机会才值得考虑?
- 下一篇: PMT_Header-节目映射表的数据结