天天看點

WINDOWS核心程式設計之程序(二)

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/0 VarName2 = VarValue2/0 …………………………. /0 注意 例如 XYZ= Windows ABC=Windows 雖然XYZ與ABC有相同的值,但二者是不同的. XYZ =Home XYZ=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。   待續...............