句柄和偽句柄有什么區別?~


句柄和偽句柄有什么區別?~


評論 ┆ 舉報最佳答案此答案由提問者自己選擇,并不代表百度知道知識人的觀點回答:愛你十萬年新手9月28日 13:48 從Visual C++的頭文件來看,HANDLE被typedef為void的指針,那是指向未確定數據結構的指針:typedef void* HANDLE; 但是這并不說明任何問題,因為句柄遠遠不只是指向任意數據類型的指針 。它是指向數據對象指針的指針 。句柄的使用來源于早期的Windows,當時它只能在有限內存的機器中允許(因為當時內存昂貴也存儲小) 。為了留出足夠的空間內存以運行其他程序,Windows經常將對象在內存中移動 。但是如果進程已經有了指向該對象的指針,移動該對象就將使得指針無效 。為了處理這一問題,Microsoft使用系統指針以跟蹤對象 。程序不是直接使用指針,而是使用句柄,讓它引用包含真實對象的地址 。通過這一方法,Windows可以安全按照需要移動對象,然后更新參考中的指針,從而允許進程安全地訪問對象 。當進程需要使用句柄訪問對象時,它調用GlobalLocl()以鎖定內存的對象 。這時Windows將返回對象的實際地址,從而進程可以安全讀寫該對象 。只要對象被進程鎖定,Windows就不會去移動它 。句柄包含的不只是對象的地址;比如,它還包含鎖計數器,標識著多少進程已經請求過對象的地址 。只要這個鎖計數器大于0,Windows就不會移動該對象 。這個思想擴展到大部分對象上,包括文件,也由其句柄標識 。這時,句柄就是指向對象的指針,而該對象包含指向另一個對象的指針 。這對于現在的機器有些奇怪 。當Windows從單個分時共享程序向多任務操作系統轉變時,有如此之多的遺留代碼需要在新的操作系統上運行,于是句柄在這一轉變中保留下來了 。揪錯 ┆ 評論 ┆ 舉報
【句柄和偽句柄有什么區別?~】

    猜你喜歡