获取进程名不全!!!如何解决??

qqxkjin 2007-03-27 11:37:15
各位同行:
  我用以下代码来获取程序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;


...全文
449 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
flashtong 2007-04-07
  • 打赏
  • 举报
回复
我也遇到过这个问题,很是烦
快乐老猫 2007-04-07
  • 打赏
  • 举报
回复
看看我的程序截图吧。

http://p.blog.csdn.net/images/p_blog_csdn_net/%e5%bf%ab%e4%b9%90%e8%80%81%e7%8c%ab/279033/o_Snap1.jpg
快乐老猫 2007-04-07
  • 打赏
  • 举报
回复
我前一阵写了个程序,刚才测试了一下,的确有这个问题,WINDOWS的任务管理器也一样,说明CreateToolHelp32SnapShot这个函数有缺陷,也就是说,光利用进程快照,就会出现对长文件名、中文文件名出现获取错误现象。

不过这个问题可以解决,还是用CreateToolHelp32SnapShot函数,获取进程的模块快照,第一个模块就是主进程,这个名字是正确的。
ahjoe 2007-04-07
  • 打赏
  • 举报
回复
还没见过取不全的情况.
simb 2007-04-04
  • 打赏
  • 举报
回复
你的执行文件名过长的话是会导致运行后文件名被截去一段的情况,建议换个思路去思考.
susandy 2007-03-27
  • 打赏
  • 举报
回复
procedure tform1.J_GetProcessID;
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中调试通过楼主试试!
xiaocai800322 2007-03-27
  • 打赏
  • 举报
回复
关注

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧