AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi zwei Instanzen, die voneinander wissen...
Thema durchsuchen
Ansicht
Themen-Optionen

zwei Instanzen, die voneinander wissen...

Offene Frage von "Marco Steinebach"
Ein Thema von Marco Steinebach · begonnen am 3. Nov 2009 · letzter Beitrag vom 3. Nov 2009
Antwort Antwort
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#1

zwei Instanzen, die voneinander wissen...

  Alt 3. Nov 2009, 16:42
Hallo zusammen,
nein, keine Angst, wie man das doppelte Aufrufen eines Programmes verhindert, weiß ich.
Aber, ich habe folgendes Problem:
Aufruf 1, wird gestartet, und läuft.
Aufruf 2 wird gestartet, und soll folgendes tun:
Wenn Aufruf 1, also die erste instanz, nix kritisches macht, übergibt er, per Message, eine evtl. beim Aufruf übergebene Datei an die Erste Instanz, und schließt sich wieder.
Macht Aufruf 1 gerade was Kritisches, in meinem Falle Dateien konvertieren, soll Aufruf 2 das mitkriegen und sich mit einer Fehlermeldung schließen.
Und genau am "mitkriegen" scheitere ich.
Ich dachte, beim start des konvertierens eine Umgebungsvariable via
SetEnvironmentVariable zu setzen, aber davon kriegt Aufruf 2 nix mit.
Wie löst man soetwas???
Für Hilfe wäre ich sehr dankbar.
Einen freundlichen Gruß
Marco
p.s.: es müßte was sein, was auf jedenfall verschwindet, wenn der Aufruf 1-Prozess stirbt, nicht, daß man das Programm nie wieder starten kann.
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: zwei Instanzen, die voneinander wissen...

  Alt 3. Nov 2009, 16:54
Jedes Programm bekommt von seinem Paps (Owner) den EnvironmentBlock vererbt
(es sei den der Owner, also der, welcher dieses Programm startet, gibt einen anderen Block an)

Deine Änderung machst du nur in der eigenen Kopie dieses Blocks und andere bekommen es nicht mit.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
502 Beiträge
 
Delphi 5 Enterprise
 
#3

Re: zwei Instanzen, die voneinander wissen...

  Alt 3. Nov 2009, 17:30
Hallo,
okay, verstanden. Aber wie macht man's dann?
Ich kann ja schlecht eine Datei anlegen. Das ginge zwar, weil der 2 prozess prüfen kann, ob's die gibt, aber wenn der erste abstürzt, bleibt die Datei da und dann ist schluß mit starten.
Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#4

Re: zwei Instanzen, die voneinander wissen...

  Alt 3. Nov 2009, 17:37
Du sendest per SendMessage einfach deine Meldung

Im anderen Programm wird diese IMMER entgegengenommen und wenn das Programm grad was "kritisches" macht, dann gibt es z.B. 0 zurück, ansonsten 1.

Nun kann das 2. Programm reagieren
- 1: der Erste hat es angenommen
- 0: neee, der will grad nicht


Eventuell auch SendMessageTimeOut, falls das Erste grad nicht antworten kann.
Kommt da 'ne 0 oder der Timeout schlägt zu, dann kommt halt deine Fehlermeldung an den User.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Delphianer

Registriert seit: 19. Feb 2003
Ort: Rossau
149 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

Re: zwei Instanzen, die voneinander wissen...

  Alt 3. Nov 2009, 21:15
Hallo,

Messages zwischen zwei Instanzen zu verschicken ist nicht das Problem, aber Daten.

Da ich das auch benötigt habe, bin ich auf WM_COPYDATA gestoßen, das genau das macht.

Delphi-Quellcode:
  
var
  FileName: string;
  CopyDataStruct: TCopyDataStruct;
  ReceiverHandle: THandle;
begin
  ...
  CopyDataStruct.dwData := 0;
  CopyDataStruct.cbData := 1 + Length(FileName) * SizeOf(Char);
  CopyDataStruct.lpData := PChar(FileName);

  ReceiverHandle := FindWindow(PChar('TReceiverForm'), PChar('ReceiverForm'));
  if ReceiverHandle > 0 then
  begin
    SendMessage(ReceiverHandle, WM_COPYDATA, 0, Integer(@CopyDataStruct));
  end;
  ...
end;
Bei ReceiverForm musst Du natürlich Dein Zielfenster eintragen.

Ich hoffe, das hilft Dir.

Lutz
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:23 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