怎么知道进程已经结束?(50分)

  • 主题发起人 主题发起人 lunyx
  • 开始时间 开始时间
L

lunyx

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我的进程文件名是 rar.exe,该怎么判断它是否已经结束了?即那个rar.exe程序有没有正在运行?
请高手指点1,2啊
 
FindWindow查找窗口,可能还有其他的win api
 
我用
VarIsNull(FindWindow(nil,Pchar('rar'))) 不成功啊
 
CreateToolhelp32Snapshot
Process32First
Process32Next
可以枚举到正在运行的所有进程.
 
能不能具体点啊,你帮我把进程名列到一个memo中看看
 
该函数一直等到你运行的程序结束
function WinExecAndWait32(FileName:string;visibility:Integer):integer;
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
workDir:string;
startUpInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
i:DWord;
begin
StrPCopy(zAppName,FileName);
// GetDir(0,WorkDir);
// showmessage(workdir);
// StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,sizeof(StartUpInfo),#0);
StartupInfo.cb:=sizeOf(StartUpInfo);

StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW;
StartUpInfo.wShowWindow:=Visibility;

// winExec(zAppName,Visibility);

if not CreateProcess(nil,zAppName,nil,nil,false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,
nil,nil,StartupInfo,ProcessInfo ) then
Result:=-1
else begin
WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,i);
Result:=i;
end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
hsp, hsm: LongWord;
lppe: TProcessEntry32;
lpme: TModuleEntry32;
Re: Boolean;
begin
hsp := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
lppe.dwSize := SizeOf(TProcessEntry32);
lpme.dwSize := SizeOf(TModuleEntry32);
Re := Process32First(hsp, lppe);
while Re do begin
hsm := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, lppe.th32ProcessID);
Re := Module32First(hsm, lpme);
Memo1.Lines.Add(lpme.szExePath);
Re := Process32Next(hsp, lppe);
end;
CloseHandle(hsp);
end;
 
master880是正解
 
知道进程是否结束的方法太多了。
funciton findexe(exename:string):boolean;
var
lppe: TProcessEntry32;
found : boolean;
Hand : THandle;
str,tname:string;
begin
result:=false;
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
found := Process32First(Hand,lppe);
while found do
begin
str:=strpas(lppe.szExeFile);
tname:=ExtractFileName(str);//进程名字
if tname=exename then begin
result:=true;
break;
end;
found := Process32Next(Hand,lppe);
end;
end;
 
多人接受答案了。
 
后退
顶部