首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

书上有个地方看不懂,高手来解释一下解决思路

2012-03-09 
书上有个地方看不懂,高手来解释一下使用PSAPI获取进程信息,首先要调用EnumProcesses()函数,其声明如下:fun

书上有个地方看不懂,高手来解释一下
使用PSAPI获取进程信息,首先要调用EnumProcesses(     )函数,其声明如下:    
function     EnumProcesses(lpidProcess:LPDWORD;cb:DWORD;    
                                                                                              var     cbNeeded:DWORD)BOOL    
•     lpidProcess是一个指向DWORD数组的指针,由函数用进程ID填充。    
•     cb包含由lpidProcess指定的数组的元素数。    
•     cbNeeded返回拷贝到lpidProcess数组的实际字节数。用此值除以SizeOf(DWORD)将得到拷贝到    
数组的元素数,即正在运行的进程数。    
调用这个函数后,     lpidProcess指定的数组将包含一些进程的ID。进程ID在自身进程中无用,但可    
以传递给OpenProcess()     API函数以获取进程的句柄。一旦拥有一个进程句柄,就可以调用针对进程句    
柄的其他PSAPI函数,甚至其他Win32     API函数。    
 
procedure     TWinNTInfo.Refresh;    
var    
          Count:DWORD;    
          BigArray[0..$3fff-1]     of     DWORD;    
begin    
//获取进程ID数组    
      if     not     EnumProcesses(@BigArray,SizeOf(BigArray),Count)    
      then     raise     Exception.Create(SFailMessage);    
      SetLength(FProList,Count     div     SizeOf(DWORD));    
      Move(BigArray,FProList[0],Count);    
end;    
 
 
  这是书上说的,有点看不懂,EnumProcesses(@BigArray,SizeOf(BigArray),Count)中    
SizeOf(BigArray)应该返回的是字节数,但函数的定义要求接受数组的元素数,BigArray定义的是DWORD数组,如果按照上面这样传递参数是不是就出现了问题?除非DWORD是单字节的,但这是不可能的,DWORD是32位的,应该占4字节。    


[解决办法]
cb包含由lpidProcess指定的数组的元素数。
如果真的如这样说的话,那应该是要Length(BigArray);才对!

热点排行