delphi编写搜索进程函数的一个奇怪的现象(已解决)

来源:互联网 发布:智慧电梯软件 编辑:程序博客网 时间:2024/06/01 03:58

一个根据进程名得到PID的函数,原先是把进程名直接写在函数里面的

function FindProcessName:THandle;
    ………

     if ansiCompareText(ExtractFileName(lppe.szExefile),'notepad.exe') = 0 then

我把它改成带参数的函数,把进程名作为参数写在函数里了。

function FindProcessName(exeName:string):THandle;

……

     if ansiCompareText(ExtractFileName(lppe.szExefile),exeName) = 0 then

结果函数中的found永远是false,晕倒,百思不得其解

最后抱着试试看的想法,把参数exeName的类型改为pchar,结果成功了。郁闷啊,如果说是pchar和string类型有别,那也不能在还没有运行到if语句的时候就会有差别啊( 如果参数为string类型时, found := process32first(sshandle, lppe);这一句得到的结果就是false了,但参数是在下面的循环中才用到的啊)

可以正确运行的函数是,(本文为delphi7中测试的结果)

function FindProcessName(exeName:pchar):THandle;
var
  lppe: tprocessentry32;
  sshandle: thandle;
  found: boolean;
begin
  result:=0;
  sshandle := createtoolhelp32snapshot(TH32CS_SNAPALL, 0);
  found := process32first(sshandle, lppe);
  while found do
  begin
    if ansiCompareText(ExtractFileName(lppe.szExefile),exeName) = 0 then
    begin
       result:=lppe.th32ProcessID;
       break;
    end;
    found := process32next(sshandle, lppe); {检索下一个进程}
  end;
  CloseHandle(sshandle);
end; 

 

补记:下午再测试时却发觉又出了同样的问题,看来是修改的对象错误了,不关pchar的事。google了不少文章,发现有一篇文章提到:tprocessentry32的dwsize必须要初始化后process32first才可以使用,否则可能出错,于是加上了一句  lppe.dwSize:=sizeof(PROCESSENTRY32); 这次似乎是真的起作用了。现下使用正常。

原创粉丝点击