![]() |
String via Sendmessage unvollständig
Hallo DP,
ich nutze auf meiner Hauptanwendung idHttp und sende POST requests an einen Server. Obwohl ich idAntiFreeze benutze, friert die Anwendung regelmäßig ein, ganz besonders wenn die Internetverbindung etwas langsamer ist. Dadurch sind die anderen Funktionen der Anwendung kaum nutzbar und deshalb möchte ich den POST request eine andere Applikation erledigen lassen. Dazu habe ich eine neue Formularanwendung erstellt, die
Die Hauptanwendung muss lediglich die URL an die Sekundäranwendung übermitteln, damit diese den POST request absetzen kann. Sobald ein Ergebnis vorliegt, meldet die Sekundäranwendung den Status an die Hauptanwendung. Mein Problem ist, dass der String per SendMessage nicht mehr als 6 Zeichen verträgt: Sender Code:
Delphi-Quellcode:
Empfänger Code:
procedure TForm1.Button1Click(Sender: TObject);
var DataStruct : CopyDataStruct; begin DataStruct.dwData := 0; DataStruct.cbData := length(Edit1.Text)+1; DataStruct.lpData := pchar(Edit1.Text); SendMessage(FindWindow('TForm1', 'Recipient'), WM_CopyData, Form1.handle, integer(@DataStruct)); end;
Delphi-Quellcode:
Leider sind die Ergebnisse alle unvollständig und es gibt unterschiedliche String-Längen. Hier ein paar Beispiele:
procedure CopyData(var Msg: TWMCopyData); message wm_CopyData;
: procedure TForm1.CopyData(var Msg: TWmCopyData); var sMsg: String; begin if IsIconic(Application.Handle) then Application.Restore; sMsg := PChar(Msg.CopyDataStruct.lpData); lbMsg.Caption := sMsg; end; String 1234567890 wird zu 123456 String Edit1 wird zu Edi String ![]() ![]() String Delphipraxis wird zu Delphip Habt ihr eine Ahnung warum das so ist? |
AW: String via Sendmessage unvollständig
The SendMessage returns an integer value assigned by the code that handled the WM_CopyData message.
![]() Ausserdem: PChar: PANSICHAR, PWIDECHAR...??? Info: ![]() |
AW: String via Sendmessage unvollständig
Probiert mal statt
Code:
DataStruct.cbData := length(Edit1.Text)+1;
Code:
Oder schau mal
DataStruct.cbData := SizeOf(Edit1.Text)+1;
![]() |
AW: String via Sendmessage unvollständig
Ich habe schon mal keine Ahnung, warum du das in einer Sekundäranwendung auslagerst.
Delphi-Quellcode:
ist Kindergarten. Dort wird nur ein
TIdAntiFreeze
Delphi-Quellcode:
ausgeführt, wenn ein Datenblock übertragen wurde. Darum verschlechtert sich auch das Verhalten bei einer langsamen Leitung.
Application.ProcessMessages
Lagere den Versand in einen Thread aus und alles wird schön. |
AW: String via Sendmessage unvollständig
Zwei voneinander unahängige VCL-Anwendungen lassen sich mit den jeweiligen Fremdkomponenten recht schnell zusammenklicken.
Danach schickt man von der einen Nachrichten an die andere, um die Andere fernzusteuern. Und von der Anderen schickt man Nachrichten zwecks Kontrolle zurück an die eine. Wenn und falls das problemlos klappt, ist man sehr glücklich über seine beiden kommunizierenden VCL-Anwendungen! Wie man aus den zwei VCL-Anwendungen nun nur noch eine mit Threads macht, sollte abhängig von der verwendeten Delphi-Version nicht ganz so trivial oder simpel sein, wenn die beiden VCL-Anwendungen bisher ihre Ausgaben auf dem Bildschirm darstellten. Der ferngesteuerten Anwendung ihre Bildschirmausgaben wegzunehmen, um sie in einen Thread auszulagern, dürfte nicht ganz so einfach werden. Insofern habe ich vollstes Verständnis für Sekundäranwendungen. Welchen Vorteil hätte eigentlich ein Hauptprogramm mit zusätzlichem Thread, wenn der Thread abschmiert gegenüber zwei Programmen, die miteinander kommunizieren? |
AW: String via Sendmessage unvollständig
Zitat:
Wenn schon paranoid, dann doch auch bitte konsequent und die Sekundäranwendung auf einem separaten Rechner (im klimageregelten Tresor) laufen lassen. Der Austausch der Daten dann per MSMQ/ActiveMQ (transaktionsbasiert) damit auch ja nichts verloren gehen kann. Und dann noch die Reset-Taste des Rechners mit der Sekundäranwendung an das Netzwerk(*) anschliessen - man kann ja nie sicher sein, dass der sich nicht festfrisst. Gut, man fragt eigentlich nur ein paar Daten von einem Webserver ab ... also etwas, das jeden Tag von Millionen von Menschen mit einem Rechner und einer Anwendung tausendfach passiert ... aber man kann ja nicht vorsichtig (paranoid) genug sein ... :mrgreen: (*) Um diesen Reset-Taster per Netzwerk anzusprechen, reicht ein simpler HTTP-Request aus ... ;) |
AW: String via Sendmessage unvollständig
Wenn der Server nicht erreichbar ist, dann bekommt man eine Exception und gut ist.
Davon schmiert weder die Anwendung noch der Thread ab. Die Exception geht einfach ihren kontrollierten Weg, den man auch noch beeinflussen kann. |
AW: String via Sendmessage unvollständig
Bitte unterlasst es eure persönlichen Abneigungen hier öffentlich auszutragen.
Davon abgesehen halte ich einen zweiten Prozess für einen HTML Request auch für Overkill und unsinnig. Genau dafür sind Threads da, um Aufgaben im Hintergrund zu erledigen. Ein zweiter Prozess geht natürlich auch, aber da gestaltet sich die Interprozesskommunikation doch schon erheblich schwieriger. Ist der erste Prozess noch da? Kann er meine Nachricht empfangen oder ist er beschäftigt? Wie übermittele ich komplexe Daten? Bei einem Thread liegt alles im gleichen Prozessraum und ist einfach erreichbar. Und der "Auftraggeber" bestimmt wie was läuft. |
AW: String via Sendmessage unvollständig
Ich habe hier die Antworten, die mich sprachlos machten, entfernt.
Das Grundproblem ist ja, dass die Anwendung einfriert, wenn die Daten zu langsam kommen. Die fachlich gängige Lösung sind hier nunmal Threads. Zitat:
|
AW: String via Sendmessage unvollständig
Ernsthaft? So viele Antworten und noch keiner konnte eine richtige und klare Antwort auf das hier zustande bringen? :roll:
Das Problem ist, dass in XE6 (genauer: Ab Delphi 2009) die Chars in deinen Strings 2 Byte groß sind und DataStruct.cbData die Anzahl der zu sendenden Bytes möchte und nicht die Anzahl der Zeichen. Von daher:
Delphi-Quellcode:
DataStruct.cbData := Length(Edit1.Text)*SizeOf(Char);
Darum werden deine Strings auch ziemlich genau ab der Hälfte abgeschnitten. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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