GetCurrentProcess():
GetCurrentProcess得到得到的稱之為"偽控制代碼"
只是一個標識,你可以發現,其實就是返回$FFFFFFFF,
每個進程得控制代碼都是一樣得,只是實用於進程內部得使用.
如果你想得到實際得控制代碼,在進程間進行通訊,必需要進行轉化,
調用DuplicateHandle,注意,得實控制代碼使用完成以後,你必須要調用CloseHandle去關閉.
其實,你應該明白了為何"偽控制代碼"得存在,就是使用簡單,不用關閉,
不會造成記憶體流失.
同樣道理,GetCurrentThread也是偽控制代碼,其值永遠是$FFFFFFFE,只是適用於線程內部得使用.
DuplicateHandle() :
在系統中,對象分兩類:核心對象和使用者物件.如進程對象,線程對象,檔案對應
對象等就是核心對象;而向視窗,菜單等都是使用者物件.
兩者是有差別的,用於標示使用者物件的控制代碼是系統唯一的,也就是說,一個進程
完全可以對另外一個進程中的使用者物件進行操作,比如兩個處理序間通訊的方法之一,
就是發送訊息.正是由於視窗是使用者物件,所以控制代碼是系統唯一,通過FindWindow(),
得到另外一個進程的視窗控制代碼,然後用SendMessage(),讓hWnd的視窗過程來處理消
息,實現了進程間的通訊.因此,對於使用者物件,你根本不用DuplicateHandle(),直接
把控制代碼拿來用就行了.
而核心對象則不一樣.核心對象是為了加強系統的穩定性,因此,核心物件控點是
進程相關的,在每一個進程中都有一個核心對象表,每一個對象的索引(不完全是)作為內和對象的控制代碼,從而實現進程相關.同一個對象在不同的進程中可能有不同的索引,即控制代碼.對核心對象進行操作時,系統還要進行安全檢驗,看一下你是否有權來操作這個對象.因此你不能同使用者物件一樣,直接把控制代碼拿過來用.比方說,你想操作另一個進程中的檔案對應物件,這個檔案對應物件控制代碼在那個進程中假設是0x000001,但在你的進程中,很有可能0x00000001時表示另一個核心對象,此時的操作就永遠不會成功,甚至會產生災難性的後果.此時,就有必要用DuplicateHandle().