Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Datenaustausch zwischen 2 Programmen? (https://www.delphipraxis.net/121512-datenaustausch-zwischen-2-programmen.html)

Errraddicator 30. Sep 2008 12:31

Re: Datenaustausch zwischen 2 Programmen?
 
@Dezipaitor
Für die Zukunft werde ich mir dann eventuell ma die Sache mit Pipes und Co. angucken aber für den Anfang und zum rumprobieren reicht mir glaube ich erst Mal das mit den Messages. :)

hanspeter 30. Sep 2008 12:45

Re: Datenaustausch zwischen 2 Programmen?
 
Ich habe so etwas mal mit den Winsockets gelöst.
(TCP/IP)
Diese Art der Datenkommunikation ist im Vergleich zu den anderen aufgezählten Verfahren die langsamste.
Für mich hatte das den Vorteil, das die Kopplung sehr lose ist und nicht in allen Programmen ein synchroner
Verbindungsaufbau erfolgen muss.

Ein Programm (Server) lauscht auf einem Port. Ich sende also eine Anfrage Server da?
Kommt ein timeout, so starte ich das Serverprogramm.
Es ist mit dieser Methode möglich, dass mehrere Programme auf dem gleichen Port lauschen.
In diesem Fall muss das Nachrichtenpaket eine Adresse haben.

Im meinem konkreten Beispiel fängt eine Nachricht z.B. mit der Folge RG-Y ..Datenpaket an.
Die Kennung RG läßt nur den Reportgenerator aktiv werden. Y bedeutet, das der Empfang des Datenpaketes quitiert werden soll.
Die Kennung EOJ wird von allen verstanden und beendet die Applikation.
Letzendlich habe ich mit dieser Lösung ein größeres Programm modularisiert, indem ich es in mehrere EXE-File zerlegt habe.

Gruß
Peter

Dezipaitor 30. Sep 2008 15:07

Re: Datenaustausch zwischen 2 Programmen?
 
Zitat:

Zitat von Errraddicator
@Dezipaitor
Für die Zukunft werde ich mir dann eventuell ma die Sache mit Pipes und Co. angucken aber für den Anfang und zum rumprobieren reicht mir glaube ich erst Mal das mit den Messages. :)

Kein Problem. Aber doppelte Arbeit. Auf Grund solcher Entscheidungen hatte ich schon einige Aufträge, also habe ich kein Problem damit :)

Errraddicator 1. Okt 2008 07:16

Re: Datenaustausch zwischen 2 Programmen?
 
Zitat:

Zitat von Dezipaitor
Kein Problem. Aber doppelte Arbeit. Auf Grund solcher Entscheidungen hatte ich schon einige Aufträge, also habe ich kein Problem damit :)

Siehste woll, dann sind wa doch alle glücklich... :lol:

...

Das Ganze hat in Test übrigens wunderbar funktioniert, aber in Produktion gibts natürlich wieder prompt Probleme.
Ich schreibe jetzt in meiner Client-Anwendung in lpData den Zeiger auf meine Datenstruktur die ich per SendMessage verschicken möchte.

Denn verschicke ich die Nachricht und die Serveranwendung erhält diese auch.
Aber wenn ich dann in der Serveranwendung auf lpData zugreifen möchte bekomme ich ne Zugriffsverletzung.
Was mache ich falsch?

Client-Anwendung
Delphi-Quellcode:
procedure TfrmClient.sendStatus(msg: String);
var
  msgStruct: TIpcStatusMessage;
  dataStruct: TCopyDataStruct;
  hServerWnd: HWND;
begin
  try
    lblStatus.Caption := msg;
    self.Update();

    // build message struct
    msgStruct := TIpcStatusMessage.Create();
    msgStruct.msg     := msg;
    msgStruct.clientId := self.clientId;

    // build copy-data-struct
    dataStruct.dwData := IPC_MSG_UPDATE_STATUS;
    dataStruct.cbData := SizeOf(msgStruct);
    dataStruct.lpData := @msgStruct;

    // get server-window
    hServerWnd := FindWindowEx(0, 0, nil, PChar(SERVER_TITLE));
    if hServerWnd <> 0 then
      SendMessage(hServerWnd, WM_COPYDATA, Longint(self.Handle), Longint(@dataStruct) );
  except
    on e: Exception do
    begin
      ;
    end;
  end;
end;
Serveranwendung
Delphi-Quellcode:
procedure TfrmServer.WMCopyData(var Msg: TWMCopyData);
var
  logMsg: TIpcStatusMessage;
begin
  if msg.CopyDataStruct.dwData = IPC_MSG_REQUEST_CLIENT then
  begin
 
  end
  else if msg.CopyDataStruct.dwData = IPC_MSG_RETURN_OUTPUT then
  begin

  end
  else if msg.CopyDataStruct.dwData = IPC_MSG_UPDATE_STATUS then
  begin
    logMsg := Msg.CopyDataStruct.lpData;
    if logMsg <> nil then
      updateStatus(logMsg.msg, logMsg.clientId);
  end;
end;

DeddyH 1. Okt 2008 07:19

Re: Datenaustausch zwischen 2 Programmen?
 
Du verschickst einen Zeiger auf eine Objektinstanz, welche ja auch nur ein Zeiger ist.

Errraddicator 1. Okt 2008 07:30

Re: Datenaustausch zwischen 2 Programmen?
 
Oh, das ging aber schnell ^^
Danke schomma, denn 1 Fehler konnte ich dadurch schomma finden:
Client-Anwendung
Delphi-Quellcode:
dataStruct.lpData := @msgStruct;
Das ist natürlich doppelt gemoppelt...
Hab das jetzt geändert auf:
Delphi-Quellcode:
datatStruct.lpData := msgStruct;
Dann bin ich jetzt in dem Sinne weiter, dass die Adresse die in lpData gespeichert wird, der von msgStruct entspricht (beides $A66A30).

...

Wenn der Server jetzt aber die Nachricht empfängt, steht dort nicht mehr $A66A30, sondern komischerweise $12FED0
Warum ändert sich dieser Zeiger, während des verschickens?

...

Weiß das ich mich hier etwas doof anstelle, aber solche Dinge sind mir komplett neu, deswegen weiß ich da nich so recht, wo ich anfangen soll selbst zu suchen. *G*

DeddyH 1. Okt 2008 08:17

Re: Datenaustausch zwischen 2 Programmen?
 
Hast Du mal versucht, die Klasse gegen einen Record auszutauschen?

Errraddicator 1. Okt 2008 08:59

Re: Datenaustausch zwischen 2 Programmen?
 
So, habs jetzt mal mit ner Record versucht und nun funzt es, Danke! :)

1 Frage habe ich aber noch dazu, wäre ja auch sonst zu einfach. :D
Mein TIpcStatusMessage sieht so aus
Delphi-Quellcode:
  TIpcStatusMessage = record
    msg: array[0..200] of Char;
    clientId: Integer;
  end;
Ist also nur ne Textnachricht und zusätzlich ne ID, von welcher Client-Anwendung das kommt.

Wenn ich das Ganze wie oben beschrieben mit Array[0..200] of Char mache funktioniert das auch.
Versuche ich aber z.B. "msg: String" bekomme ich dort an der Serveranwendung ne Zugriffsverletzung.
Bei "PChar" bekomme ich dann widerum nur nen Leerstring usw.

Ich schätze mal das hat was mit den verschiedenen Mechanismen der Datentypen zu tun, und mit Array funzt es ja auch,
aber zum Verständnis wäre ich trotzdem dankbar, wenn mir Jemand so grob erklären könnte, warum ich ein fixes Array senden kann, einen String z.B. aber nicht.


Danke!

Patrick

DeddyH 1. Okt 2008 09:03

Re: Datenaustausch zwischen 2 Programmen?
 
Das liegt einfach daran, dass ein String auch nur ein Zeiger auf das erste Zeichen ist, wohingegen bei einem Array fester Größe dieses auch selbst übertragen wird.

Klaus01 1. Okt 2008 09:09

Re: Datenaustausch zwischen 2 Programmen?
 
Delphi-Quellcode:
TIpcStatusMessage = record
    msg: String[200];
    clientId: Integer;
  end;
sollte auch gehen.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr.
Seite 2 von 3     12 3      

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