AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Mutex und Programm nicht doppelt starten
Thema durchsuchen
Ansicht
Themen-Optionen

Mutex und Programm nicht doppelt starten

Ein Thema von kingflo · begonnen am 17. Jan 2007 · letzter Beitrag vom 17. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#1

Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 09:07
Hallo...
ich verhindere auf folgende art und weise, das mein Programm nur einmal gestartet werden kann:

Delphi-Quellcode:
unit mutex;

interface

implementation

uses windows,Dialogs,sysutils,login;

var mHandle: THandle; // Mutexhandle

Initialization
  mHandle := CreateMutex(nil,True,'Stryyke Client');

  if GetLastError = ERROR_ALREADY_EXISTS then begin
     Halt;
  end;

finalization // ... und Schluß
  if mHandle <> 0 then
    CloseHandle(mHandle)
end.
jetzt würde ich aber ganz gerne bei der laufenden Anwendung eine funktion aufrufen, weiß aber nicht wie ich das machen kann?

Alse wenn mein Prog schon läuft, dann soll die Anwendung (dort wo jetzt Halt; steht) eine Funktion bei der laufenden instanz aufrufen. Kann man das irgendwie machen?
Florian Gilde
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 09:16
schickt ihr eine Message und rufe vom Message-Handler dann deine Funktion auf, also in etwa so:

Delphi-Quellcode:
h := 0;
repeat
  h := FindWindowEx(0,h,'TApplication',PCHar(Application.Title));
until h <> Application.Handle;
if h <> 0 then begin
  Windows.SendMessage(h,SW_USER+4711,0,0);
end;
Achtung: so ins unreine getippt, also Fehler nicht ausgeschlossen
  Mit Zitat antworten Zitat
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#3

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 09:49
ich kriegs nicht hin... mit deinem Code kommt es nicht vor, dass h <>0 ist.

dann dachte ich,´dass es so gehen müsste:
Delphi-Quellcode:
  mHandle := CreateMutex(nil,True,'Stryyke Client');

  if GetLastError = ERROR_ALREADY_EXISTS then begin
     ShowMessage('test');
     Windows.SendMessage(mHandle,WM_USER,0,0);
     Halt;
  end;
dann wollte ich die ApplicationEvents abfangen, dass habe ich so gemacht:

Delphi-Quellcode:
procedure TLoginForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
 if MSg.message = WM_USER then begin
   ShowMessage('Angekommen');
 end;
end;

leider bekomme ich die ShowMessage('Angekommen'); nie zu sehen

daraus schließe ich, dass das Windows.SendMessage(mHandle,WM_USER,0,0); nicht richtig geht oder?
Florian Gilde
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#4

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 09:57
Dein mHandle ist das Handle des Mutex, das geht natürlich nicht!
Was du brauchst ist das Handle auf die bereits laufende Instanz des Programmes, daher das Findwindow. Ich schrieb ja, das dort ein Fehler sein könnte. Such mal hier im Forum nach Mutex und Fenster nach vornebringen, dort gibt es funktionierende Lösungen.

Edit:
Habe eben in der Newsgruppe de.comp.language.delphi.misc ein Beispiel gefunden, (ist von Nineberry, der weiss was er tut)
Delphi-Quellcode:
procedure CheckOnce;
const
  TestTitle = 'Nicoles Einweganwendung testing...';
  AppTitle = 'Nicoles Einweganwendung';
var
  hWnd: THandle;
begin
  // einen anderen Titel setzen, so dass wir uns
  // nicht selbst finden
  Application.Title:= TestTitle;
  hWnd:= FindWindow('TApplication', AppTitle);

  if hWnd <> 0 then
  begin
    // Eine andere Instanz läuft schon;

    // Falls minimiert, wiederherstellen
    if IsIconic(hWnd) then
      ShowWindow(hWnd, SW_SHOW);

    // Diese in den Vordergrund bringen
    SetForegroundWindow(hWnd);

    // Uns selbst schließen
    Halt;
  end;

  // Wir sind die erste Instanz -> Titel setzen, so
  // dass weitere unsfinden
  Application.Title:= AppTitle;
end;
Damit müsstest du deine andere Instanz finden, der schickst du dann die Message (und wenn du WM_USER + 4711 sendest, dann musst du natürlich auch auf WM_USER + 4711 abfragen)
/Edit
  Mit Zitat antworten Zitat
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#5

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 10:21
Arghhh... es geht leider nicht, er findet das fenster handle nicht...

meine unit sieht jetzt so aus:


Delphi-Quellcode:
unit mutex;

interface

implementation

uses windows,Dialogs,sysutils,forms,login,messages;

const
  TestTitle = 'StryykeclientTest';
  AppTitle = 'Stryykeclient';
var
  hWnd: THandle;

Initialization


  // einen anderen Titel setzen, so dass wir uns
  // nicht selbst finden
  Application.Title:= TestTitle;
  hWnd := FindWindow('TApplication', AppTitle);
  ShowMessage(Application.Title);
  if hWnd <> 0 then
  begin
    // Eine andere Instanz läuft schon;
    ShowMessage('gefunden');
    // Falls minimiert, wiederherstellen
    if IsIconic(hWnd) then
      ShowWindow(hWnd, SW_SHOW);

    // Diese in den Vordergrund bringen
    SetForegroundWindow(hWnd);

    // Uns selbst schließen
    Halt;
  end;

  // Wir sind die erste Instanz -> Titel setzen, so
  // dass weitere unsfinden
  Application.Title:= AppTitle;
  ShowMessage(Application.Title);
finalization // ... und Schluß

end.
Florian Gilde
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 10:30
Was funktioniert denn nicht?
Ich habe eben deinen Source mal in ein neues Projekt eingefügt und ausprobiert, da passierte das erwartete.
  Mit Zitat antworten Zitat
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#7

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 10:32
ok ok jetzt gehts... danke mein application.titel war nach der initialisierung anders...
Florian Gilde
  Mit Zitat antworten Zitat
kingflo

Registriert seit: 21. Jun 2004
Ort: Hamburg
502 Beiträge
 
Delphi 7 Professional
 
#8

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 10:35
jetzt hab ich aber das Problem, das die Windows Message trotzdem nicht ankommt

Windows.SendMessage(hWnd,WM_USER+4711,0,0);
Delphi-Quellcode:
procedure TLoginForm.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin
 if MSg.message = WM_USER+4711 then begin
   ShowMessage('Angekommen');
 end;
end;
Florian Gilde
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#9

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 10:40
Das Programm mittels Halt zu beenden ist nicht die beste Wahl.
Besser ist es den Mutex im .dpr file zu platzieren und dort einfach die "Application."-Zeilen in ein if einzuschliessen.
Wenn Application.Run nicht aufgerufen wird, dann macht das Programm auch nichts.
  Mit Zitat antworten Zitat
hsg

Registriert seit: 24. Apr 2006
Ort: Wustermark
354 Beiträge
 
Delphi 10.3 Rio
 
#10

Re: Mutex und Programm nicht doppelt starten

  Alt 17. Jan 2007, 11:05
Sorry, kann ich nachvollziehen, verstehe es aber momentan auch nicht.
Das Handle ist richtig, FindWindow liefert das korrekte Fenster, nur das Senden geht irgendwie ins Nirvana und kommt nicht in der Application an (auch Windows-mässig nicht).

Hab leider keine Zeit, da auf Forschung zu gehen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 20:41 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