GetCurrentProcess()和DuplicateHandle()

來源:互聯網
上載者:User

GetCurrentProcess():

GetCurrentProcess得到得到的稱之為"偽控制代碼"
只是一個標識,你可以發現,其實就是返回$FFFFFFFF,
每個進程得控制代碼都是一樣得,只是實用於進程內部得使用.
如果你想得到實際得控制代碼,在進程間進行通訊,必需要進行轉化,
調用DuplicateHandle,注意,得實控制代碼使用完成以後,你必須要調用CloseHandle去關閉.
其實,你應該明白了為何"偽控制代碼"得存在,就是使用簡單,不用關閉,
不會造成記憶體流失.

同樣道理,GetCurrentThread也是偽控制代碼,其值永遠是$FFFFFFFE,只是適用於線程內部得使用.

DuplicateHandle() :

在系統中,對象分兩類:核心對象和使用者物件.如進程對象,線程對象,檔案對應
對象等就是核心對象;而向視窗,菜單等都是使用者物件.
兩者是有差別的,用於標示使用者物件的控制代碼是系統唯一的,也就是說,一個進程
完全可以對另外一個進程中的使用者物件進行操作,比如兩個處理序間通訊的方法之一,
就是發送訊息.正是由於視窗是使用者物件,所以控制代碼是系統唯一,通過FindWindow(),
得到另外一個進程的視窗控制代碼,然後用SendMessage(),讓hWnd的視窗過程來處理消
息,實現了進程間的通訊.因此,對於使用者物件,你根本不用DuplicateHandle(),直接
把控制代碼拿來用就行了.
而核心對象則不一樣.核心對象是為了加強系統的穩定性,因此,核心物件控點是
進程相關的,在每一個進程中都有一個核心對象表,每一個對象的索引(不完全是)作為內和對象的控制代碼,從而實現進程相關.同一個對象在不同的進程中可能有不同的索引,即控制代碼.對核心對象進行操作時,系統還要進行安全檢驗,看一下你是否有權來操作這個對象.因此你不能同使用者物件一樣,直接把控制代碼拿過來用.比方說,你想操作另一個進程中的檔案對應物件,這個檔案對應物件控制代碼在那個進程中假設是0x000001,但在你的進程中,很有可能0x00000001時表示另一個核心對象,此時的操作就永遠不會成功,甚至會產生災難性的後果.此時,就有必要用DuplicateHandle().

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.