久仰此書大名已久,可惜以前沒看懂。。。現在感覺有點基礎了回頭再看,感覺多少有點死皮賴臉的嫌疑。。。。
關於啥是核心對象請看第三章就對了,看的時候發現書上說
GetCurrentProcess返回的是偽控制代碼(對GetCurrentDirectory比較熟悉,吃過一次虧,進程工作目錄跟進程的鏡像檔案EXE所在的路徑完全不是一回事,尤其設定了程式開機自啟動,重啟後預設的進程工作目錄是系統目錄,所以特別提示一下,應該用GetModuleFileName。。。),親自測試了一下,事實如此,每次得到的handle都是0xfffffff,是專門為本進程提供的,我們知道核心對象跟使用者物件或者GDI對象有個很大的區別在於:核心對象是跟進程密切相關的,比如說有一個視窗屬於其他進程的,只要得到這個視窗的控制代碼,我們就可以對這個視窗操作(此視窗有別於核心對象,正因如此才能如此方便的操作),但是如果某個對象是其他進程的核心對象,你在本地進程中得到該核心對象的控制代碼,然後對其操作,就是錯誤的,原因就是核心對象跟進程密切相關,而其他對象則例外。當然微軟這麼做目的也是很明顯的,這樣可以提供作業系統的健壯性,確實。
當然,如果只在本進程實現操作,用GetCurrentProcess得到的偽控制代碼已經足夠了,假如實現進程之間通訊呢?這個時候假的控制代碼就滿足不了要求了,書上說了一個函數DuplicateHandle,這個可以勝任,他可以把假的控制代碼轉換成真的。
正是書上沒執行個體代碼,所以剛開始看的時候有點迷茫,開始始終沒看明白如何能轉換,於是我把這章看了3遍。。。。。
測試:
#include<windows.h><br />#include<stdio.h><br />void main()<br />{<br />HANDLE hProcess=GetCurrentProcess();<br />HANDLE hTargetHandle;<br />DuplicateHandle(hProcess,hProcess,hProcess,&hTargetHandle,0,FALSE,DUPLICATE_SAME_ACCESS);<br />printf("%x/n",hTargetHandle);<br /> CloseHandle(hTargetHandle);<br />system("pause");</p><p>}
偽控制代碼是不要關閉的,但是MSDN說了:
The pseudo handle need not be closed when it is no longer needed. Calling the CloseHandle function with a pseudo handle has no effect. If the pseudo handle is duplicated by DuplicateHandle, the duplicate handle must be closed.
因此上述例子中還得加上
CloseHandle(hTargetHandle);
這個應該就是了吧。如果不是,歡迎扔磚頭。
其實這樣的方法用DuplicateHandle,感覺有點摧殘這個API,其實這個函數功能很強大的,字母意思,複製控制代碼,我們可以把一個核心對象的控制代碼(比如一個檔案核心對象CreateFile("蒼井空全集")調用的產物)複製到XP上的SYSTEM 進程上,這個進程的ID是4或者8,XP上貌似都是4吧,這樣我們就很低調的實現了一種效果:此檔案現在不能被移動,修改,重新命名,刪除等等一系列操作了,反倒是保護了這些檔案的安全,當然了前提得有一定的許可權。
路漫漫其修遠兮。。。。。。磚頭無止境。