WINDOWS核心編程之進程(二)

來源:互聯網
上載者:User
1.進程的執行個體控制代碼載入到進程地址空間的每個可執行檔或DLL檔案均被產生一個唯一的執行個體控制代碼,就是hinstExe參數.有些這個參數的類型為HMODULE類型,注意:這兩個類型是完全相同的對象。原因在於16位的Windows中,HMODULE和HINSTANCE用於標識不同的東西。 當你在vc的環境裡的link裡category選ouput有個base ,這標識著可執行檔的映像載入到的基地址.vc連結程式使用的預設基地址是0x00400000,這是最低地址,如果指定應確保在0x00400000或大於這個地址。 要得到這個地址的值可以用HMODULE GetModuleHandle(PCTSTR pszModule)函數處理。pszModule就是可執行檔或dll檔案的名字,返回就是載入到進程的基地址。如果設定此參數為NULL, 返回的就是可執行檔的基地址了。注意:可執行檔映像的基地址與可執行檔的基地址的區別.GetModuleHandle函數的兩個重要特性1.如果調用進程不使用常用的對話方塊函數,那麼調用GetModuleHandle並為它傳遞:ComDlg32”後,就會返回NULL, 儘管ComDlg32.dll可能載入到了其它進程的地址空間.2.如果GetModuleHandle(NULL)在dll中調用,返回的也是可執行檔的基地址,而不是DLL檔案的基地址. 2.進程的命令列要獲得一個指向進程的完整命令列的指標,可以用GetCommandLine函數GetCommandLine();函數返回一個指向包含完整命令列的緩衝的指標,是個完整路徑名. 再介紹個函數CommandLineToArgv,它是將字串分割成它的各個標記,比如argc,其返回一個字串指標的數組PWSTR CommandLineToArgv(PWSTR pszCmdLine, int* pNumArgs);

pNumArgs是整數地址,設定為命令列中參數的數目.CommaneLineToArgv負責在內部分配記憶體,應用程式不釋放該記憶體,它是在進程運行終止時由os來釋放的,如果子自已來釋放,應用HeapFree函數 3.進程的環境變數每個進程都有一個與它相關的環境塊.環境塊是進程的地址空間中分配的一個記憶體塊.每個環境塊都包含一組字串.例如VarName1 = VarValue1/0VarName2 = VarValue2/0…………………………./0注意例如XYZ= WindowsABC=Windows雖然XYZ與ABC有相同的值,但二者是不同的.XYZ =HomeXYZ=Work也是不同的,中間的空格區別了它們Win98的環境變數寫在了autoexec.bat裡Win2000中環境變數的名在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/SessionManager/Environment裡值寫在了HKEY_CURRENT_USER/Environment只有擁有管理員的身份才可能對其進行修改。使用DWORD GetEnvironmentVariable(PCTSTR pszName, PTSTR pszValue, DWORD cchValue);可以確定某個環境變數是否存在以及它的值。第一個參數為名稱,第二個為存放變數值的緩衝, 第三個參數為緩衝的大小(用字元數來表示)。BOOL SetEnvironmentVariable(PCTSTR pszName, PCTSTR pszValue)修改與添加,刪除變數,如果不存在pszName這樣的變數就添加一個新的變數,如何存在就修改為pszValue。如果pszValue為NULL,就刪除此變數。 4.進程的親緣性進程中的線程可以在主要電腦中的任何一個CPU上執行。但是一個進程的線程可能被強制在可用CPU的子集上運行,這就叫進程的親緣性。 5.進程的錯誤模式UINT SetErrorMode(UINT fuErrorMode);表要加上CreateProcess裡有一個參數指定了這個,使子進程錯誤如何處理進程的當前磁碟機和目錄如果調用CreateFile開啟一個檔案(不設定路徑),那麼系統就在當前磁碟機和目錄中尋找該檔案。用DWORD GetCurrentDirectory(DWORD cchCurDir, PTSTR pszCurDIr)可以得到用BOOL SetCurrentDirectory(PCTSTR pszCurDir); 可以指定路徑。 6.進程的目前的目錄系統對進程的當前磁碟機與目錄保持跟蹤,但它不跟蹤每個磁碟機的目前的目錄。這種支援是通過進程的環境字串來提供的。例如進程有下面的兩個環境變數。=C:=C:/Utility/Bin=D:=D:/Program Files上面表示,磁碟機C的進程的目前的目錄是/Utility/Bin, D的是/Program Files;如果調用一個函數,傳遞一個磁碟機全名,但不是當前的磁碟機,那麼系統就查看進程的環境塊,找出與指定磁碟機名相關的變數。如果存在,系統將該變數的值用作當前磁碟機。如果不存在,系統將假設指定磁碟機的目前的目錄是它的根目錄。例如進程的目前的目錄是C:/Utility/Bin,但調用CreateFile開啟D:ReadMe.txt, 那麼系統查看環境變數=D.如果=D存在,系統就從D:/Program File目錄開啟該ReadMe.txt檔案。如果=D不存在,系統將從磁碟機D的根目錄來開啟ReadMe.txt。 待續...............

 

相關文章

聯繫我們

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