Autor Beitrag
Steve1024
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Do 02.06.05 13:55 
Hi,

ich hätte da mal eine Frage.

Alos: Ich habe zwei Anwendung... (selbstgerieben) und möchte Informationen bzw. Daten zwischen diesen austauschen. Im Delphi Buch steht was von NamedPipes, da ich aber nachgeforscht habe, ist diese Lösung unrelevant, da man dafür Admin-Rechte benötigt.

Als ich weitergeforscht habe, fand ich heraus, dass es API-Funktionen gibt.
So wäre da:
1. DDE
2. Send- bzw. PostMessage (WM_COPYDATA)
3. MMF (Memory Mapped Files)

Ich hab jetzt mal mit Send- bzw. PostMessage rum probiert, was auch echt gut funktioniert. Ich habe da nur ein problem. Ich möcht ja Daten zum Server-Prozess schicken, welcher dann den Inhalt dieser Daten ändert und so zu sagen dem Client-Prozess als Ergebnis zurück liefert. Das scheint mir aber dabei nicht möglich. Dast du da möglicherweise eine Idee???

Bsp Code:

ausblenden Server-Prozess
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  type
    TForm1 = class(TForm)
      ...
      procedure WM_CopyData(var Msg:TMessage); message WM_COPYDATA;
      ...
    end;
  ...
  procedure TForm1.WM_CopyData(var Msg:TMessage);
  var Data : TCopyDataStruct;
  Begin
    Data := TCopyDataStruct(Pointer(Msg.lParam)^);
    Integer(Data.lData^) := Integer(Data.lData^) + 10;
    Msg.lParam := Integer(@Data);
    Msg.result := 1;
  end;
  ...



ausblenden Client-Prozess
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
  type
    TForm1 = class(TForm)
      ...
      procedure SendData;
      ...
    end;
  ...
  procedure TForm1.SendData;
  var Data : TCopyDataStruct; tmpP : Pointer; h : HWND; r : Integer;
  Begin
    tmpP := AllocMem(SizeOf(Integer));
    Integer(tmpP^) := 150;
    Data.lData  := tmpP;
    Data.cbData := SizeOf(Integer);
    Data.dwData := SizeOf(Integer);
    
    h := FindWindowEx(0,0,'TForm1','Server');
    IF h <> 0 THEN
      r := SendMessage(h,WM_COPYDATA,Handle,Integer(@Data)) // nachricht senden und warten
    ELSE
      raise Exception.Create('Server nicht gefunden');
    IF r <> 0 THEN
      raise Exception.Create('Server nicht gültig)
    else
      MessageBox(Handle,PChar(IntToStr(Integer(Data.lData^))),'
Ergebnis',0);  // soll 160 sein...
  end;
  ...


Ich hoffe der Code zeigt dir noch besser, was ich will. Hoff du kannst mir helfen. Ich möchte nämlich keine zwei Funktionen haben... also im Server-Prozess ein WM_CopyData und SendData sowie im Client. Ich möchte das das über eine Funktion abläuft.

Grund: Ich möchte eine Klasse im Server haben, welcher globale Informationen hat und viele Client-Klassen, welche die Eigenschaften und Funktionen auf dem Server ab- bzw. aufrufen.

Bsp:
ServerClass hat property ErrorID mit Wert z.B. 10
und
Der Client auch, wobei bei diesem kein Wert sondern eine Funktion dahinter steht.
Diese Funktion soll dann auf den Server greifen und den Wert abfragen und als Wert
zurückgeben, was bei zwei Funktionen nicht möglich wäre. Denn dann müsste ich ja in dieser
Funtkion warten, bis der Server-Prozess diese Information gesendet hat.

Schon Danke im Voraus...

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Do 02.06.05 23:13 
Titel: Re: Daten zwischen Prozessen austauschen... aber mit var Dat
user profile iconSteve1024 hat folgendes geschrieben:
Grund: Ich möchte eine Klasse im Server haben, welcher globale Informationen hat und viele Client-Klassen, welche die Eigenschaften und Funktionen auf dem Server ab- bzw. aufrufen.

Bsp:
ServerClass hat property ErrorID mit Wert z.B. 10
und
Der Client auch, wobei bei diesem kein Wert sondern eine Funktion dahinter steht.
Diese Funktion soll dann auf den Server greifen und den Wert abfragen und als Wert
zurückgeben, was bei zwei Funktionen nicht möglich wäre. Denn dann müsste ich ja in dieser
Funtkion warten, bis der Server-Prozess diese Information gesendet hat.


Dafür eignet sich ActiveX/COM Server am besten.

_________________
Ciao, Sprint.
Steve1024 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Fr 03.06.05 08:37 
Titel: Das geht nicht
Das kann ich aber nicht verwenden, denn es ist ein Programm in Hintergrund, welches immer unterschiedliche Module läd. Ein Modul dovon ist auch das. Gibt es da jetzt somit keine Möglichkeit das so zu lösen??
Muss ich da jetzt wirklich immer zwei Funktionen haben, welche im Timer ablaufen, um die Infos immer auf dem aktuellsetn stand zu haben???

Bitte helft mit... danke.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 03.06.05 08:50 
Shared Memory. Is fix, einfach und zuverlässig. DDE setzt auf Shared Memory auf, ist aber IMHO zu kompliziert (jedenfalls für mich).

hier
[url]
www.torry.net/quicks...redmem&Title=Yes
[/url]
Steve1024 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Fr 03.06.05 08:54 
Titel: danke... werde mal gucken...
Danke. Ich werde mich gleich mal drüber machen... und damit funktioniert das so wie ich das will.... *hoff*

Ich meld mich wieder, ob es funktioniert hat....
Steve1024 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
BeitragVerfasst: Do 15.09.05 15:10 
hab mir jetzt selbst einen InterProzess Kommunikations Object geschreiben..


Jeder der es haben will kann mir mailen:
Stephan.Schamberger@innova-ps.de
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Do 15.09.05 16:16 
Hallo!

Warum postest du sie nicht in der Open Source Units Sparte?

Cu,
Udontknow
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 14.10.06 13:59 
user profile iconSteve1024 hat folgendes geschrieben:
hab mir jetzt selbst einen InterProzess Kommunikations Object geschreiben..


Jeder der es haben will kann mir mailen:
Stephan.Schamberger@innova-ps.de


Hallo,

warum so kompliziert? Windows Messages transportieren doch Daten nach Belieben von Window zu Window per Pointer in LParam - Strings z.B. mit WM_SETTEXT oder WM_GETTEXT.

Gruss Reinhard
pascalsv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Sa 14.10.06 14:02 
Hallo Reinhard,

wenn Du aber richtig viele Daten einer anderen Anwendung zur Verfügung stellen möchtest? Ich denke darüber nach, einen Bildschirmschoner zu erstellen, der eine Bass-Visualisierung darstellt. Dafür muss ich die Struktur FFTFata übertragen. Dies wird mit Messages nicht gehen, oder???!!!

Pascal
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 14.10.06 14:21 
user profile iconpascalsv hat folgendes geschrieben:
Hallo Reinhard,

wenn Du aber richtig viele Daten einer anderen Anwendung zur Verfügung stellen möchtest? Ich denke darüber nach, einen Bildschirmschoner zu erstellen, der eine Bass-Visualisierung darstellt. Dafür muss ich die Struktur FFTFata übertragen. Dies wird mit Messages nicht gehen, oder???!!!

Pascal


Hallo,

LParam ist ein Pointer und kann auf Beliebiges zeigen, eine Begrenzung existiert meines Wissens nicht. Man kann sich aber bei grossen Datenmengen überlegen, ob man Mehrfachkopien vermeiden kann, dann kämen am ehesten Shared Memory oder Memory Mapped Files in Frage. Interprozess-Kommunikation wird dagegen kaum anders ablaufen als die Übertragung durch Messages, also die Daten kopieren, u.U. mehrfach.

Gruss Reinhard
pascalsv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Sa 14.10.06 14:51 
Hallo Reinhard,

was würdest Du mir also empfehlen? Ich möchte einen String und die Struktur FFTFata (Bass) weitergeben. Absender ist eine exe und Empfänger eine weitere exe in Form eines Bildschirmschoners. Wie würdest Du vorgehen? Könntest Du ein Minimalbeispiel zeigen? Wie würdest Du SharedMemory anwenden?

Mir ist der Weg grundsätzlich egal, jedoch komme ich nicht weiter, weil ich kein Beispiel zu sharedmemory gefunden habe.

Danke!

Pascal
Reinhard Kern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 591
Erhaltene Danke: 14



BeitragVerfasst: Sa 14.10.06 15:07 
user profile iconpascalsv hat folgendes geschrieben:
Hallo Reinhard,

was würdest Du mir also empfehlen? Ich möchte einen String und die Struktur FFTFata (Bass) weitergeben. Absender ist eine exe und Empfänger eine weitere exe in Form eines Bildschirmschoners. Wie würdest Du vorgehen? Könntest Du ein Minimalbeispiel zeigen? Wie würdest Du SharedMemory anwenden?

Mir ist der Weg grundsätzlich egal, jedoch komme ich nicht weiter, weil ich kein Beispiel zu sharedmemory gefunden habe.

Danke!

Pascal


Hallo,

Google erweitert den Horizont:
www.delphifaq.com/fa...ndows_API/f348.shtml
www.codeproject.com/...ads/sharedmemipc.asp

sind beide auf der ersten Seite bei "delphi shared memory" und scheinen mir brauchbar.

Das Shared Mem selbst ist weniger das Problem als die Zugriffe darauf sinnvoll zu synchronisieren - aber möglicherweise ist das bei deiner Anwendung garnicht kritisch.

Gruss Reinhard
pascalsv
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 133

Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
BeitragVerfasst: Sa 14.10.06 15:11 
Reinhard,

ich habe ein einfacherers Beispiel gefunden: www.q3.nu/trucomania/truco.cgi?381&ing

Bisher klappt es einwandfrei, sogar ein Update alle 33 ms....

Pascal