AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenaustausch zwischen 2 Programmen?

Ein Thema von Errraddicator · begonnen am 29. Sep 2008 · letzter Beitrag vom 7. Okt 2008
Antwort Antwort
Seite 2 von 3     12 3      
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#11

Re: Datenaustausch zwischen 2 Programmen?

  Alt 30. Sep 2008, 13:31
@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.
  Mit Zitat antworten Zitat
hanspeter

Registriert seit: 26. Jul 2003
Ort: Leipzig
1.350 Beiträge
 
Delphi XE2 Professional
 
#12

Re: Datenaustausch zwischen 2 Programmen?

  Alt 30. Sep 2008, 13:45
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
  Mit Zitat antworten Zitat
Dezipaitor

Registriert seit: 14. Apr 2003
Ort: Stuttgart
1.701 Beiträge
 
Delphi 7 Professional
 
#13

Re: Datenaustausch zwischen 2 Programmen?

  Alt 30. Sep 2008, 16:07
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
Christian
Windows, Tokens, Access Control List, Dateisicherheit, Desktop, Vista Elevation?
Goto: JEDI API LIB & Windows Security Code Library (JWSCL)
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 08:16
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...

...

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;
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#15

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 08:19
Du verschickst einen Zeiger auf eine Objektinstanz, welche ja auch nur ein Zeiger ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 08:30
Oh, das ging aber schnell ^^
Danke schomma, denn 1 Fehler konnte ich dadurch schomma finden:
Client-Anwendung
dataStruct.lpData := @msgStruct; Das ist natürlich doppelt gemoppelt...
Hab das jetzt geändert auf:
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*
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#17

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 09:17
Hast Du mal versucht, die Klasse gegen einen Record auszutauschen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#18

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 09:59
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.
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#19

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 10:03
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#20

Re: Datenaustausch zwischen 2 Programmen?

  Alt 1. Okt 2008, 10:09
Delphi-Quellcode:
TIpcStatusMessage = record
    msg: String[200];
    clientId: Integer;
  end;
sollte auch gehen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 18:57 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