句柄

程序设计中,句柄handle)是Windows操作系统用来标识被应用程序所建立或使用的对象的整数。其本质相当于带有引用计数的智能指针。当一个应用程序要引用其他系统(如数据库操作系统)所管理的内存块或对象时,可以使用句柄。

句柄与指针

句柄与普通指针的区别在于,指针包含的是引用对象内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。(参见封装)。通俗的说就是我们调用句柄就是调用句柄所提供的服务,即句柄已经把它能做的操作都设定好了,我们只能在句柄所提供的操作范围内进行操作,但是普通指针的操作却多种多样,不受限制。

句柄与安全性

客户获得句柄时,句柄不仅是资源的标识符,也被授予了对资源的特定访问权限。

句柄与操作系统

在上世纪80年代的操作系统(如Mac OS[1]Windows)的内存管理中,句柄被广泛应用。Unix系统的文件描述符基本上也属于句柄。和其它桌面环境一样,Windows API大量使用句柄来标识系统中的对象,并建立操作系统与用户空间之间的通信渠道。例如,桌面上的一个窗体由一个HWND类型的句柄来标识。

如今,内存容量的增大和虚拟内存算法使得更简单的指针愈加受到青睐,而指向另一指针的那类句柄受到冷淡。尽管如此,许多操作系统仍然把指向私有对象的指针以及进程传递给客户端的内部数组下标称为句柄。

译名

康奈尔大学副教授David Gries英语David Gries所著的《Compiler Construction for Digital Computer》. John Wiley and Sons, New York, 1971, 491 pages, ISBN 0-471-32776-X,给出如下定义:

 (2.3.10) DEFINITION. A handle of any sentential form is a leftmost simple phrase.

在该书的中译本: D.格里斯著,仲萃豪等译:《数字计算机的编译程序构造》,科学出版社, 1976年版,给出了如下翻译:

(2.3.10)定义.任一句型的句柄就是此句型的最左简单短语。

Windows句柄的本质

内核对象是内存中的数据结构,由操作系统内核分配,并且只能由操作系统内核访问。内核对象的数据结构使用引用计数,计数变为0后操作系统内核就会销毁该内核对象。安全描述符(SECURITY_ATTRIBUTES结构)描述内核对象的安全性,指出内核对象的拥有者、哪些组或用户可以访问此对象。作为对照,用户对象或GDI对象(如菜单、窗口、鼠标光标等)在创建时不需要指出安全描述符。[2]

操作系统内核中有一个全局句柄表。每个进程有自己的一个句柄表,是一个数据结构组成的数组,每个数据结构包含一个指向内核对象的指针、访问掩码、继承标识等。句柄是进程句柄表数组的下标。在32位系统中,句柄是一个32位值。64位系统中则是64位值。应用程序调用创建内核对象的API函数后,该API函数会返回一个句柄以标识操作系统内核所创建的内核对象。这个句柄可以由进程的任何线程使用。使用CloseHandle函数或者进程结束时,内核句柄表中相应项的计数值会被减1。

GetCurrentProcess函数返回当前进程的句柄,其值为-1;GetCurrentThread函数返回的句柄其值为-2。二者都是伪句柄,在进程的句柄表中没有这两项,仅代表当前进程和当前线程。

进程间共享内核对象有如下途径:

  • 父子进程间的句柄继承:在调用API函数来创建内核对象时,使用SECURITY_ATTRIBUTES结构来指出可以被继承。创建子进程时,所有被继承的句柄在子进程句柄表中的位置与在父进程中完全一样;内核对象的使用计数也会加1。
  • 命名对象:注意所有种类的内核对象使用同一个命名空间。
  • 复制对象句柄:使用DuplicateHandle函数

文件/设备句柄的操作系统API

Windows操作系统提供下述API函数以访问文件或设备:

SetHandleInformation 设置指定句柄的当前标识

GetHandleInformation 返回指定句柄的当前标识

HANDLE CreateFile(  
                  LPCTSTR,lpFileName,                        //指向文件名的指针  
                  DWORD dwDesiredAccess,                     //访问模式(读/写/读写/0表示不读写仅获取文件信息)  
                  DWORD dwShareMode,                         //共享模式  
                  LPSECURITY_ATTRIBUTES lpSecurityAttributes,//用于确定如何在子进程中继承这个句柄  
                  DWORD dwCreationDisposition,               // 文件存在或不存在时的操作
                                                                //CREATE_NEW:创建文件,如果文件存在会出错;
                                                                //CREATE_ALWAYS:创建文件,如果该文件已经存在,函数将覆盖已存在的文件并清除已存在的文件属性
                                                                //OPEN_EXISTING:打开已存在文件;
                                                                //OPEN_ALWAYS:如果不存在就创建;
                                                                //TRUNCATE_EXISTING:将现有的文件缩短为零长度。调用进程必须用GENERIC_WRITE访问模式打开文件.如果文件不存在则函数就会失败.  
                  DWORD dwFlagAndAttributes,                 //指定新创建文件的属性;以及文件的标志位 
                                                                //FILE_ATTRIBUTE_ARCHIVE:标记为归档属性;
                                                                //FILE_ATTRIBUTE_NORMAL:默认属性;文件没有被设置任何属性;仅单独使用生效。
                                                                //FILE_ATTRIBUTE_HIDDEN:隐藏文件或目录;
                                                                //FILE_ATTRIBUTE_OFFLINE 文件数据不可直接利用。指出文件数据已经在物理上移动到脱机存储。
                                                                //FILE_ATTRIBUTE_READONLY:文件为只读;
                                                                //FILE_ATTRIBUTE_SYSTEM:文件为系统文件;
                                                                //FILE_ATTRIBUTE_COMPRESSED 将文件标记为已压缩,或者标记为文件在目录中的默认压缩方式 
                                                                //FILE_ATTRIBUTE_TEMPORARY 文件用于临时存储;文件系统尽量把文件数据保存在内存而不是刷回主存储;临时文件不再使用后应用程序应该尽快删除临时文件。
                                                                //FILE_FLAG_WRITE_THROUGH 	系统写通过任何中间缓存直接写入硬盘;系统仍然可以缓存写操作,但不得懒惰地刷回硬盘
                                                                //FILE_FLAG_OVERLAPPED 	允许对文件进行[[重叠I/O]]操作
                                                                //FILE_FLAG_NO_BUFFERING 	禁止对文件进行缓冲处理。文件只能写入磁盘卷的扇区块
                                                                //FILE_FLAG_RANDOM_ACCESS 	针对随机访问对文件缓冲进行优化
                                                                //FILE_FLAG_SEQUENTIAL_SCAN 	针对从头到尾的顺序访问方式对大文件缓冲进行优化
                                                                //FILE_FLAG_DELETE_ON_CLOSE 	关闭了所有打开的句柄后,文件立即被删除。特别适合临时文件。如果没有使用FILE_SHARE_DELETE,后续的打开文件的请求将会失败.
                                                                //FILE_FLAG_BACKUP_SEMANTICS 指示系统文件的打开或创建将用于备份或恢复操作。系统保证调用进程如果有必要的特权(SE_BACKUP_NAME与SE_RESTORE_NAME),将忽略文件安全检查。这个标志也适用于文件夹句柄。
                                                                //FILE_FLAG_POSIX_SEMANTICS 指明文件基于POSIX规则被访问。例如多个文件使用只有大小写区别的文件名(如果文件系统支持的话)。在MS-DOS与16位Windows下,由于难以兼容,需谨慎使用。
                                                                //FILE_FLAG_OPEN_REPARSE_POINT 指出禁止[[NTFS重解析点]]的行为。标志不能够和CREAT_ALWAYS一起使用.
                                                                //FILE_FLAG_OPEN_NO_RECALL 指明需要文件数据,但是将继续从远程存储器中读写,不会将数据存放在本地存储器中。这个标志由远程存储系统或分层存储管理器系统使用.
                  HANDLE hTemplateFile                       //如果不为0,则指定一个文件句柄,新的文件将从这个文件中复制扩展属性  
                 )//如果函数失败,返会值会是INVALID_HANDLE_VALUE

SetFilePointer();//设置文件指针位置

BOOL WriteFile(  
               HANDLE fFile,                  //文件句柄  
               LPCVOID lpBuffer,              //数据缓存区指针  
               DWORD nNumberOfBytesToWrite,   //所要写的字节数  
               LPDWORD lpNumberOfBytesWritten,//用于保存实际写入字节数的存储区的指针  
               LPOVERLAPPED lpOverlapped      //OVERLAPPED结构体指针  
              )

BOOL ReadFile(  
                   HANDLE fFile,                  //文件句柄  
                   LPCVOID lpBuffer,              //数据缓存区指针  
                   DWORD nNumberOfBytesToRead,    //所要写的字节数  
                   LPDWORD lpNumberOfBytesRead,   //用于保存实际写入字节数的存储区的指针  
                   LPOVERLAPPED lpOverlapped      //OVERLAPPED结构体指针  
                  )  

CloseHandle(hFILE); //关闭句柄

GetDiskFreeSpace(); //确定扇区的尺寸

文件存取的字节数必须是扇区尺寸的整倍数。进行读和写操作的地址必须扇区位置对齐(在内存中地址对齐到扇区容量的整倍数),可用VirtualAlloc()在内存中申请缓冲区,做到内存页对齐(从而硬盘扇区也对齐)。

参见

参考文献

  1. ^ Hertzfeld, Andy, The Original Macintosh: Hungarian, January 1982 [2010-05-10], (原始内容存档于2010-06-19) 
  2. ^ Ruediger Asche: "Give Me a Handle, and I'll Show You an Object", in MSDN. [2017-09-18]. (原始内容存档于2018-10-29). 

Read other articles:

Часть серии статей о Холокосте Идеология и политика Расовая гигиена · Расовый антисемитизм · Нацистская расовая политика · Нюрнбергские расовые законы Шоа Лагеря смерти Белжец · Дахау · Майданек · Малый Тростенец · Маутхаузен ·&...

 

فرحات عباس فرحات عباس معلومات شخصية الميلاد 24 أغسطس 1899[1][2]  جيجل الوفاة 24 ديسمبر 1985 (86 سنة) [1][3]  الجزائر العاصمة  مواطنة الجزائر  منصب رئيس الحكومة الجزائرية المؤقتة بداية 19 سبتمبر 1958 نهاية 9 أغسطس 1961 الحياة العملية المدرسة الأم جامعة الجزائر  ا...

 

This article does not cite any sources. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Elbląg Voivodeship – news · newspapers · books · scholar · JSTOR (December 2009) (Learn how and when to remove this template message) Elbląg Voivodeship Elbląg Voivodeship (Polish: województwo elbląskie) was a unit of administrative division and local government in Poland f...

Emirati middle-distance runner Betlhem DesalegnBetlhem Desalegn at the 2016 World Indoor ChampionshipsPersonal informationBorn (1991-11-13) 13 November 1991 (age 32)Addis Ababa, EthiopiaHeight1.65 m (5 ft 5 in)[1]Weight52 kg (115 lb)SportSportAthleticsEvent(s)1500 m, 5000 mCoached byJama Aden Medal record Women's athletics Representing  United Arab Emirates Pan Arab Games 2011 Doha 5000 m 2011 Doha 1500 m Betlhem Desalegn Belayneh (Amharic: ቤተል...

 

Gunung GambutaHuidu GambutaTitik tertinggiKetinggian1.679 m (5.509 ft)GeografiLetakSuwawa Timur, Kabupaten Bone Bolango, Provinsi Gorontalo, Pulau Sulawesi, Indonesia Gunung Gambuta adalah nama sebuah gunung yang terletak di Desa Poduoma, Kecamatan Suwawa Timur, Kabupaten Bone Bolango, Provinsi Gorontalo, Pulau Sulawesi. Gunung Gambuta memiliki ketinggian 1.679 mdpl dan menjadi gunung tertinggi ke-11 di Gorontalo.[1] Batas Alam Pada tahun 2017, Kemendagri memfasilitasi kesep...

 

Tour de Colombie 2022 GénéralitésCourse72e Tour de ColombieCompétitionUCI America Tour 2022 2.2Étapes10Dates3 – 12 juin 2022Distance1 427,9 kmPays ColombieLieu de départBarranquillaLieu d'arrivéeTunjaÉquipes26Partants174Arrivants101Vitesse moyenne39,797 km/hRésultatsVainqueur Fabio Duarte (Team Medellín-EPM)Deuxième Hernando Bohórquez (EPM-Scott)Troisième Julián Cardona (Team Sistecrédito)Classement par points Aldemar Reyes (Team Medellín-EPM)Meilleur grimpeur Santiago ...

Pour les articles homonymes, voir Choukhov. Boris ChoukhovInformationsNom de naissance Boris Khabalovitch ChoukhovNom court Борис ШуховNaissance 8 mai 1947 (76 ans)KodymaNationalité russeDistinctions Maître émérite du sport de l'URSSOrdre de l'Insigne d'honneurMédaille pour travail distingué (en)Équipes amateurs Équipe de l'URSSPrincipales victoires Champion olympique du contre-la-montre par équipes (1972)modifier - modifier le code - modifier Wikidata Boris Khabalovi...

 

Museo de Pontevedra Bien de interés cultural Entrada al museo UbicaciónPaís España EspañaComunidad Galicia GaliciaProvincia Pontevedra PontevedraDirección Pasantería, 2-12 36002Coordenadas 42°25′57″N 8°38′35″O / 42.4325, -8.6430555555556Tipo y coleccionesSuperficie 10 000 m²Historia y gestiónCreación 30 de diciembre de 1927Inauguración 10 de agosto de 1929Información del edificioConstrucción 30 de diciembre de 1927Arquitecto Celestino Garc...

 

Pour les articles homonymes, voir Baur. Harry BaurHarry Baur en 1940[1].BiographieNaissance 12 avril 188011e arrondissement de ParisDécès 8 avril 1943 (à 62 ans)9e arrondissement de ParisSépulture Cimetière Saint-VincentNom de naissance Henri Marie Rodolphe BaurNationalité FrançaisActivité ActeurConjoints Rose Grane (de 1910 à 1931)Rika Radifé (de 1936 à 1943)Autres informationsSport Rugby à XVÉquipe Olympique de MarseilleDistinction Officier de la Légion d'honne...

Julen Lopetegui Julen Lopetegui, alors sélectionneur de l'Espagne. Biographie Nom Julen Lopetegui Agote Nationalité Espagnole Naissance 28 août 1966 (57 ans) Asteasu (Espagne) Taille 1,85 m (6′ 1″) Période pro. 1985 – 2002 Poste Gardien de but Parcours junior Années Club Real Sociedad 1985-1988 Real Madrid Castilla 070 0(0) Parcours senior1 AnnéesClub 0M.0(B.) 1988-1989 → UD Las Palmas 033 0(0) 1989-1991 Real Madrid 001 0(0) 1991-1994 CD Logroñés 125 0(0) 1994-...

 

This article is about the former Roman Catholic church in Warwick. For the current Roman Catholic church in Warwick, see Second St Mary's Church, Warwick. Church in AustraliaFirst St Mary's Roman Catholic Church, WarwickSt Mary of the Assumption ChurchFirst St Mary's Roman Catholic Church, 201528°13′09″S 152°01′53″E / 28.2191°S 152.0314°E / -28.2191; 152.0314Address163 Palmerin Street, Warwick, Southern Downs Region, QueenslandCountryAustraliaDenominationR...

 

Yi Chang redirects here. For the Hong Kong actor surnamed Chang, see Chang Yi (actor). Prefecture-level city in Hubei, People's Republic of ChinaYichang 宜昌市IchangPrefecture-level cityThree Gorges Dam, Cool shrimp, Tribe of Three Gorges, Qingjiang Gallery, Sanyou Cave, Three Gorges Waterfall, Xiling Gorge.Location of Yichang City jurisdiction in HubeiYichangLocation of the city in HubeiShow map of HubeiYichangLocation of the city in ChinaShow map of ChinaCoordinates (Yichang municipa...

American anthropologist (1922–2007) Stanley Marion Garn Ph.D. (October 27, 1922 – August 31, 2007) was a human biologist and educator. He was Professor of Anthropology at the College for Literature, Science and Arts and Professor of Nutrition at the School of Public Health at the University of Michigan.[1] He joined the University of Michigan in 1968.[2] Work Garn graduated from Harvard University with a AB in 1942, AM in 1947, and PhD in 1952.[3] Garn produced a l...

 

Iroquoian language spoken by Mohawks in the United States and Canada This article is about the language spoken by the Mohawk people. For other uses, see Mohawk. MohawkKanienʼkéhaKanyenʼkéhaPronunciation[ɡa.njʌ̃ʔ.ˈɡe.ha]Native toUnited States, CanadaRegionOntario, Quebec and northern New YorkEthnicityMohawk peopleNative speakers3,875 (2011–2016)[1][2]Language familyIroquoian NorthernLake IroquoianFive NationsMohawk–OneidaMohawkLanguage codesISO 6...

 

Artikel ini sebatang kara, artinya tidak ada artikel lain yang memiliki pranala balik ke halaman ini.Bantulah menambah pranala ke artikel ini dari artikel yang berhubungan atau coba peralatan pencari pranala.Tag ini diberikan pada November 2022. 道 〜白磁の人〜Hakuji no HitoSutradaraBanmei TakahashiProduserKazuhiro OgawaPemeranHisashi YoshizawaBae Soo-BinTanggal rilis 2012 (2012) Negara JepangBahasaJepang / Korea Hakuji no Hito (道 〜白磁の人〜code: ja is deprecated ) adala...

Westfassade mit Dreiportalanlage Westfassade vor der Abtragung des beschädigten Nordturms 1844/45 Die Kathedrale von Saint-Denis (französisch Basilique de Saint-Denis) ist eine ehemalige Abteikirche in der Stadt Saint-Denis nördlich von Paris. Sie gilt kunsthistorisch als einer der Gründungsbauten der Gotik, da in dem 1140 unter Abt Suger begonnenen Umgangschor die ersten spitzbogigen Kreuzrippengewölbe ausgeführt wurden. Fast 80 Jahre später bot sie erneut eine Innovation: ab 1231 wur...

 

Vertical transport device For other uses, see Elevator (disambiguation). This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Elevator – news · newspapers · books · scholar · JSTOR (October 2023) (Learn how and when to remove this message) Outside of typical elevators, shown in an office building in Portland, Ore...

 

Voce principale: Unione Sportiva Salernitana 1919. Salernitana SportStagione 1987-1988 Sport calcio Squadra Salernitana Allenatore Claudio Tobia, poi Roberto Claguna Presidente Giuseppe Soglia Serie C110º posto Coppa Italia CFase a gironi 1986-1987 1988-1989 Si invita a seguire il modello di voce Questa pagina raccoglie i dati riguardanti la Salernitana Sport nelle competizioni ufficiali della stagione 1987-1988. Indice 1 Stagione 2 Divise e sponsor 3 Rosa 4 Risultati 4.1 Campionato 4....

Johan Tobias SergelJohan Tobias Sergel. LithographieNaissance 28 août 1740StockholmDécès 26 février 1814 (à 73 ans)StockholmSépulture Adolf Fredrik Church cemetery (d)Nationalité SuédoisActivité Sculpteur et dessinateurFormation Académie royale suédoise des Beaux-ArtsMaîtres Jean Eric Rehn, Jacques Adrien Masreliez (en), Pierre-Hubert LarchevêqueLieux de travail Paris (1758-1767), Rome (1767-1778), Stockholm (1778-1814), Italie (1784), StockholmPère Christoffer Sergell (d)F...

 

Sokrátis Sokrátis sous le maillot d'Arsenal en 2018. Biographie Nom Sokrátis Papastathópoulos Nationalité Grec Naissance 9 juin 1988 (36 ans) Kalamata (Grèce) Taille 1,86 m (6′ 1″) Période pro. 2005 – 2024 Poste Défenseur central Pied fort Droit Parcours junior Années Club Aiantas Kalamatas Apollon Petalidiou 2004-2005 AEK Athènes Parcours professionnel1 AnnéesClub 0M.0(B.) 2005-2008 AEK Athènes 054 0(1) 2006 → Niki Volos FC 011 0(0) 2008-2010 Genoa CFC 059...