AGB  ·  Datenschutz  ·  Impressum  







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

Stringumwandlung

Ein Thema von Berni68 · begonnen am 3. Jan 2010 · letzter Beitrag vom 3. Jan 2010
Antwort Antwort
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#1

Stringumwandlung

  Alt 3. Jan 2010, 09:28
Hallo zusammen,

um Strings zwischen 2 Anwendungen auszutauschen verwende ich (Code aus der DP):
Sender:
WindowsNachrichtAn('Tx', 'x', '#TEXT#'); Empfänger:
Delphi-Quellcode:
procedure Tx.WMCopyData(var Msg:TWMCopyData) ;
var
  h: PChar;
begin
  h:= Msg.CopyDataStruct.lpData;
  Showmessage(h);
end;
wobei:
Delphi-Quellcode:
procedure WindowsNachrichtAn(Fensterklasse, Fenstername, Nachricht:string);
var
  CopyDataStruct: TCopyDataStruct;
  ReceiverHandle: THandle;
begin
  CopyDataStruct.dwData:= 0;
  CopyDataStruct.cbData:= 1 + Length(Nachricht);
  CopyDataStruct.lpData:= PChar(Nachricht);

// ReceiverHandle:= FindWindow(PChar(Fensterklasse),nil);
  ReceiverHandle:= FindWindow(PChar(Fensterklasse),PChar(Fenstername));
  if ReceiverHandle<>0 then begin
    SendMessage(ReceiverHandle, WM_COPYDATA, Longint(Handle), Longint(@copyDataStruct));
  end;
end;
Hat bisher unter XP und Delphi5 einwandfrei geklappt.

Mit Delphi10 und win7 erhalte ich für das Beispiel '#TEXT#'
im Showmessagefenster:
#TEX(viereck)(chinesisches Zeichen)
die Länge ist in Ordnung, nur die beiden letzten Zeichen kommen falsch an.

Weiss jemand woran das liegen könnte?
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: Stingumwandlung

  Alt 3. Jan 2010, 09:31
Nutze mal an Stelle von PChar, was wohl in D10 Unicode ist, PAnsiChar

PS.
Editiere mal den Beitragstitel: Stingumwandlung
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Stringumwandlung

  Alt 3. Jan 2010, 09:52
Wenn ich PAnsiChar verwende (CopyDataStruct.lpData:= PAnsiChar(Nachricht); und h: PAnsiChar
kommt nur noch '#' an.
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

Re: Stringumwandlung

  Alt 3. Jan 2010, 10:05
Jupp, D7 nutzt Ansi (AnsiString und PAnsiChar) und D2010 Unicode (UnicodeString und PWideChar)



Delphi-Quellcode:
procedure WindowsNachrichtAn(Fensterklasse, Fenstername, Nachricht: WideString);
var
  CopyDataStruct: TCopyDataStruct;
  ReceiverHandle: THandle;
begin
  CopyDataStruct.dwData:= 0;
  CopyDataStruct.cbData:= (Length(Nachricht) + 1) * 2;
  CopyDataStruct.lpData:= PWideChar(Nachricht);



PWideChar(Msg.CopyDataStruct.lpData)
oder
Delphi-Quellcode:
procedure WindowsNachrichtAn(Fensterklasse, Fenstername, Nachricht: AnsiString);
var
  CopyDataStruct: TCopyDataStruct;
  ReceiverHandle: THandle;
begin
  CopyDataStruct.dwData:= 0;
  CopyDataStruct.cbData:= Length(Nachricht) + 1;
  CopyDataStruct.lpData:= PAnsiChar(Nachricht);



PAnsiChar(Msg.CopyDataStruct.lpData)
aus genau diesem Grund nutzt man für programmexternen Datenaustausch und Datenspeicherung nur statische Typen ... kein Integer, Cardinal, String, PChar und wenn Records, dann nur packed.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Stringumwandlung

  Alt 3. Jan 2010, 10:55
Hallo, erst mal vielen Dank für die Anwort.
Allerdings versteh ich immer weniger:

Mit WideString funktioniert es fast, es kommen allerdings 2 Zeichen zuviel im Showmessagefenster.
Kurioserweise ändert sich nichts, wenn ich (Length(Nachricht) + 1 in (Length(Nachricht) ändere!???

Mit AnsiString funktioniert es fast nicht, es kommt lediglich 1 Zeichen an im Showmessagefenster.
Bernhard
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Stringumwandlung

  Alt 3. Jan 2010, 11:44
Diese Zeile hier ist nicht die beste Art:
CopyDataStruct.cbData:= (Length(Nachricht) + 1) * 2; Wenn man das "*2" fest rein schreibt ist es kein Wunder das man beim Wechsel zwischen Delphiversionen dann wieder Probleme bekommt. Richtiger wäre hier mit sizeof zu arbeiten.
CopyDataStruct.cbData:= (Length(Nachricht) + 1) * sizeof(Nachricht[1]); Und das "+1" würde ich weg lassen und stattdessen lieber die Länge mit verschicken und diese dann auch beim Auslesen mit beachten.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

Re: Stringumwandlung

  Alt 3. Jan 2010, 12:02
Zitat:
sizeof(Nachricht[1])
Hoffen wir mal das Nachricht nicht '' ist, sonst krachts.

Was auch noch zu beachten ist, dass Sender und Empfänger die gleiche String-Sprache sprechen. Denn wenn der Sender Unicode (2 Byte pro Zeichen) und der Empfänger ANSI (1 Byte pro Zeichen) spricht, dann können die beiden sich nicht unterhalten.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Stringumwandlung

  Alt 3. Jan 2010, 12:06
Zitat von jbg:
Zitat:
sizeof(Nachricht[1])
Hoffen wir mal das Nachricht nicht '' ist, sonst krachts.
Das sollte nicht so sein. Denn SizeOf wird bereits beim compilieren aufgelöst und nicht erst während der Laufzeit. Man könnte ebenso Nachricht[0] oder Nachricht[5000] nehmen. Ausschlaggebend ist hier einzig und Allein das der Typ zum Zeitpunkt des compilierens fest steht und somit kann die Größe korrekt ermittelt werden.
So kenne ich Beispiele bei denen die Größe eines Record-Members ermittelt werden soll wo keine Instanz des Records vorhanden ist. Dort wird dann einfach nil auf den pointertyp des Records gecastet, dereferenziert und dann die Größe des Members ermittelt. Dies ist gängige Praxis. (Im ersten Moment sieht dies Haarstreubend aus aber es gibt kaum eine bessere Möglichkeit)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#9

Re: Stringumwandlung

  Alt 3. Jan 2010, 12:47
Dann sollte man hier doch den Typen verwenden:

sizeOf(TChar)

und fertig.
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#10

Re: Stringumwandlung

  Alt 3. Jan 2010, 14:00
TChar? Dann sollte man aber auch den Typen nutzen, welcher für die Variable verwendet wurde.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 10:34 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