Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Nur 1 Instanz des Programmes (https://www.delphipraxis.net/85526-nur-1-instanz-des-programmes.html)

blackdrake 1. Feb 2007 08:25


Nur 1 Instanz des Programmes
 
Hallo.

Ich möchte folgendes Realisieren:

Wenn ich mein Programm starte (über eine Dateierweiterung) und es ist bereits eine Instanz des Programmes offen, dann soll sich die Datei in dieser Instanz öffnen.

Ist das Programm gerade beschäftigt (Abfrage könnte in der Instanz erfolgen), dann soll sich ein neues Fenster öffnen.

Weiß jemand, wie ich so etwas realisieren kann?

Gruß
blackdrake

yörsch 1. Feb 2007 08:29

Re: Nur 1 Instanz des Programmes
 
HAI :hi:

Mutex
ist das was du suchst ... :coder:

Delphi-Quellcode:
unit Haupt_Form;
interface
uses
  Windows,....
type
  THauptForm = class(TForm)
...
  end;
var
  HauptForm: THauptForm;
implementation
...
initialization
  // prüfen ob Programm schon läuft
  mHandle := CreateMutex(nil, True, 'XYZ');
  // Anwendung läuft bereits
  if GetLastError = ERROR_ALREADY_EXISTS then
    begin
      ShowMessage(' NewGen-Programm läuft bereits ! ');
      Halt(haltALREADY_RUNS);
    end;
finalization
  // ... und Schluß
  if mHandle <> 0
    then CloseHandle(mHandle)
end.
:feuerchen:

Mazel 1. Feb 2007 08:37

Re: Nur 1 Instanz des Programmes
 
...oder nach Semaphor, siehe dazu dieses Beispiel (Der Part um die Instanz zu checken):
Delphi-Quellcode:
procedure InstanceCheck;
var
 Sem: THandle;

begin
 Sem := CreateSemaphore(nil, 0, 1, 'Programtitle');
 If ((Sem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then
 begin
  CloseHandle(Sem);
  Application.MessageBox('Program wird bereits ausgeführt!', 'Wird ausgeführt', 16);
  Application.Terminate;
 end;
end;
Gruß
Mazel

thkerkmann 1. Feb 2007 09:12

Re: Nur 1 Instanz des Programmes
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,

ich verwende diese Unit. Anleitung innenliegend. Damit kannst Du dann auch noch die laufende Instanz benachrichtigen und sogar die Parameter rüberreichen.

Gruss

Jürgen Thomas 1. Feb 2007 10:15

Re: Nur 1 Instanz des Programmes
 
Hallo,

diese Diskussionen gab es schon häufig. Verschiedene Hier im Forum suchenSuchen nach "Programm einmal starten Run" liefern unter anderem Das Programm einmal Starten. Beispiel mit mehreren Erläuterungen und Verfahren.

Gruß Jürgen

PS. Die Suchfunktion liefert unübersichtliche Ergebnisse. Bei Hier im Forum suchenProgramm einmal starten bekomme ich das Ergebnis nicht. Warum nicht?

blackdrake 1. Feb 2007 10:49

Re: Nur 1 Instanz des Programmes
 
Hallo.

Zitat:

Zitat von thkerkmann
Hi,

ich verwende diese Unit. Anleitung innenliegend. Damit kannst Du dann auch noch die laufende Instanz benachrichtigen und sogar die Parameter rüberreichen.

Gruss

Vielen Dank für den Hinweis. Ich werde die Unit später gleich mal ausprobieren! :)

Mutex, wie es auch in den anderen Themen erklärt wurde, kannte ich bereits, aber der Schwerpunkt des von mir geschilderten Problemes lag ja bei der Nachrichtenübermittlung und nicht bei dem Blocken einer zweiten Instanz.

Gruß
blackdrake

Olli 1. Feb 2007 10:51

Re: Nur 1 Instanz des Programmes
 
http://assarbad.net/de/stuff/!import/nico.old/ -> oneinst.zip! Uralt und noch immer gut zur Veranschaulichung.

Skullschildi 8. Feb 2007 12:47

Re: Nur 1 Instanz des Programmes
 
@ Olli: ich hab mir mal die oneisnt runtergeladen, aber ganz durchsteigen tu ich da nicht. bei mir öffnet sich zwar eine instanz, abr die seh ich nicht und wenn ich dann mehrmals die exe ausführe seh ich die anderen auch nicht, sie werden aber als prozesse angezeigt. demzufolge sin mehrere instanzen dieser anwendung da. könntest vll die oneinst.pas so verändern, dass zu jedem befehl genau dabeisteht was der macht? das wäre äußerst nett von dir.

blackdrake 8. Feb 2007 12:57

Re: Nur 1 Instanz des Programmes
 
Hallo.

Das ist merkwürdig.

Normalerweise müsste, sofern eine Mutex mit gleichem Namen vorhanden ist, die Nachricht WM_COPY an deine Erstinstanz geschickt werden und anschließend deine Zweitinstanz (die du nicht siehst, weil OneInst.pas zwischen noch vor Application.Run, also vor MainForm.Show ausgeführt wird) per Halt() beendet werden. Schau mal mit dem Debugger, wie sich das Programm verhält, wenn bereits eine Instanz offen ist.

Gruß
blackdrake

Skullschildi 8. Feb 2007 13:52

Re: Nur 1 Instanz des Programmes
 
Also ich hab meinen rechner neu gestartet, die project1.exe ausgeführt. Die seh ich auch, dann hab ich ne verknüpfung zur projekt1.exe erstellt und in dieser parameter angegeben. die Projekt1.exen werden gestartet, übergeben aber NICHT ihre parameter an die bereits laufende, sichtbare instanz ihrer selbst. Sie sindselbst nicht zu sehen, werden aber als prozess im Taskmanager angezeigt. wenn ich nun alle 5 projekt1 prozesse im tskmgr beende und die Projekt1.exe wieder starte, dann kann ich die nicht sehen, sie läuft aber.

blackdrake 8. Feb 2007 14:17

Re: Nur 1 Instanz des Programmes
 
Welches Betriebssystem nutzt du? Bei XP und TurboDelphi geht alles. Starte deine Projekt1.exe und anschließend startest du über Delphi die Anwendung ein zweites Mal und gehst dabei per Debugger alle Einzelschritte durch (F7). Die Anwendung sollte bei Halt() ankommen, in deinem Fall jedoch offensichtlich wo anders.

Skullschildi 9. Feb 2007 13:10

Re: Nur 1 Instanz des Programmes
 
Ich hab mir des päckchen nochma runtergeladen. Ich kann Project1.exe öffnen, sehs, kanns schliessen und wieder öffnen und sehen, also das geht. wenn aber eins offen ist und ich ein zweites starte kommt 5000ms lang eine warteuhr , aber mein bestehendes project1 fenster bleibt unverändert. in meim tskmgr unter prozesse ist Project1 nun zweimal aufgeführt. ich denkma, dass diesich mit unterschiedlichen IDs bei windows anmelden. aber warum?

nutzen tu ich XP und delphi 7 enterprise

Skullschildi 11. Feb 2007 10:04

Re: Nur 1 Instanz des Programmes
 
Hats euch die sprache verschlagen?
ich versteh des problem von dem progg net, immerhin scheint es ja zu wissen, dass es schoneinmal besteht, sonst würde sihc das zweite auch zeigen. Andererseits schliesst sich instanz 2 nicht, was irgendwie ziemlich verwirrend is. und der code von dem oneinst is mir sowieso schleierhaft :cry:

turboPASCAL 11. Feb 2007 10:23

Re: Nur 1 Instanz des Programmes
 
Zitat:

Zitat von Skullschildi
Hats euch die sprache verschlagen?
ich versteh des problem von dem progg net, immerhin scheint es ja zu wissen, dass es schoneinmal besteht, sonst würde sihc das zweite auch zeigen. Andererseits schliesst sich instanz 2 nicht, was irgendwie ziemlich verwirrend is. und der code von dem oneinst is mir sowieso schleierhaft :cry:

:gruebel:

Möglicherweise liegt es daran das unsereiner seinen Sourcecode nicht kennt und es wird ein buntes
Raten veranstalted.

Skullschildi 11. Feb 2007 13:30

Re: Nur 1 Instanz des Programmes
 
http://assarbad.net/de/stuff/!import/nico.old/

der link taucht oben schonmal auf. da hab ich des gezunsel her.

blackdrake 11. Feb 2007 13:59

Re: Nur 1 Instanz des Programmes
 
Und ich schrieb zwei mal, du sollest den Debugger für die Zweitinstanz benutzen, um herauszufinden, wo du landest, sonst können wir nicht helfen.

Delphi-Quellcode:
// Mutex erstellen...

// Mutex-Rückgabewert:

  case GetLastError of
    0:
      begin
        { Wir haben den Mutex angelegt; sind also die erste Instanz. }
        // Debug
        showmessage('Hier passiert gar nichts, es ist die Erstinstanz, das Programm wird sichtbar');
      end;
    ERROR_ALREADY_EXISTS:
      begin
        { Es gibt also schon eine Instanz - beginnen wir mit dem Prozedere. }
        // Debug
        showmessage('Es gibt bereits eine Instanz, Befehle werden übergeben');
        try
          HandleSecondInstance;
        finally
          { was auch immer passiert, alles endet hier ;o) }
          { Die 183 ist nicht ganz zufällig, kleiner Spaß }
          Halt(10);
        end;
      end;
  else
    { Keine Ahnung warum wir hier landen sollten,       }
    { außer Microsoft hat wiedermal die Regeln geändert. }
    { Wie auch immer - wir lassen das Programm starten. }
    // Debug
    showmessage('Ausnahmefehler');
  end;

anse 23. Jan 2010 08:07

Re: Nur 1 Instanz des Programmes
 
Dieser Code aus der OneInst.pas von Oliver kompiliert nicht unter Delphi 2010 - Compiler error "inkompatible Typen":

Delphi-Quellcode:
{ kleine Hilfsfunktion die uns die Kommandozeilenparameter entpackt }
function ParamBlobToStr(lpData: PChar): string;
var
  pStr: PChar;
begin
  Result := '';
  pStr := lpData;
  while pStr[0] <> #0 do
  begin
    Result := Result + string(pStr) + #13#10;
    pStr := @pStr[lstrlen(pStr) + 1]; <<< "E2008 - incompatible types"
  end;
end;

{ kleine Hilfsfunktion die uns die Kommandozeilenparameter einpackt }
function ParamStrToBlob(out cbData: DWORD): PChar;
var
  Loop: Integer;
  pStr: PChar;
begin
  cbData := Length(ParamStr(1)) + 3; { gleich inklusive #0#0 }
  for Loop := 2 to ParamCount do
    cbData := cbData + DWORD(Length(ParamStr(Loop)) + 1);
  Result := GetMemory(cbData);
  ZeroMemory(Result, cbData);
  pStr := Result;
  for Loop := 1 to ParamCount do
  begin
    lstrcpy(pStr, PChar(ParamStr(Loop)));
    pStr := @pStr[lstrlen(pStr) + 1]; <<< "E2008 - incompatible types"
  end;
end;
Ich versteh nur nicht warum, sieht doch alles wunderbar aus oder?

Uwe Raabe 23. Jan 2010 10:04

Re: Nur 1 Instanz des Programmes
 
Zitat:

Zitat von anse
Dieser Code aus der OneInst.pas von Oliver kompiliert nicht unter Delphi 2010 - Compiler error "inkompatible Typen"

Habe den Code mal eben in ein D2010-Projekt kopiert: compiliert einwandfrei...

anse 23. Jan 2010 10:53

Re: Nur 1 Instanz des Programmes
 
Jo, hast natürlich recht. Ich hatte aus irgendeinem Grund in den Projekt-Optionen "Typed @ operator" auf True stehen. Mit der Default-Einstellung "False" kompiliert es.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz