2009-05-18 5 views
13

इस सवाल की तरह, लेकिन डेल्फी में:डेल्फी का उपयोग करके कोई प्रक्रिया चल रही है या नहीं?

How do I find out if a process is already running using c#?

मैं एक अपडेटर कार्यक्रम है, मैं इसे प्रोग्राम को इसके बारे में अद्यतन करने के लिए वर्तमान में नहीं चल रहा है, खासकर यह सभी उपयोगकर्ताओं की जाँच करेगा, नहीं जाँच करना चाहते हैं बस वर्तमान उपयोगकर्ता।

उत्तर

34

से: http://www.delphitricks.com/source-code/windows/check_if_a_process_is_running.html

uses TlHelp32; 

    function processExists(exeFileName: string): Boolean; 
var 
    ContinueLoop: BOOL; 
    FSnapshotHandle: THandle; 
    FProcessEntry32: TProcessEntry32; 
begin 
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
    Result := False; 
    while Integer(ContinueLoop) <> 0 do 
    begin 
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = 
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = 
     UpperCase(ExeFileName))) then 
    begin 
     Result := True; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
    end; 
    CloseHandle(FSnapshotHandle); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if processExists('notepad.exe') then 
    ShowMessage('process is running') 
    else 
    ShowMessage('process not running'); 
end; 
4

आप स्वत: अपडेट कोड का एक सा लिख ​​रहे हैं, आप भी अपने आवेदन करने के लिए किसी प्रकार का कनेक्शन बनाने और खुद को बंद करने के लिए यह बताने पर विचार कर सकता है।

यह उदाहरण सकता है अपने आवेदन की मुख्य विंडो में एक संदेश पोस्ट करने में शामिल होना शामिल है जो इसे बंद करने के लिए कह रहा है। या एक आईपीसी पाइप आदि खोलना

1

मैं इन इकाइयों को मुख्य इकाई का प्रारंभिक भाग टाइप कर रहा हूं।

initialization 
mHandle := CreateMutex(nil, True, 'myApp.ts'); 
if GetLastError = ERROR_ALREADY_EXISTS then 
begin 
    MessageDlg('Program already running!', mtError, [mbOK], 0); 
    Halt; 
end; 
1
uses TlHelp32, PsAPI; 

function ProcessExists(anExeFileName: string): Boolean; 
var 
    ContinueLoop: BOOL; 
    FSnapshotHandle: THandle; 
    FProcessEntry32: TProcessEntry32; 
    fullPath: string; 
    myHandle: THandle; 
    myPID: DWORD; 
begin 
    // wsyma 2016-04-20 Erkennung, ob ein Prozess in einem bestimmten Pfad schon gestartet wurde. 
    // Detection wether a process in a certain path is allready started. 
    // http://stackoverflow.com/questions/876224/how-to-check-if-a-process-is-running-using-delphi 
    // http://swissdelphicenter.ch/en/showcode.php?id=2010 
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    FProcessEntry32.dwSize := SizeOf(FProcessEntry32); 
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); 
    Result := False; 
    while Integer(ContinueLoop) <> 0 do 
    begin 
    if UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExtractFileName(anExeFileName)) then 
    begin 
     myPID := FProcessEntry32.th32ProcessID; 
     myHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, myPID); 
     if myHandle <> 0 then 
     try 
     SetLength(fullPath, MAX_PATH); 
     if GetModuleFileNameEx(myHandle, 0, PChar(fullPath), MAX_PATH) > 0 then 
     begin 
      SetLength(fullPath, StrLen(PChar(fullPath))); 
      if UpperCase(fullPath) = UpperCase(anExeFileName) then 
      Result := True; 
     end else 
      fullPath := ''; 
     finally 
     CloseHandle(myHandle); 
     end; 
     if Result then 
     Break; 
    end; 
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); 
    end; 
    CloseHandle(FSnapshotHandle); 
end; 
2

आप आवेदन पर नियंत्रण है (के रूप में अपने प्रश्न से संबंध नहीं हैं), यह करने के लिए एक अच्छा तरीका एक नाम की फ़ाइल मानचित्रण वस्तु जल्दी बनाने के लिए प्रक्रिया शुरू होता है। यह रेडलेन से एक म्यूटक्स बनाने के सुझाव के समान है।

// Add this into the application you wish to update 
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READONLY, 0, 32, 'MAIN-PROGRAM'); 
// Note: Mapping object is destroyed when your application exits 

// Add this into your updater application  
var 
    hMapping: HWND; 
begin 
    hMapping := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READONLY, 0, 32, 'MAIN-PROGRAM'); 
    if (hMapping <> 0) then 
     begin 
     if (GetLastError() = ERROR_ALREADY_EXISTS) then 
      ShowMessage('Application to update is already running!'); 
     end; 

अधिक जानकारी के लिए MSDN documentation on CreateFileMapping देखें।

this question पर स्वीकृत उत्तर भी देखें जो ल्यूक के उत्तर को कवर करता है और अतिरिक्त समाधान प्रदान करता है।

संबंधित मुद्दे