一个根据进程名得到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); 这次似乎是真的起作用了。现下使用正常。