Autor |
Beitrag |
Steve1024
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: 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:
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; ... |
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)) 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 Christian S.: Delphi-Tags hinzugefügt.
|
|
Sprint
      
Beiträge: 849
|
Verfasst: Do 02.06.05 23:13
Titel: Re: Daten zwischen Prozessen austauschen... aber mit var Dat
Steve1024 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 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: 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 
      
Beiträge: 141
Windows 2K, XP, 7 & Server 2003 - 2008; Linux (Ubuntu, Fedora)
D7, D05, D06, D09, DXE
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Do 15.09.05 16:16
Hallo!
Warum postest du sie nicht in der Open Source Units Sparte?
Cu,
Udontknow
|
|
Reinhard Kern
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 14.10.06 13:59
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
      
Beiträge: 133
Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
|
Verfasst: 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
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 14.10.06 14:21
pascalsv 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
      
Beiträge: 133
Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
|
Verfasst: 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
      
Beiträge: 591
Erhaltene Danke: 14
|
Verfasst: Sa 14.10.06 15:07
pascalsv 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
      
Beiträge: 133
Win XP Prof. SP2 / Windows 7
Visual Studio 2008 / Silverlight 3 / Silverlight 4 Beta
|
Verfasst: 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
|
|
|