![]() |
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 |
Re: Nur 1 Instanz des Programmes
HAI :hi:
Mutex ist das was du suchst ... :coder:
Delphi-Quellcode:
:feuerchen:
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. |
Re: Nur 1 Instanz des Programmes
...oder nach Semaphor, siehe dazu dieses Beispiel (Der Part um die Instanz zu checken):
Delphi-Quellcode:
Gruß
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; Mazel |
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 |
Re: Nur 1 Instanz des Programmes
Hallo,
diese Diskussionen gab es schon häufig. Verschiedene ![]() ![]() Gruß Jürgen PS. Die Suchfunktion liefert unübersichtliche Ergebnisse. Bei ![]() |
Re: Nur 1 Instanz des Programmes
Hallo.
Zitat:
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 |
Re: Nur 1 Instanz des Programmes
http://assarbad.net/de/stuff/!import/nico.old/ -> oneinst.zip! Uralt und noch immer gut zur Veranschaulichung.
|
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.
|
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 |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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