我们如何确定程序已经在delphi中运行

我们如何确定程序已经在delphi中运行,delphi,Delphi,我想从我的delphi应用程序运行一个程序(exe)。我可以做,但我想在运行之前检查程序是否已经在运行。有没有办法做到这一点。。提前感谢。以下函数检查进程是否正在运行。在uses子句中添加“TlHelp32” function ProcessRunning (sExeName: String) : Boolean; { -> sExeName : Name of the EXE without path. Does not have to be the full EXE name. }

我想从我的delphi应用程序运行一个程序(exe)。我可以做,但我想在运行之前检查程序是否已经在运行。有没有办法做到这一点。。提前感谢。

以下函数检查进程是否正在运行。在uses子句中添加“TlHelp32”

function ProcessRunning (sExeName: String) : Boolean;
{ -> sExeName : Name of the EXE without path. Does not have to be the full EXE name. }

var
    hSnapShot : THandle;
    ProcessEntry32 : TProcessEntry32;

begin
    Result := false;

    hSnapShot := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS, 0);
    Win32Check (hSnapShot <> INVALID_HANDLE_VALUE);

    sExeName := LowerCase (sExeName);

    FillChar (ProcessEntry32, SizeOf (TProcessEntry32), #0);
    ProcessEntry32.dwSize := SizeOf (TProcessEntry32);

    if (Process32First (hSnapShot, ProcessEntry32)) then
        repeat
            if (Pos (sExeName,
                     LowerCase (ProcessEntry32.szExeFile)) = 1) then
            begin
                Result := true;
                Break;
            end; { if }
        until (Process32Next (hSnapShot, ProcessEntry32) = false);

    CloseHandle (hSnapShot);
end; { ProcessRunning }
函数ProcessRunning(sExeName:String):布尔值;
{->sExeName:没有路径的EXE名称。不必是完整的EXE名称。}
变量
hSnapShot:THandle;
ProcessEntry32:TProcessEntry32;
开始
结果:=假;
hSnapShot:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
Win32Check(hSnapShot无效\u句柄\u值);
sExeName:=小写(sExeName);
FillChar(ProcessEntry32,SizeOf(tprocescentry32),#0);
ProcessEntry32.dwSize:=SizeOf(tprocesentry32);
如果(Process32First(hSnapShot,ProcessEntry32))那么
重复
如果(位置(六位),
小写(ProcessEntry32.szexFile))=1)然后
开始
结果:=真;
打破
终止{if}
直到(Process32Next(hSnapShot,ProcessEntry32)=false);
闭合手柄(hSnapShot);
终止{ProcessRunning}

请参见MSDN。该程序是您的吗?我有点困惑,为什么没有人投票以重复方式关闭?这是一个非常常见的问题…请随意链接到副本,@Jerry。这就是我想要的。谢谢。这似乎是你想要的,但我怀疑。使用此选项,您仍然可以根据时间安排多次启动流程。您真正需要的是使用互斥锁的解决方案。也就是说,这仍然是一个方便的函数。如果在启动进程之前调用此函数@Lieven,并且它返回true,则不会再次启动进程。时间和它有什么关系?您是否假设程序的目标是检测自身的前一个实例?没有迹象表明这就是目标。奥拉夫,你能解释一下
Pos
通话的意义吗?是否存在
Pos
可能对此功能产生错误答案的输入?文件路径是否重要?@RobKennedy-使用此解决方案,您仍然可以启动多个进程实例。看看这个问题,在我看来,这正是OP想要避免的。如果我的解释是错误的,OP,可以纠正我的错误。