书上有个地方看不懂,高手来解释一下
使用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);才对!