Autor Beitrag
s-hus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 13.12.07 14:09 
Hallo ihr!
Ich habe schon lange gesucht, jedoch nichts gescheites gefunden.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function TFmMain.OnlyOneInstance(ProgrammPfad: String): Boolean;
begin
  Result := False;
  //ExpandFileName(ProgrammPfad);
  if not FileExists(ProgrammPfad) then
  begin
    Exit;
  end;
  hFile := CreateFile(pchar(ProgrammPfad), GENERIC_READ or
                      GENERIC_WRITE or GENERIC_EXECUTE, 0nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile = INVALID_HANDLE_VALUE then
  begin
    Result := True;
  end;
  if not Result then
  begin
    CloseHandle(hFile);
  end;
end;

So sieht meine Funktion aus... wenn das Programm jedoch bereits offen ist, gibt er mir die INVALID_HANDLE_VALUE Nummer (4294967295) zurück. Nun besteht mein Problem darin, dass ich dann das Programm nicht wieder aufrufen kann. Ich schaffe es zwar abzufangen, dass er hFile nicht überschreibt, wenn es diese INVALID_HANDLE_VALUE ist, jedoch suche ich nun noch eine Möglichkeit das Handle des Programms herauszufinden und es in HFile hineinzuschreiben.
Ich hoffe ich konnte euch genug Infos geben, ansonsten fragt nach. Ich kann soetwas immer sehr schlecht erklären ;)

Gibt es eine Möglichkeit, den Handle von schon laufenden Programmen herauszufinden?
bzw. ist es möglich eine Liste zu erstellen mit Hilfe von einer Variablen, in der handle und zugehöriges Programm abgespeichert werden können, sodass man es, falls INVALID_HANDLE_VALUE = True ist abrufen kann?

Mit freundlichen Grüßen
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.12.07 15:13 
Was um Gottes Willen, willst du erreichen? Du versuchst eine Datei zu öffnen und wenn das fehlschlägt weißt du wass? Der Name der Methode oist auch eher verwirrend? Willst du gucken, ob schon eine Instanz deines Programmes existiert oder was?
s-hus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 13.12.07 15:27 
1. jedes Programm soll nur einmal geöffnet werden können (ich habe ein programm, aus dem ich .exe files aufrufen kann und auch andere files)
2. falls das Programm schon existiert, soll es in den vordergrund gebracht werden, um dem benutzer zu zeigen "hey, ich laufe schon".

OnlyOneInstance prüft, ob schon eine Instanz vorhanden ist, deswegen "onlyone" ...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.12.07 15:46 
Das macht man aber mit einem Suche in: Delphi-Forum, Delphi-Library MUTEX.
s-hus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 13.12.07 15:51 
der mutex hat mir aber z.b. nicht gesagt, wenn das Programm schon geöffnet war, bevor ich mein Delphi Programm gestartet hatte. Das wurde dann trotzdem doppelt geöffnet und das möchte ich ja nicht.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.12.07 16:13 
user profile icons-hus hat folgendes geschrieben:
der mutex hat mir aber z.b. nicht gesagt, wenn das Programm schon geöffnet war, bevor ich mein Delphi Programm gestartet hatte. Das wurde dann trotzdem doppelt geöffnet und das möchte ich ja nicht.

Ja und wer oder was führt deinen Code aus, um zu überprüfen, ob schon eine Instanz existiert? Um den Code auszuführen muss nun mal erst der Prozess gestartet werden. Aber was hindert dich daran das Programm zu beenden, wenn schon eine Instanz existiert?
s-hus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Do 13.12.07 16:23 
Das Programm soll helfen, wenn das Programm schon geöffnet ist, dass es nur aufgerufen wird und nicht geschlossen wird um es dann neuzustarten. Wenn man dort schon drin gearbeitet hat und die Änderungen nur noch nicht gespeichert hat und meinetwegen ein paar Stunden später an den Rechner geht und über das Delphi Programm die Instanz nochmal öffnen will, sind die Sachen futsch...
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 13.12.07 17:07 
Den verdrehten Satz habe ich jetzt nicht verstanden.
s-hus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17



BeitragVerfasst: Di 18.12.07 09:00 
Mein programmiertes Programm soll helfen, wenn ein anderes Programm, welches über dieses aufgerufen wird, bereits geöffnet ist, dass das bereits geöffnete Programm in den Vordergrund gerufen wird und nicht geschlossen wird, um es aufzurufen.
So deutlicher, oder war das der falsche Satz? Ich kann mich bei programmiertechnischen Sachen unheimlich schlecht artikulieren, sorry.