天天看点

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。   待续...............