AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi String via Sendmessage unvollständig
Thema durchsuchen
Ansicht
Themen-Optionen

String via Sendmessage unvollständig

Ein Thema von Ajintaro · begonnen am 7. Okt 2015 · letzter Beitrag vom 19. Okt 2015
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Ajintaro
Ajintaro

Registriert seit: 20. Okt 2004
Ort: Sankt Augustin
138 Beiträge
 
Delphi XE6 Starter
 
#1

String via Sendmessage unvollständig

  Alt 7. Okt 2015, 18:25
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
  1. über meine Hauptanwendung bei Bedarf gestartet wird und
  2. via Sendmessage mit der Hauptanwendung kommuniziert

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:
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;
Empfänger Code:
Delphi-Quellcode:
    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;
Leider sind die Ergebnisse alle unvollständig und es gibt unterschiedliche String-Längen. Hier ein paar Beispiele:
String 1234567890 wird zu 123456
String Edit1 wird zu Edi
String www.test.de wird zu www.te
String Delphipraxis wird zu Delphip

Habt ihr eine Ahnung warum das so ist?
Jaimy
DAoC 2.0 -> Camelot Unchained !
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: String via Sendmessage unvollständig

  Alt 7. Okt 2015, 18:34
The SendMessage returns an integer value assigned by the code that handled the WM_CopyData message.
http://delphi.about.com/od/windowssh...m_copydata.htm

Ausserdem: PChar: PANSICHAR, PWIDECHAR...???

Info:
http://michael-puff.de/Programmierun...COPYDATA.shtml

Geändert von hathor ( 7. Okt 2015 um 18:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: String via Sendmessage unvollständig

  Alt 7. Okt 2015, 18:40
Probiert mal statt
Code:
  DataStruct.cbData := length(Edit1.Text)+1;
Code:
  DataStruct.cbData := SizeOf(Edit1.Text)+1;
Oder schau mal Hier
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: String via Sendmessage unvollständig

  Alt 7. Okt 2015, 18:40
Ich habe schon mal keine Ahnung, warum du das in einer Sekundäranwendung auslagerst.

TIdAntiFreeze ist Kindergarten. Dort wird nur ein Application.ProcessMessages ausgeführt, wenn ein Datenblock übertragen wurde. Darum verschlechtert sich auch das Verhalten bei einer langsamen Leitung.

Lagere den Versand in einen Thread aus und alles wird schön.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
r.koch
(Gast)

n/a Beiträge
 
#5

AW: String via Sendmessage unvollständig

  Alt 7. Okt 2015, 21:56
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?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: String via Sendmessage unvollständig

  Alt 7. Okt 2015, 22:13
Welchen Vorteil hätte eigentlich ein Hauptprogramm mit zusätzlichem Thread, wenn der Thread abschmiert gegenüber zwei Programmen, die miteinander kommunizieren?
Ähm, wir sprechen hier von einem simplen HTTP-Request der in einem Thread ausgeführt werden sollte. Was soll dir denn da um die Ohren fliegen?

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 ...

(*) Um diesen Reset-Taster per Netzwerk anzusprechen, reicht ein simpler HTTP-Request aus ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 7. Okt 2015 um 22:15 Uhr)
  Mit Zitat antworten Zitat
Alt 7. Okt 2015, 22:41     Erstellt von r.koch
Dieser Beitrag wurde von Daniel gelöscht.
Alt 7. Okt 2015, 23:31     Erstellt von hathor
Dieser Beitrag wurde von Daniel gelöscht.
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: String via Sendmessage unvollständig

  Alt 8. Okt 2015, 00:06
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alt 8. Okt 2015, 00:23     Erstellt von r.koch
Dieser Beitrag wurde von Daniel gelöscht.
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: String via Sendmessage unvollständig

  Alt 8. Okt 2015, 01:48
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: String via Sendmessage unvollständig

  Alt 8. Okt 2015, 07:18
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:
Aber er überfordert sehr oft meinen Pascal-Horizont mit seinen aktuellen XE/Seatle Vereinfachungen.
Das ist in Ordnung, wir haben diese Plattform, um voneinander und miteinander etwas lernen zu können. Wenn man eine Lösung nicht versteht, sollte man nachfragen und nicht schimpfen.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: String via Sendmessage unvollständig

  Alt 8. Okt 2015, 08:54
Ernsthaft? So viele Antworten und noch keiner konnte eine richtige und klare Antwort auf das hier zustande bringen?

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:
DataStruct.cbData := Length(Edit1.Text)*SizeOf(Char);
Darum werden deine Strings auch ziemlich genau ab der Hälfte abgeschnitten.

Probiert mal statt
Code:
  DataStruct.cbData := length(Edit1.Text)+1;
Code:
  DataStruct.cbData := SizeOf(Edit1.Text)+1;
SizeOf(Edit1.Text) gibt immer SizeOf(String) = SizeOf(Pointer) zurück. Also 4 in 32-Bit und 8 in 64-Bit Anwendungen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 8. Okt 2015 um 08:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 22:46 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