Windows編程--偽控制代碼

來源:互聯網
上載者:User

在系統中,對象分兩類:核心對象和使用者物件。如進程對象,線程對象,檔案對應物件等就是核心對象;而向視窗,菜單等都是使用者物件。

兩者的差別是:

使用者物件的控制代碼是系統唯一的。一個進程完全可以對另外一個進程中的使用者物件進行操作。比如兩個處理序間通訊的方法之一就是發送訊息。正是由於視窗是使用者物件,所以控制代碼是系統唯一,通過FindWindow(),得到另外一個進程的視窗控制代碼,然後用SendMessage(),讓hWnd的視窗過程來處理訊息,實現了進程間的通訊。因此,對於使用者物件,可以直接把控制代碼拿來用就行了。

核心對象需要考慮系統的穩定性,因此,核心物件控點是進程相關的。在每一個進程中都有一個核心對象表,每一個對象的索引(不完全是)作為核心對象的控制代碼,從而實現進程相關,這種控制代碼稱之為“偽控制代碼”,即只能在本進程中使用,越過本進程就不能使用了。

對核心對象進行操作時,系統還要進行安全檢驗,看一下你是否有權來操作這個對象。所以不能同使用者物件一樣直接把控制代碼拿過來用。比方說,你想操作另一個進程中的檔案對應物件,這個檔案對應物件控制代碼在那個進程中假設是0x000001,但在你的進程中,很有可能0x00000001時表示另一個核心對象(即不同進程中,可能存在相同的控制代碼號的核心對象),此時的操作就永遠不會成功,甚至會產生災難性的後果,此時,就有必要用DuplicateHandle()將進程相關的偽控制代碼轉化為全域可用的實控制代碼。

 


      GetCurrentProcess()得到得到就是一個偽控制代碼,它只是一個標識,它返回的就是$FFFFFFFF,每個進程得控制代碼都是一樣的,只是適用於進程內部的使用。想得到實際的控制代碼,在進程間進行通訊,必需要進行轉化,即調用DuplicateHandle函數,但注意,實控制代碼使用完成以後,你必須要調用CloseHandle去關閉。而偽控制代碼不用關閉,也不會造成記憶體流失。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.