![]() |
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. :) |
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 |
Re: Datenaustausch zwischen 2 Programmen?
Zitat:
|
Re: Datenaustausch zwischen 2 Programmen?
Zitat:
... 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:
Serveranwendung
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;
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; |
Re: Datenaustausch zwischen 2 Programmen?
Du verschickst einen Zeiger auf eine Objektinstanz, welche ja auch nur ein Zeiger ist.
|
Re: Datenaustausch zwischen 2 Programmen?
Oh, das ging aber schnell ^^
Danke schomma, denn 1 Fehler konnte ich dadurch schomma finden: Client-Anwendung
Delphi-Quellcode:
Das ist natürlich doppelt gemoppelt...
dataStruct.lpData := @msgStruct;
Hab das jetzt geändert auf:
Delphi-Quellcode:
Dann bin ich jetzt in dem Sinne weiter, dass die Adresse die in lpData gespeichert wird, der von msgStruct entspricht (beides $A66A30).
datatStruct.lpData := msgStruct;
... 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* |
Re: Datenaustausch zwischen 2 Programmen?
Hast Du mal versucht, die Klasse gegen einen Record auszutauschen?
|
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:
Ist also nur ne Textnachricht und zusätzlich ne ID, von welcher Client-Anwendung das kommt.
TIpcStatusMessage = record
msg: array[0..200] of Char; clientId: Integer; end; 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 |
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.
|
Re: Datenaustausch zwischen 2 Programmen?
Delphi-Quellcode:
sollte auch gehen.
TIpcStatusMessage = record
msg: String[200]; clientId: Integer; end; Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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