當前位置:首頁 » 密碼管理 » 句柄訪問

句柄訪問

發布時間: 2023-01-18 21:58:10

1. 句柄是什麼意思

句柄是一個是用來標識對象或者項目的標識符,可以用來描述窗體、文件等,值得注意的是句柄不能是常量。

最左素短語是句型中最左邊的素短語。素短語是指至少含有一個終結符的短語,並且除自身外,不包含更小的素短語。

句柄並不是一種具體的、固定不變的數據類型或實體,而是代表了程序設計中的一個廣義的概念。句柄一般是指獲取另一個對象的方法一個廣義的指針。

它的具體形式可能是一個整數、一個對象或就是一個真實的指針,而它的目的就是建立起與被訪問對象之間的唯一的聯系。



(1)句柄訪問擴展閱讀:

句柄在 Windows編程中是一個很重要的概念,在 Windows程序中並不是用物理地址來標識一個內存塊、文件、任務或動態裝入模塊的。相反地,Windows API給這些項目分配確定的句柄,並將句柄返回給應用程序,然後通過句柄來進行操作。

應該明白的是,句柄是一個標識符,是用來標識對象或者項目的。從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個Windows函數來獲得一個句柄,之後其他的Windows函數就可以使用該句柄,以引用相應的對象。在 Windows編程中會用到大量的句柄。

2. GO語言(三十):訪問關系型資料庫(上)

本教程介紹了使用 Godatabase/sql及其標准庫中的包訪問關系資料庫的基礎知識。

您將使用的database/sql包包括用於連接資料庫、執行事務、取消正在進行的操作等的類型和函數。

在本教程中,您將創建一個資料庫,然後編寫代碼來訪問該資料庫。您的示例項目將是有關老式爵士樂唱片的數據存儲庫。



首先,為您要編寫的代碼創建一個文件夾

1、打開命令提示符並切換到您的主目錄。

在 Linux 或 Mac 上:


在 Windows 上:


2、在命令提示符下,為您的代碼創建一個名為 data-access 的目錄。


3、創建一個模塊,您可以在其中管理將在本教程中添加的依賴項。

運行go mod init命令,為其提供新代碼的模塊路徑。


此命令創建一個 go.mod 文件,您添加的依賴項將在其中列出以供跟蹤。

注意: 在實際開發中,您會指定一個更符合您自己需求的模塊路徑。有關更多信息,請參閱一下文章。

GO語言(二十五):管理依賴項(上)

GO語言(二十六):管理依賴項(中)

GO語言(二十七):管理依賴項(下)

接下來,您將創建一個資料庫。

在此步驟中,您將創建要使用的資料庫。您將使用 DBMS 本身的 CLI 創建資料庫和表,以及添加數據。

您將創建一個資料庫,其中包含有關黑膠唱片上的老式爵士樂錄音的數據。

這里的代碼使用MySQL CLI,但大多數 DBMS 都有自己的 CLI,具有類似的功能。

1、打開一個新的命令提示符。

在命令行,登錄到您的 DBMS,如下面的 MySQL 示例所示。


2、在mysql命令提示符下,創建一個資料庫。


3、切到您剛剛創建的資料庫,以便您可以添加表。


4、在文本編輯器的 data-access 文件夾中,創建一個名為 create-tables.sql 的文件來保存用於添加表的 SQL 腳本

將以下 SQL 代碼粘貼到文件中,然後保存文件。


在此 SQL 代碼中:

(1)刪除名為album表。 首先執行此命令可以讓您更輕松地稍後重新運行腳本。

(2)創建一個album包含四列的表:title、artist和price。每行的id值由 DBMS 自動創建。

(3)添加帶有值的四行。

5、在mysql命令提示符下,運行您剛剛創建的腳本。

您將使用以下形式的source命令:


6、在 DBMS 命令提示符處,使用SELECT語句來驗證您是否已成功創建包含數據的表。

接下來,您將編寫一些 Go 代碼進行連接,以便進行查詢。

現在你已經有了一個包含一些數據的資料庫,開始你的 Go 代碼。

找到並導入一個資料庫驅動程序,該驅動程序會將您通過database/sql包中的函數發出的請求轉換為資料庫可以理解的請求。

1、在您的瀏覽器中,訪問SQLDrivers wiki 頁面以識別您可以使用的驅動程序。

2、使用頁面上的列表來識別您將使用的驅動程序。為了在本教程中訪問 MySQL,您將使用 Go-MySQL-Driver。

3、請注意驅動程序的包名稱 - 此處為github.com/go-sql-driver/mysql.

4、使用您的文本編輯器,創建一個用於編寫 Go 代碼的文件,並將該文件作為 main.go 保存在您之前創建的數據訪問目錄中。

5、進入main.go,粘貼以下代碼導入驅動包。

在此代碼中:

(1)將您的代碼添加到main包中,以便您可以獨立執行它。

(2)導入 MySQL 驅動程序github.com/go-sql-driver/mysql。

導入驅動程序後,您將開始編寫代碼以訪問資料庫。

現在編寫一些 Go 代碼,讓您使用資料庫句柄訪問資料庫。

您將使用指向結構的指針sql.DB,它表示對特定資料庫的訪問。

編寫代碼

1、進入 main.go,在import您剛剛添加的代碼下方,粘貼以下 Go 代碼以創建資料庫句柄。

在此代碼中:

(3)使用 MySQL 驅動程序Config和FormatDSN類型以收集連接屬性並將它們格式化為連接字元串的 DSN。

該Config結構使代碼比連接字元串更容易閱讀。

(4)調用sql.Open 初始化db變數,傳遞 FormatDSN。

(5)檢查來自 的錯誤sql.Open。例如,如果您的資料庫連接細節格式不正確,它可能會失敗。

為了簡化代碼,您調用log.Fatal結束執行並將錯誤列印到控制台。在生產代碼中,您會希望以更優雅的方式處理錯誤。

(6)調用DB.Ping以確認連接到資料庫有效。在運行時, sql.Open可能不會立即連接,具體取決於驅動程序。您在Ping此處使用以確認 database/sql包可以在需要時連接。

(7)檢查來自Ping的錯誤,以防連接失敗。

(8)Ping如果連接成功,則列印一條消息。

文件的頂部現在應該如下所示:

3、保存 main.go。

1、開始跟蹤 MySQL 驅動程序模塊作為依賴項。

使用go get 添加 github.com/go-sql-driver/mysql 模塊作為您自己模塊的依賴項。使用點參數表示「獲取當前目錄中代碼的依賴項」。

2、在命令提示符下,設置Go 程序使用的DBUSER和DBPASS環境變數。

在 Linux 或 Mac 上:

在 Windows 上:


3、在包含 main.go 的目錄中的命令行中,通過鍵入go run來運行代碼。

連接成功了!

接下來,您將查詢一些數據。

3. 句柄什麼意思

句柄有兩種意思,其中第一種是指程序設計,第二種是指Windows編程。

句柄實際上是一個數據,是一個Long (整長型)的數據。

句柄是WONDOWS用來標識被應用程序所建立或使用的對象的唯一整數,WINDOWS使用各種各樣的句柄標識諸如應用程序實例,窗口,控制,點陣圖,GDI對象等等。

WINDOWS句柄有點象C語言中的文件句柄。

從上面的定義中的我們可以看到,句柄是一個標識符,是拿來標識對象或者項目的,它就象我們的姓名一樣,每個人都會有一個,不同的人的姓名不一樣,但是,也可能有一個名字和你一樣的人。

從數據類型上來看它只是一個16位的無符號整數。應用程序幾乎總是通過調用一個WINDOWS函數來獲得一個句柄,之後其他的WINDOWS函數就可以使用該句柄,以引用相應的對象。

(3)句柄訪問擴展閱讀:

句柄的具體作用:

Windows是一個以虛擬內存為基礎的操作系統。在這種系統下,Windows內存管理器經常在內存中來回移動對象,依此來滿足各種應用程序的內存需要。對象被移動意味著它的地址變化了。

地址總是如此變化 ,為了尋找到對象,Windows操作系統為各應用程序騰出一些內存儲地址,用來專門登記各應用對象在內存中的地址變化,而這個地址(存儲單元的位置)本身是不變的。

Windows內存管理器在移動對象在內存中的位置後,把對象新的地址告知這個句柄地址來保存。

這樣我們只需記住這個句柄地址就可以間接地知道對象具體在內存中的哪個位置。這個地址是在對象裝載(Load)時由系統分配給的,當系統卸載時(Unload)又釋放給系統。

4. 二、new 了一個object 發生了什麼

new 了一個object 發生了什麼?

簡單的new一個對象也會設計到3個區域的關聯關系: java棧,java堆,方法區

大概流程:Object o 會存放到棧中的局部變數表中,它的引用reference 會是堆中的內存地址,new Object() 會在堆中創建一個存放object的結構化內存,此外堆中還會存放該對象的類型數據在方法區的地址信息(對象類型,父類,實現的介面,方法等),而方法區存放的為堆中引用地址的具體數據信息;

兩種對象訪問方式結構圖:

虛擬機規范只是定義了reference對象指向對象的引用,而並沒有規范具體怎麼去引用,主流引用方式有兩種,句柄訪問和直接指針訪問;

句柄訪問原理:reference 對象存放的是對象的句柄池池地址,而句柄中存放的是對象的類型指針(方法區中的類型數據)和對象實例的指針

直接指針訪問原理:reference 對象存放的是對象的在堆中的地址;

兩種的利與弊:

句柄:reference對象引用的句柄地址,當對象被移動時,只是修改句柄池到對象實例數據的指針,而不會修改reference對句柄池的指針;

直接指針:直接指針的優點就是快,節省了一步句柄指針定位的時間,java對象訪問非常頻繁,也會省去不小的一份開銷;

hotspot使用的為直接指針訪問;

5. 什麼是句柄

句柄是一個(通常為32位的)整數,它代表一個對象。Windows中的句柄類似傳統C或者MS-DOS程序設計中使用的文件句柄。程序幾乎總是通過呼叫Windows函數取得句柄。程序在其它Windows函數中使用這個句柄,以使用它代表的對象。

在 Windows 中,窗口可以有許多種。窗口可以是屏幕上的一塊矩形封閉區域,比如您熟悉的應用程序窗口。窗體上的控制項(例如列表框或滾動條)也可以是窗口,但並不是所有類型的控制項都是窗口。桌面上的圖標和桌面本身也是窗口。因為所有這些類型的對象都是窗口,所以 Windows 可以用類似的方式處理它們。Windows 給每個窗口一個唯一的句柄,通過句柄操縱該窗口。許多 API 函數可返回句柄或者接受句柄作參數。

創建窗口時,Windows 給它指派一個句柄,窗口消失後句柄被釋放。

6. API中的句柄是什麼意思

句柄實際上是進程句柄表裡的一個索引,句柄表裡存放的是一個指向內核對象的指針,通過句柄就可以操作內核對象了。

7. jvm如何定位一個對象

1、使用句柄:

如果使用句柄訪問的話,那麼java堆將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據和類型數據各自的地址信息

優點:使用句柄的最大的好處就是reference中存儲的時穩定的句柄地址,即的對象移動(例如GC垃圾回收時)時只會改變句柄中的書庫數據的指針,reference本身不需要修改。

2、使用直接指針:

reference中存儲的直接就是對象的地址

優點:直接指針訪問方式最大的好處就是速度快,他節省了一次指針定位的時間開銷,但是由於對象會經常被訪問,因此這項開銷積少成多後也是一項非常可觀的執行成本

8. 句柄和實例句柄有什麼區別,該如何處理

從Visual C++的頭文件來看,HANDLE被typedef為void的指針,那是指向未確定數據結構的指針:typedef void* HANDLE;
但是這並不說明任何問題,因為句柄遠遠不只是指向任意數據類型的指針。它是指向數據對象指針的指針。句柄的使用來源於早期的Windows,當時它只能在有限
內存
的機器中允許(因為當時內存昂貴也存儲小)。為了留出足夠的空間內存以運行其他程序,Windows經常將對象在內存中移動。但是如果進程已經有了指向該對象的指針,移動該對象就將使得指針無效。
為了處理這一問題,Mic
osoft使用系統指針以跟蹤對象。程序不是直接使用指針,而是使用句柄,讓它引用包含真實對象的地址。通過這一方法,Windows可以安全按照需要移動對象,然後更新參考中的指針,從而允許進程安全地訪問對象。
當進程需要使用句柄訪問對象時,它調用Glo
alLocl()以鎖定內存的對象。這時Windows將返回對象的實際地址,從而進程可以安全讀寫該對象。只要對象被進程鎖定,Windows就不會去移動它。句柄包含的不只是對象的地址;比如,它還包含鎖計數器,標識著多少進程已經請求過對象的地址。只要這個鎖計數器大於0,Windows就不會移動該對象。
這個思想擴展到大部分對象上,包括文件,也由其句柄標識。
這時,句柄就是指向對象的指針,而該對象包含指向另一個對象的指針。這對於現在的機器有些奇怪。當Windows從單個分時共享程序向多任務操作系統轉變時,有如此之多的遺留代碼需要在新的操作系統上運行,於是句柄在這一轉變中保留下來了。

9. 句柄是什麼意思

句柄(handle),有兩種解釋

1,句柄是一種特殊的智能指針。當一個應用程序要引用其他系統(如資料庫、操作系統)所管理的內存塊或對象時,就要使用句柄。

2,整個Windows編程的基礎。一個句柄是指使用的一個唯一的整數值,即一個4位元組長的數值,來標識應用程序中的不同對象和同類中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控制項或者文件等。



(9)句柄訪問擴展閱讀

注意事項:

1,內核對象句柄,是用來標識某個內核對象的一個ID同一個對象的該id對於每個進程是不同的,具體如何實現是ms不公開的演算法,以下是一個近似的,可能的演算法。

2,進程創建時,windows系統為進程構造了一個句柄表。

3,當該進程希望獲得一個內核對象句柄或者創建一個內核對象從而獲得該對象句柄時。

4,系統會將在句柄表中增加一個表項,表項的內容中存儲了指向目標內核對象的指針。

同時,系統返回這個表項在句柄表中的索引作為句柄。

10. windows 句柄到底是什麼

句柄,是整個windows編程的基礎。一個句柄是指使用的一個唯一的整數值,即一個四位元組長的數值,來標志應用程序中的不同對象和同類對象中的不同的實例,諸如,一個窗口,按鈕,圖標,滾動條,輸出設備,控制項或者文件等。應用程序能夠通過句柄訪問相應的對象的信息,但是句柄不是一個指針,程序不能利用句柄來直接閱讀文件中的信息。如果句柄不用在I/O文件中,它是毫無用處的。 句柄是windows用來標志應用程序中建立的或是使用的唯一整數,windows使用了大量的句柄來標志很多對象。
windows 之所以要設立句柄,根本上源於內存管理機制的問題—虛擬地址,簡而言之數據的地址需要變動,變動以後就需要有人來記錄管理變動,(就好像戶籍管理一樣),因此系統用句柄來記載數據地址的變更。
數據對象載入進入內存中之後即獲得了地址,但是這個地址並不是固定的,(至於為什麼以及什麼情況下變動具體需要大家研究虛擬地址的原理與機制我這里只提我確定知道的例子)數據對象會根據需要在內存與硬碟之間游弋移動(例如不常用的數據會為常用數據讓出其佔用的內存空間進而被淘汰進硬碟中的虛擬內存之中以優化配置整體系統的資源進而提升效率性能),因此其物理地址總是變動的,那麼作為管理者 則必須對 管理對象所發生的變化了如指掌才行,因此系統為進程分配固定的地址(句柄)來存儲進程下的數據對象變化後的地址也就是當前的地址,其實設計機制很簡單 :系統的某個部門移動了對象的地址後,同時上報給句柄所屬部門管理者,管理者將改動寫入句柄即可。該數據被重新起用時去其所屬句柄內按內容存取即可。
句柄,英文:HANDLE,在Windows編程中是一個很重要的概念,在許多地方都扮演著重要的角色。但由此而產生的句柄概念也大同小異,比如:《Microsoft Windows 3 Developer's Workshop》(Microsoft Press,by Richard Wilton)一書中句柄的概念是:在Windows環境中,句柄是用來標識項目的。
在程序設計中,句柄是一種特殊的智能指針 。當一個應用程序要引用其他系統(如資料庫、操作系統)所管理的內存塊或對象時,就要使用句柄。
句柄與普通指針的區別在於,指針包含的是引用對象的內存地址,而句柄則是由系統所管理的引用標識,該標識可以被系統重新定位到一個內存地址上。這種間接訪問對象的模式增強了系統對引用對象的控制。
在上世紀80年代的操作系統(如Mac OS 和Windows)的內存管理中,句柄被廣泛應用。Unix系統的文件描述符基本上也屬於句柄。和其它桌面環境一樣,Windows API大量使用句柄來標識系統中的對象,並建立操作系統與用戶空間之間的通信渠道。例如,桌面上的一個窗體由一個HWND類型的句柄來標識。如今,內存容量的增大和虛擬內存演算法使得更簡單的指針愈加受到青睞,而指向另一指針的那類句柄受到冷淡。盡管如此,許多操作系統仍然把指向私有對象的指針以及進程傳遞給客戶端的內部數組下標稱為句柄。

熱點內容
ultraedit反編譯 發布:2025-08-27 05:48:15 瀏覽:835
電源編程 發布:2025-08-27 05:42:18 瀏覽:623
mysql存儲過程elseif 發布:2025-08-27 05:20:02 瀏覽:146
python的內存機制 發布:2025-08-27 05:19:29 瀏覽:424
如何反編譯通達信 發布:2025-08-27 05:02:01 瀏覽:701
網吧停電後怎麼重啟伺服器 發布:2025-08-27 05:01:20 瀏覽:953
宣傳片創意文案和腳本 發布:2025-08-27 04:48:41 瀏覽:27
c語言產生不同隨機數 發布:2025-08-27 04:12:32 瀏覽:177
phpbaidu 發布:2025-08-27 03:31:32 瀏覽:672
rip壓縮 發布:2025-08-27 03:16:27 瀏覽:225