以下是我的代码:
var
I:integer;
Count:DWORD;
ProcHand:THandle;
ModHand:HModule;
ModName:array [0..MAX_PATH] of char;
ListItem: TListItem;
temp:integer;
begin
Refresh;
for I:=Low(FProcList) to High(FProcList) do
begin
ProcHand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false,FProcList[I]);
if ProcHand>0 then
EnumProcessModules(ProcHand,@ModHand,1,Count);
temp:=GetModuleBaseName(ProcHand,ModHand,ModName,Sizeof(ModName));
if I=2 then
if temp>0 then
showmessage('yes')
else
showmessage('no');
ListItem := ListView1.Items.Add;
ListItem.Caption :=StrPas(ModName);
ListItem.SubItems.Add(Inttostr(FprocList[I]));
ListItem.SubItems.Add(IntTostr(ProcHand));其中:Refresh是一个方法,获得进程ID,保存到FProcList中,FProcList是保存进程ID的动态数组,经证明是正确的
可是为什么,标示ModName是显示不出来,全部是'W!'这种怪吗,而其他的如果
FprocList[I],和ProcHand则可以正确显示。
请高手指点呀。
var
I:integer;
Count:DWORD;
ProcHand:THandle;
ModHand:HModule;
ModName:array [0..MAX_PATH] of char;
ListItem: TListItem;
temp:integer;
begin
Refresh;
for I:=Low(FProcList) to High(FProcList) do
begin
ProcHand:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
false,FProcList[I]);
if ProcHand>0 then
EnumProcessModules(ProcHand,@ModHand,1,Count);
temp:=GetModuleBaseName(ProcHand,ModHand,ModName,Sizeof(ModName));
if I=2 then
if temp>0 then
showmessage('yes')
else
showmessage('no');
ListItem := ListView1.Items.Add;
ListItem.Caption :=StrPas(ModName);
ListItem.SubItems.Add(Inttostr(FprocList[I]));
ListItem.SubItems.Add(IntTostr(ProcHand));其中:Refresh是一个方法,获得进程ID,保存到FProcList中,FProcList是保存进程ID的动态数组,经证明是正确的
可是为什么,标示ModName是显示不出来,全部是'W!'这种怪吗,而其他的如果
FprocList[I],和ProcHand则可以正确显示。
请高手指点呀。
这到到底是为什么呀
{ DWORD processIDs[0x3FFF] ; //进程ID
DWORD Count ;
int i ;
void* ProcHand; //进程的句柄
HMODULE ModHand; //模块的句柄
char ModName[MAX_PATH]; //模块文件名
//------------------------------------------ tvProcessTree->Items->Clear();//列举所有正在运行的进程
if (!EnumProcesses(processIDs, sizeof(processIDs), &Count))
MyMsgBox("列举进程出错,确认是否安装了PSAPI->DLL!","^^",0);
int count1=(int)Count/sizeof(DWORD);
for (i=0;i<count1;i++)
{
ProcHand = OpenProcess(PROCESS_QUERY_INFORMATION || PROCESS_VM_READ,False, processIDs[i]); //查询方式打开进程
if (ProcHand > 0)
try
//列举进程的首模块
{
if (EnumProcessModules(ProcHand, &ModHand, sizeof(ModHand), &Count))
//获取模块的文件名
if (GetModuleFileNameExA(ProcHand, ModHand, ModName,sizeof(ModName)) > 0)
{
CNewProcess *cp=new CNewProcess;
} }
__finally
{
CloseHandle(ProcHand);
}
}
}
或者论坛一下我的程序的问题啊,