CH375OpenDevice

[size=5]打開CH375設(shè)備,返回句柄,出錯則無效. 請問這里的句柄是個(gè)啥東東?[/size][Emot]13[/Emot]

1.句柄是什么? 在windows中,句柄是和對象一一對應(yīng)的32位無符號整數(shù)值。對象可以映射到唯 一的句柄,句柄也可以映射到唯一的對象。 2.為什么我們需要句柄? 更準(zhǔn)確地說,是windows需要句柄。windows需要向程序員提供必要地編程接口 ,在這些接口中,允許程序員訪問、創(chuàng)建和銷毀對象。但是,出于封裝地考慮,wi ndows并不想向程序員返回指針。指針包含了太多的信息。首先指針給出了對象存儲 的確切位置;其次,要操作一個(gè)指針,程序員必須知道指針?biāo)笇ο蟮膬?nèi)部結(jié)構(gòu)特 征,也即,windows必須向程序員暴露相應(yīng)的數(shù)據(jù)結(jié)構(gòu),而這些數(shù)據(jù)結(jié)構(gòu)也許是操作 系統(tǒng)想向程序員隱藏的。 如果說COM技術(shù)向用戶隱藏了數(shù)據(jù),只暴露了接口并只允許按接口定義的方法操 作數(shù)據(jù)的話,句柄這種方式則允許你按自己的方式直接操作數(shù)據(jù),但windows又不向 你直接暴露數(shù)據(jù)。直接操作數(shù)據(jù)是程序員需要的,不暴露數(shù)據(jù)是windows所需要的, 句柄封裝方式實(shí)現(xiàn)了各取所需。 3.句柄如何與對象映射? 封裝背后,必須有一個(gè)地方可以實(shí)現(xiàn)解碼,以實(shí)現(xiàn)句柄和對象的相互轉(zhuǎn)換。在 windows中,存在兩種映射方式: a. 全等映射。也即,句柄本身就是一個(gè)指針。映射在這里只是類型轉(zhuǎn)換而已。 這種情況有,進(jìn)程實(shí)例句柄或模塊句柄,以及資源句柄等等。 b. 基于表格的映射。這是對象指針與句柄之間最普通的映射機(jī)制。操作系統(tǒng)創(chuàng) 建表格,并保存所有要考慮的對象。需要創(chuàng)建新對象時(shí),要先在表格中找到空入口 ,然后把表示對象的數(shù)據(jù)添入其中。當(dāng)對象被刪除時(shí),它的數(shù)據(jù)成員和其在表中的 入口被釋放。 4.句柄的定義和實(shí)現(xiàn) 我們以GDI對象為例進(jìn)行討論。創(chuàng)建了GDI對象,就會得到該對象的句柄。句柄 的對象可能是HBRUSH、HPEN、HFONT或HDC中的一種,這依賴于你創(chuàng)建 的GDI對象類 型。但是最普通的GDI對象類型是HGDIOBJ。HGDIOBJ被定義成空指針。 HPEN的實(shí)際編譯類型定義隨編譯時(shí)間宏STRICT的不同而不同。如果STRCIT已經(jīng) 被定義了,HPEN是這樣的: struct HPEN__ {int unused}; typedef struct HPEN__* HPEN; 如果STRICT沒有定義,HPEN是這樣定義的: typedef void *HANDLE; typedef HANDLE HPEN; 上面這段代碼是一個(gè)注重細(xì)節(jié)的程序員最接近句柄的地方,因此我們重點(diǎn)分析 一下。這里有一點(diǎn)點(diǎn)技巧。如果定義了STRICT宏,HPEN是指向有單個(gè)未使用字段的 結(jié)構(gòu)的指針,否則HPEN是空指針。C/C++編譯器允許把任何類型的指針作為空指什傳 遞,反之則不可以。兩個(gè)不同類型的非空指針是互不兼容的。在STRICT版本中,編 譯對GDI對象句柄的不正確混用將給出警告,對于非GDI句柄,如HWND、HMENU的不正 確混用也會給出警告,從而使程序在編譯器得到更STRICT的檢查。 接下來的分析可能不那么令你感興趣,但它更深刻地揭示了句柄。對GDI句柄來 說,盡管windows頭文件把它定義成指針,但如果你仔細(xì)檢查這些句柄的值,它根本 就不像指針,這也是為什么我說它只是一個(gè)32位無符整數(shù)值的原因。對句柄就是指 針的情況,這句話也仍然適用。讓我們隨意地生成一些句柄,比如你用GetStockOb ject()以得到一些句柄,你會發(fā)現(xiàn),它們的值總在區(qū)間0x01900011到0xba040389。 前者指向用戶區(qū)中的未分配的無效區(qū)域,后者指向內(nèi)核地址空間。另外你可能發(fā)現(xiàn) ,兩個(gè)句柄之間的值可能只差數(shù)值1,這也說明GDI句柄不是指針。 和多數(shù)人想象的不一樣,句柄也不是一個(gè)單純的索引值。對GDI對象句柄來說, GDI句柄由8位 、1位堆對象標(biāo)記(表明對象是否創(chuàng)建在堆中)、7位對象類型信息和 高4位為0的16位索引組成,如圖: 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | 8 位引用計(jì)數(shù) |堆 | 對象類型7 | 16位索引 | 標(biāo) 記 在這里你可以看到,對GDI來說,它只使用了16位作為索引。這意味著一個(gè)進(jìn)程最多只 可以創(chuàng)建小于64K個(gè)句柄,實(shí)際上受其他一些限制,整個(gè)windwos系統(tǒng)中大概可以容納約 16384(0x4000)個(gè)GDI對象。


所謂句柄實(shí)際上是一個(gè)數(shù)據(jù),是一個(gè)Long (整長型)的數(shù)據(jù)。

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

從上面的定義中的我們可以看到,句柄是一個(gè)標(biāo)識符,是拿來標(biāo)識對象或者項(xiàng)目的,它就象我們的姓名一樣,每個(gè)人都會有一個(gè),不同的人的姓名不一樣,但是,也可能有一個(gè)名字和你一樣的人。從數(shù)據(jù)類型上來看它只是一個(gè)16位的無符號整數(shù)。應(yīng)用程序幾乎總是通過調(diào)用一個(gè)WINDOWS函數(shù)來獲得一個(gè)句柄,之后其他的WINDOWS函數(shù)就可以使用該句柄,以引用相應(yīng)的對象。

如果想更透徹一點(diǎn)地認(rèn)識句柄,我可以告訴大家,句柄是一種指向指針的指針。我們知道,所謂指針是一種內(nèi)存地址。應(yīng)用程序啟動后,組成這個(gè)程序的各對象是住留在內(nèi)存的。如果簡單地理解,似乎我們只要獲知這個(gè)內(nèi)存的首地址,那么就可以隨時(shí)用這個(gè)地址訪問對象。但是,如果您真的這樣認(rèn)為,那么您就大錯特錯了。我們知道,Windows是一個(gè)以虛擬內(nèi)存為基礎(chǔ)的操作系統(tǒng)。在這種系統(tǒng)環(huán)境下,Windows內(nèi)存管理器經(jīng)常在內(nèi)存中來回移動對象,依此來滿足各種應(yīng)用程序的內(nèi)存需要。對象被移動意味著它的地址變化了。如果地址總是如此變化,我們該到哪里去找該對象呢?

為了解決這個(gè)問題,Windows操作系統(tǒng)為各應(yīng)用程序騰出一些內(nèi)存儲地址,用來專門登記各應(yīng)用對象在內(nèi)存中的地址變化,而這個(gè)地址(存儲單元的位置)本身是不變的。Windows內(nèi)存管理器在移動對象在內(nèi)存中的位置后,把對象新的地址告知這個(gè)句柄地址來保存。這樣我們只需記住這個(gè)句柄地址就可以間接地知道對象具體在內(nèi)存中的哪個(gè)位置。這個(gè)地址是在對象裝載(Load)時(shí)由系統(tǒng)分配給的,當(dāng)系統(tǒng)卸載時(shí)(Unload)又釋放給系統(tǒng)。

句柄地址(穩(wěn)定)→記載著對象在內(nèi)存中的地址————→對象在內(nèi)存中的地址(不穩(wěn)定)→實(shí)際對象

本質(zhì):WINDOWS程序中并不是用物理地址來標(biāo)識一個(gè)內(nèi)存塊,文件,任務(wù)或動態(tài)裝入模塊的,相反的,WINDOWS API給這些項(xiàng)目分配確定的句柄,并將句柄返回給應(yīng)用程序,然后通過句柄來進(jìn)行操作。

但是必須注意的是程序每次從新啟動,系統(tǒng)不能保證分配給這個(gè)程序的句柄還是原來的那個(gè)句柄,而且絕大多數(shù)情況的確不一樣的。假如我們把進(jìn)入電影院看電影看成是一個(gè)應(yīng)用程序的啟動運(yùn)行,那么系統(tǒng)給應(yīng)用程序分配的句柄總是不一樣,這和每次電影院售給我們的門票總是不同的一個(gè)座位是一樣的道理。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频