各位同行:
我用以下代码来获取程序AFilename在系统中的进程ID值。但是我发现文件名短的如 crss.exe就可以找到其ID号,但长一点的如我的程序名是testclientpc_dll.exe 却找不到其ID号,通过调试发现原来在进程列表中只能显示出 testclientpc_dl,这样通过比较当然不会找到了。
如何在进程列表中显示出完整的程序名称????
不知道各位是如何解决这个问题的。代码如下:{ 列举进程 }
//AFilename: 要获取进程ID的软件名。
//PathMatch: 匹配方式;False:只是文件名; True:文件的绝对名称(绝对路径+文件名)
//ProcessID: 进程ID返回值。
procedure J_GetProcessID(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
ss:string;
begin ProcessID :=0;
{ 创建系统快照 }
SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
try
{ 取得快照中的第一个进程 }
{ 一定要设置结构的大小,否则将返回False }
lppe.dwSize := sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin
ss:= lppe.szExefile; //!!!问题就出在这里:AFilename是testclientpc_dll.exe;但lppe.szExefile=testclientpc_dl !!! { 进行匹配 }
if PathMatch then
FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0; if FoundOK then
begin
ProcessID := lppe.th32ProcessID;
break;
end; { 未找到,继续下一个进程 }
FoundAProc := Process32Next(SsHandle, lppe);
application.ProcessMessages;//
end;
finally
CloseHandle(SsHandle);
end;
end;
我用以下代码来获取程序AFilename在系统中的进程ID值。但是我发现文件名短的如 crss.exe就可以找到其ID号,但长一点的如我的程序名是testclientpc_dll.exe 却找不到其ID号,通过调试发现原来在进程列表中只能显示出 testclientpc_dl,这样通过比较当然不会找到了。
如何在进程列表中显示出完整的程序名称????
不知道各位是如何解决这个问题的。代码如下:{ 列举进程 }
//AFilename: 要获取进程ID的软件名。
//PathMatch: 匹配方式;False:只是文件名; True:文件的绝对名称(绝对路径+文件名)
//ProcessID: 进程ID返回值。
procedure J_GetProcessID(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
ss:string;
begin ProcessID :=0;
{ 创建系统快照 }
SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
try
{ 取得快照中的第一个进程 }
{ 一定要设置结构的大小,否则将返回False }
lppe.dwSize := sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin
ss:= lppe.szExefile; //!!!问题就出在这里:AFilename是testclientpc_dll.exe;但lppe.szExefile=testclientpc_dl !!! { 进行匹配 }
if PathMatch then
FoundOK := AnsiStricomp(lppe.szExefile, PChar(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(lppe.szExefile)), PChar(ExtractFilename(AFilename))) = 0; if FoundOK then
begin
ProcessID := lppe.th32ProcessID;
break;
end; { 未找到,继续下一个进程 }
FoundAProc := Process32Next(SsHandle, lppe);
application.ProcessMessages;//
end;
finally
CloseHandle(SsHandle);
end;
end;
var
lppe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
ss:pchar;//注意pchar型
begin
{ 创建系统快照 }
SsHandle := CreateToolHelp32SnapShot(TH32CS_SnapProcess, 0);
try
{ 取得快照中的第一个进程 }
{ 一定要设置结构的大小,否则将返回False }
lppe.dwSize := sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle, lppe);
while FoundAProc do
begin
ss:= lppe.szExefile; //!!!问题就出在这里:AFilename是testclientpc_dll.exe;但lppe.szExefile=testclientpc_dl !!!
memo1.Lines.Add(strpas(ss));
FoundAProc := Process32Next(SsHandle, lppe);
application.ProcessMessages;//
end;
finally
CloseHandle(SsHandle);
end;
end;
代码在DELPHI6中调试通过楼主试试!