AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Prüfen ob eine EXE schon läuft oder nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Prüfen ob eine EXE schon läuft oder nicht

Ein Thema von Daniel B · begonnen am 5. Jul 2003 · letzter Beitrag vom 5. Jul 2003
Antwort Antwort
Daniel B
(Gast)

n/a Beiträge
 
#1

Prüfen ob eine EXE schon läuft oder nicht

  Alt 5. Jul 2003, 11:20
Hallo,

hiermit kann man prüfen ob eine EXE läuft oder auch nicht, in der Button1Click-Prozedur den Namen der EXE angeben. Natürlich könnte man dies auch noch mit einem OpenDialog verbinden, aber das könnt Ihr selber machen.
uses ..., TlHelp32, PsAPI;
Delphi-Quellcode:
procedure CreateWin9xProcessList(List: TStringList);
var
  hSnapShot: THandle;
  ProcInfo: TProcessEntry32;
begin
  if List = nil then
    Exit;
  hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapShot <> THandle(-1)) then
  begin
    ProcInfo.dwSize := SizeOf(ProcInfo);
    if (Process32First(hSnapshot, ProcInfo)) then
    begin
      List.Add(ProcInfo.szExeFile);
     while (Process32Next(hSnapShot, ProcInfo)) do
       List.Add(ProcInfo.szExeFile);
    end;
    CloseHandle(hSnapShot);
  end;
end;

procedure CreateWinNTProcessList(List: TStringList);
var
  PIDArray: Array[0..1023] of DWORD;
  cb: DWORD;
  i: integer;
  ProcCount: integer;
  hMod : HMODULE;
  hProcess: THandle;
  ModuleName: Array[0..300] of Char;
begin
  if List = nil then
    Exit;
  EnumProcesses(@PIDArray, sizeof(PIDArray), cb);
  ProcCount := cb div SizeOf(DWORD);
  for i := 0 to ProcCount -1 do
  begin
    hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or
      PROCESS_VM_READ, False, PIDArray[I]);
    if (hProcess <> 0) then
    begin
      EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);
      GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));
      List.Add(ModuleName);
      CloseHandle(hProcess);
    end;
  end;
end;

procedure GetProcessList(var List: TStringList);
var
  ovi: TOSVersionInfo;
begin
  if List = nil then
    Exit;
  ovi.dwOSVersionInfoSize := sizeof(TOSVersionInfo);
  GetVersionEx(ovi);
  case ovi.dwPlatformId of
    VER_PLATFORM_WIN32_WINDOWS : CreateWin9xProcessList(List) ;
    VER_PLATFORM_WIN32_NT : CreateWinNTProcessList(List) ;
  end
end;

function IsEXERunning(sFileName: String; bFullpath: Boolean): Boolean;
var
  i: Integer;
  MyProcList: TStringList;
begin
  MyProcList := TStringList.Create;
  try
    GetProcessList(MyProcList) ;
    Result := False;
    if MyProcList = nil then
      Exit;
    for i := 0 to MyProcList.Count -1 do
    begin
      if not bFullpath then
      begin
        if CompareText(ExtractFileName(MyProcList.Strings[i]), sFileName) = 0 then
          Result := True
        end else
        if CompareText(MyProcList.Strings[i], sFileName) = 0 then
          Result := True;
        if Result then
          Break;
    end;
  finally
    FreeAndNil(MyProcList);
  end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsEXERunning('delphi32.exe', False) then
    ShowMessage('Läuft schon... *bääh*')
 else
    ShowMessage('Läuft nicht... :-)');
end;
Grüsse, Daniel
  Mit Zitat antworten Zitat
Gast
(Gast)

n/a Beiträge
 
#2
  Alt 5. Jul 2003, 11:26
PSAPI ist keine Standardbibliothek. Sie ist erst bei neueren NT-Varianten standardmäßig dabei. Das nur als Ergänzung.
Sie war aber zumindest für die älteren Versionen eine von jenen DLLs, die man frei weitergeben durfte.

BTW: Es macht wenig Sinn nur den Dateinamen zu vergleichen (es sollte der komplette Pfad sein, denn nur der ist eindeutig). Und ich würde empfehlen ab Windows 2000 (siehe Versionsüberprüfung) lieber Toolhelp zu nehmen. Toolhelp existierte nur BIS Windows 2000 nicht. Seit Windows 2000 ist es vorhanden (und benutzt intern die Native API).
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#3
  Alt 5. Jul 2003, 11:35
Um an den kompletten Pfad zu kommen, musst du den Umweg über Module32First gehen. Such mal hier in der Code-Library danach, da müsstest du ein Beispiel dazu finden.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz