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。
 
待续...............
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值