2017-02-03 56 views
-2

我想從我的delphi應用程序運行一個程序(exe)。我可以這樣做,但是我想在運行之前檢查程序是否已經運行。有沒有辦法做到這一點..在此先感謝。我們如何確定一個程序已經在delphi中運行了

+1

請參閱MSDN上的[枚舉所有進程](https://msdn.microsoft.com/en-us/library/windows/desktop/ms682623.aspx)。 –

+0

這是你的程序嗎? – MBo

+0

對於爲什麼沒有人投票結束重複,我感到有點困惑?這是一個非常普遍的問題... –

回答

2

以下函數檢查進程是否正在運行。將「TlHelp32」添加到uses子句中。

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 } 
+0

這就是我想要的。謝謝。 – Anushal

+1

這可能看起來像你想要的,但我懷疑它。使用此功能,您仍然可以根據時間多次啓動您的流程。你真正需要的是一個使用互斥體的解決方案。這就是說,這仍然是一個方便的功能。 –

+0

如果您在啓動過程之前調用此函數@Lieven,並且它返回true,那麼您將不會再次啓動該過程。時間與它有什麼關係?你是否假設程序的目標是檢測*本身*的前一個實例?沒有跡象表明這是目標。 –

相關問題