windows 之是以要設立句柄,根本上源于記憶體管理機制的問題—虛拟位址,簡而言之資料的位址需要變動,變動以後就需要有人來記錄管理變動,(就好像戶籍管理一樣),是以系統用句柄來記載資料位址的變更。
Windows是一個以虛拟記憶體為基礎的作業系統,很多時候,程序的代碼和資料并不全部裝入記憶體,程序的某一段裝入記憶體後,還可能被換出到外存,當再次需要時,再裝入記憶體。兩次裝入的位址絕大多數情況下是不一樣的。也就是說,同一對象在記憶體中的位址會變化。那麼,程式怎麼才能準确地通路到對象呢?為了解決這個問題,Windows引入了句柄。
系統為每個程序在記憶體中配置設定一定的區域,用來存放各個句柄,即一個個32位無符号整型值(32位作業系統中,64位作業系統中為8位元組)。每個32位無符号整型值相當于一個指針,指向記憶體中的另一個區域(我們不妨稱之為區域A)。而區域A中存放的正是對象在記憶體中的位址。當對象在記憶體中的位置發生變化時,區域A的值被更新,變為目前時刻對象在記憶體中的位址,而在這個過程中,區域A的位置以及對應句柄的值是不發生變化的。這種機制,用一種形象的說法可以表述為:有一個固定的位址(句柄),指向一個固定的位置(區域A),而區域A中的值可以動态地變化,它時刻記錄着目前時刻對象在記憶體中的位址。這樣,無論對象的位置在記憶體中如何變化,隻要我們掌握了句柄的值,就可以找到區域A,進而找到該對象。而句柄的值在程式本次運作期間是絕對不變的,我們(即系統)當然可以掌握它。
如果想更透徹一點地認識句柄,我可以告訴大家,句柄是一種指向指針的指針。
數值上,是一個32位無符号整型值(32位系統下)
邏輯上,相當于指針的指針;

通常我們說句柄是WINDOWS用來辨別被應用程式所建立或使用的對象的唯一整數。句柄是和對象一一對應的32位無符号整數值 。對象可以映射到唯一的句柄,句柄也可以映射到唯一的對象。這裡将句柄所能辨別的所有東西(如視窗、檔案、畫筆等)統稱為“對象”。
例子一
比如你做了虧心事(我說的是比如,呵呵),不幸讓我抓住了把柄,那麼我讓你做什麼你就得做什麼,因為你的把柄在我這。我們程式設計的時候也是這樣,比如我們要想操縱一個視窗,那我們就必須“抓住它的把柄”,隻有這樣,我們才能改變它的屬性,改變它的式樣,甚至銷毀它(狠了點兒)
例子二
你考上了大學,入學後,學校(作業系統)會給你一個學生證号。注意,這個号碼是學校指定的,你無法自選。有了這個号碼(學生證,假設一證多用)就可以享受學校提供的服務:如你就可以去圖書館借書,去食堂吃飯,去教室上課等等。但你不能到食堂裡買啤酒,因為學校不允許這種服務。而在計算機中系統提供的服務就是API調用,你有了HANDLE,就可以理直氣壯地向系統提出調用API的服務。而指針的權力就大多了,有了指針你可以到處去喝酒,打架,學校(作業系統)管不着,是以句柄和指針的差別在于句柄隻能調用系統提供的服務。而句柄雖然是一個能互相差別的号碼,但與我們普通的ID号又有差別,普通的ID号是可以由程式員自己定義的,而句柄不行,它是對象生成時系統指定的,是為了差別系統中存在的各個對象,這個句柄不是由程式員賦給的。實際應用中,最常用的就是檔案句柄和視窗句柄。例如,視窗句柄的值是一個長整數,每個窗體都用一個句柄來表示。是以句柄是不會重複的,很多的函數都會用到窗體的句柄
本文來自部落格園,作者:農碼一生,轉載請注明原文連結:https://www.cnblogs.com/wml-it/p/15709535.html
<b>技術的發展日新月異,随着時間推移,無法保證本部落格所有内容的正确性。如有誤導,請大家見諒,歡迎評論區指正!</b>
<b>個人開源代碼連結:</b>
<b>GitHub:</b>https://github.com/ITMingliang
<b>Gitee:</b>https://gitee.com/mingliang_it
<b>GitLab:</b>https://gitlab.com/ITMingliang
<b>進開發學習交流群:</b>