Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Interaktion zweier Programme (https://www.delphipraxis.net/131462-interaktion-zweier-programme.html)

Mongfice 25. Mär 2009 09:04


Interaktion zweier Programme
 
Moin,
ich hab da mal ne kleine Frage:

Wie stelle ich es am besten an, dass zwei Programme miteinander interagieren können?
Das Szenario dass mir vorschwebt ist folgendes:
Im Programm A gibt es z.B. einen Button, der beim Anklicken ein Fenster in Programm B öffnet (oder falls dieses noch nicht läuft es startet und dann das Fenster öffnet).

Mir ist bisher nur eingefallen entweder Startparameter an Programm B zu übergeben - was aber deshalb nicht geht, weil Programm B ggf. auch schon laufen soll und nicht jedesmal beendet werden soll, bevor man den Button in Programm A an anderer Stelle erneut betätigt - oder es über eine Datenbanktabelle zu machen, die Programm B in regelmäßigen Abständen auf Änderungen überprüft und dann ggf. darauf reagiert. Letzteres gefällt mir aber eigentlich auch nicht, weil ich schon sehr häufig (schätze mal in max. 1 Sekunden-Intervallen) diese Tabelle überprüfen müsste, was wohl den DB-Server und das Netzwerk etwas zu stark belasten dürfte, vorallem wenn ich das sagen wir mal an 20 Rechnern gleichzeitig mache..

Hat jemand evlt. nen Tipp was man sonst noch machen könnte und/oder Erfahrungen damit? Was bieten sich denn noch für Möglichkeiten? Am liebsten wäre mir eigentlich ne rein lokale Lösung, da Programm A und B beide eigentlich nur auf dem gleichen Rechner interagieren müssen, nicht über den Server oder das Netz mit anderen Instanzen des jeweiligen Programms auf anderen Rechnern.

Gruß
Mongfice

DeddyH 25. Mär 2009 09:07

Re: Interaktion zweier Programme
 
Schau mal hier: http://www.delphipraxis.net/internal...t.php?t=143363

Mongfice 25. Mär 2009 09:31

Re: Interaktion zweier Programme
 
Mhh, als Datenaustausch hab ich das bisher nicht gesehn... hast wohl recht. Vorallem weil der "Austausch" nur einseitig wäre.. Deshalb wohl auch mit der Suche nicht gefunden *schäm*

Aber klar, ich könnte ja ggf. verschiedene Daten übergeben, wenn ich doch verschiedene Fenster öffnen will, oder nur ein festes Datum nach dem Motto, wenn du so ne Message bekommst, dann mach mal... Oder ich könnte recht einfach mehr Daten übergeben, wenn ich irgendwann nochmal "zusätzliche" Daten brauche.
Selbst wenn ich ne Leere Message dieses Typs schicke müsste ich darauf ja mit "FormXY.Create" reagieren können...

Luckie 25. Mär 2009 10:10

Re: Interaktion zweier Programme
 
Wenn es nur ein paar Parameter sind, dann geht es wohl am einfachsten mit MSDN-Library durchsuchenWM_COPYDATA. Ein Beispiel findest du auf meier Seite: http://www.michael-puff.de/Developer...COPYDATA.shtml

Mongfice 25. Mär 2009 10:23

Re: Interaktion zweier Programme
 
Ja, das ist genau das, was in dem Post den DeddyH gelinkt hat auch schon drin steht, nur nen anderes Beispiel.
Hatte aus dem Thema eben auch die Messages als beste Möglichkeit rausgesucht, trotz der dort geposteten (zugegeben berechtigten) Einwände. Muss jetzt nur nochmal rausbekommen ob ich in Programm A überhaupt das Abschicken einer Message so einfach einbauen kann, da mir das Programm z.Z. noch nicht vorliegt.. Fürchte mal ich werd da eh nen kleines Tool schreiben müssen, dass ich jedesmal aus Programm A starte um die Message an Programm B zu schicken... Mal schaun...

mr_emre_d 25. Mär 2009 15:09

Re: Interaktion zweier Programme
 
Stichworte:
CreateFileMapping
MapViewOfFile

MfG

quendolineDD 25. Mär 2009 15:39

Re: Interaktion zweier Programme
 
Ich nehme liebend gerne NamedPipes. Andernfalls, falls du etwas Plattformunabhängiges haben willst empfehle ich dir noch TCP/IP.

erich.wanker 25. Mär 2009 15:53

Re: Interaktion zweier Programme
 
.. ich hätte hier ein paar Zeilen, die den "Sendmessage"-Teil betreffen...

HTH

Erich


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    Memo1: TMemo;
    procedure SpeedButton1Click(Sender: TObject);
  private
    { Private declarations }
    procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}




// How to send Data to my Software







procedure TForm1.SpeedButton1Click;
var

  aCopyData: TCopyDataStruct;
  p: PChar;

begin


  p := 'Hello World';         // die zu übertragenden Daten

  with aCopyData do begin
    dwData := 4;             //  kann als Senderidentifikation verwendet werden
    cbData := StrLen(p) + 1; //  Sendespeicherlänge terminieren..
    lpData := p;
  end;

  SendMessage(FindWindow('TForm1', nil), WM_COPYDATA, Longint(Handle),Longint(@aCopyData));


  // http://msdn.microsoft.com/en-us/library/ms633499(VS.85).aspx     = FindWindow
  // http://msdn.microsoft.com/en-us/library/ms644950(VS.85).aspx     = Sendmessage
  // http://msdn.microsoft.com/en-us/library/ms649011(VS.85).aspx     = WM_COPYDATA
  // http://msdn.microsoft.com/en-us/library/ms649010(VS.85).aspx     = TCopyDataStruct

end;



procedure TForm1.WMCopyData(var Msg: TWMCopyData);

var x :integer;
    s :PChar;

begin
  StrLCopy(s, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  x   := (Integer(Msg.CopyDataStruct.dwData));
  memo1.Lines.Append  ('Nachricht:'+s+' von SenderID:'+ inttostr(x));

end;



end.

Mongfice 25. Mär 2009 15:59

Re: Interaktion zweier Programme
 
Mhh, ja, die NamedPipes klingen auch ganz gut.
TCP/IP würd ich persönlich nur nehmen, falls wirklich der Fall eintreten sollte, dass ich ne Kommunikation mit einem Prozess auf einem anderen Rechner brauche. Aber an sich sollte das eigentlich ausgeschlossen sein.

Muss nach wie vor erstmal zusehen, dass ich genau rausbekomme welche "Eingriffe" ich in Programm A überhaupt machen kann... Das bleibt im Augenblick noch das große Rätsel - und das wohl auch für die nächsten Tage.

Bis dahin muss ich mich mit kleinen selbstgebastelten Test-Sendern zufrieden geben, aber der Test mit den Messages war schonmal zufriedenstellend. Vorteil der Messages ist natürlich, dass es wirklich extrem einfach ist. Und solange ich nicht mehr als nur ne einfache ID brauche, die ich übertrage denke ich ist das die beste Lösung, statt den Overhead des Öffnens und Schließens einer Pipe für grob geschätzte 5 Zeichen zu machen oder das ganze in nen TCP-Paket zu packen und das an sich selbst zu schicken...

Sherlock 25. Mär 2009 16:10

Re: Interaktion zweier Programme
 
TCP/IP ist nicht ganz plattformunabhängig. Unter Windows bzw. schlechten Terminalservern führt das schon gerne mal zu Problemen, da diese nicht die Ports vervielfachen, sondern über alle Terminalsessions die gleichen Ports verwenden. Da kommuniziert Programm A der einen session gerne mal mit Programm B der anderen Session -.-

Das ist aber mit neueren Citrix Versionen nicht mehr aktuell. Was die Windows-Terminalserver dazu sagen, weiss ich grad nicht.

Sherlock


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr.
Seite 1 von 2  1 2      

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