Mehrfachinstanzen Programm verhindern

Antworten
wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Mehrfachinstanzen Programm verhindern

Beitrag von wolf_z »

Hallo allerseits

Gibt es unter Linux etwas ähnliches wie das Arbeiten mit Semaphoren, um eine gestartete Anwendung von einer anderen aus zu steuern, z.B. eine andere Datei aufrufen?

In Windows geht das ungefähr so:

Projektdatei (Danke an den unbekannten Autor, den ich mir nicht gemerkt haben):

Code: Alles auswählen

......
const
  MyGUID = '{166EBBD0-9052-49AA-9A27-AD15F3073563}';
 
var Semaphore: THandle;
 
// prevent multible instances of program (Semaphore)
procedure WriteStringToMMF(MMFName, Str: string);
var Map: Cardinal; Data: Pointer;
begin
  // create a MMF-object
  Map := CreateFileMapping(
    INVALID_HANDLE_VALUE,    // Keine Quelldatei
    nil,                     // Keine Sicherheitsattribute
    PAGE_READWRITE,          // Voller Zugriff
    0,                       // Minimalgröße
    Length(Str) + 4,         // Maximalgröße
    PChar(MMFName));         // Name des MMF-Objekts
  if (Map <> 0) then
  begin
    // map MMF-Object
    Data := MapViewOfFile(
      Map,                   // Handle des MMF-Objekts
      FILE_MAP_WRITE,        // Schreibzugriff
      0,                     // Kein Start-Offset
      0,                     // Kein Start-Offset
      0);                    // Gesamte Größe mappen
    if (Assigned(Data)) then
    begin
      // write string length to MMF
      PCardinal(Data)^ := Length(Str);
      // write string to MMF
      CopyMemory(Pointer(Cardinal(Data) + 4), Pointer(Str), Length(Str));
      // close mapping
      UnmapViewOfFile(Data);
    end;
  end;
end;
 
begin
 
ActivationMessage := RegisterWindowMessage(PChar(MyGUID));
  Semaphore := CreateSemaphore(nil, 1, 1, PChar(MyGUID));
  // test on an existing semaphore
  if (GetLastError = ERROR_ALREADY_EXISTS) then
  begin
    WriteStringToMMF(MyGUID + 'MMF', CmdLine);
    PostMessage(HWND_BROADCAST, ActivationMessage, 0, 0);
    Exit;
  end;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  MainForm.ServeCommandLineOfApplication(CmdLine);
  Application.Run;
  CloseHandle(Semaphore);
end;
Im Hauptformular der gestarteten Anwendung wird dann das Event abgefangen und verarbeitet und dann eine andere Datei oder ähnliches aufgerufen.

Code: Alles auswählen

procedure TMainForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var aCmdLine:string;
begin
  if (Msg.message = ActivationMessage) then
     begin
     aCmdLine := ReadStringFromMMF(MyGUID + 'MMF');
     if aCmdLine <> '' then
        ServeCommandLineOfApplication(aCmdLine);
     Handled := True;
     end;  
end;
Gibt es eine Alternative, die auch unter Linux funktioniert? Ziel ist es, Mehrfachinstanzen eines z.B. mit TProcess gestarteten Programms zu verhindern.

Benutzeravatar
theo
Beiträge: 10859
Registriert: Mo 11. Sep 2006, 19:01

Re: Mehrfachinstanzen Programm verhindern

Beitrag von theo »

http://wiki.lazarus.freepascal.org/UniqueInstance/de" onclick="window.open(this.href);return false;

wolf_z
Beiträge: 88
Registriert: Mo 31. Aug 2009, 09:31

Re: Mehrfachinstanzen Programm verhindern

Beitrag von wolf_z »

Die Implementierung ist ja einfacher als das googeln danach. Danke sehr für den Hinweis! Ist noch besser als das, was ich gesucht hatte. :lol:

Antworten