AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Strings und Ansistrings, Nullterminiert?
Thema durchsuchen
Ansicht
Themen-Optionen

Strings und Ansistrings, Nullterminiert?

Ein Thema von SyntaxXx · begonnen am 24. Feb 2012 · letzter Beitrag vom 25. Feb 2012
Antwort Antwort
Seite 1 von 3  1 23      
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 19:30
Guten Abend zusammen,
ich bin gerade dabei, ein kleines Tool zu schreiben.

Jetzt habe ich folgendes Probblem.

Ich habe Tool A, in das ich einen Text eingebe.
Dieser Text wird gespeichert.
Tool B soll diesen Text nun wieder auslesen.

Problem an der Sache ist, dass ich hierbei die Windos API benutze.
Und jetzt habe ich ein Problem.

Wenn ich den Text als "Delphi"-String speicher, und dann auslese, bekomme ich eine ganz wirre Zeichenfolge angezeigt.
Jetzt habe ich mich schlau gemacht und herrausgefunden, dass Delphi Stings nicht das selbe sind wie String von Windows.
Weil dort irgendwie die Nulltermienierung fehlt.

Ok dachte ich mir, dann arbeite ich halt mit Ansistrings. Dort sind die Strings ja nullterminiert.
Doch das hat nichts verändert. Immernoch die komische Zeichenkette.

Dann habe ich aber einen Tipp gelesen, dass man einfach an den Text ein #0 anhängen soll, um so die Nullterminierung manuell zu setzen.
Das habe ich gemacht und siehe da, es hat funktioniert.

Doch jetzt frage ich mich, warum das so geht, aber nicht mit Ansstrings?
Der Text wurde bei beiden Versuchen in einem Editfeld eingegeben.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 19:59
Welche Windows-API? in was sind beide Programme geschrieben? Wie schaut ein Beispiel mit "Komischen" Zeichen aus (Text Ursprung <-> Text komisch).
Hätte da schon eine Idee was du falsch machst.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 20:11
1. Also Programmiert in Delphi.
2. UpdateResource etc. wird benutzt.

3.1 Eingangstext = Test
3.2 Ausgangstext = http://i40.tinypic.com/a0lam8.png
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 20:20
Ja, Delphi-Strings sind Nullterminiert, als Kompatibilität zum PChar, obwohl sie selber allerdingt ein Längenbyte (Integer) besitzen.

Castet man einen String nach PChar, AnsiString nach PAnsiChar oder UnicodeString/WideString nach PWideChar, greift die Compilermagic, welche die Referenzzählung der Delphi-Strings beachtet und zusätzlich noch den Leer-String besonders behandelt.


Und ab Delphi 2009 mußt du mit Unicode aufpassen.
PS: Rate mal, warum man im Forenprofil angeben kann, was man nutzt?


In Deinem Fall hast du den AnsiString wohl radikal nach PWideChar gecastet ... das macht man nicht.
Oder du hast dich verpointert und statt den Textdaten einen Zeiger auf die Variable ... das ist auch falsch,

Und da du nicht verrätst, wie dein Code aussieht, wird dir auch keiner helfen können.
$2B or not $2B
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 20:25
Ganz einfach.
Windows verwendet PChar.
PChar ist ein Pointer(Adresse) zum Anfang des Textes, aber nicht wo er aufhört.
Jedoch kannst du mit einem #0 am Ende des Textes, bevor du ihn an die API übergibst, sagen dort hört der Text auf.
Delphi-Strings können solche #0 (Nullterminiert) Zeichen anzeigen, bzw. speichern, PChar kann dies nicht, wenn er ein #0 erkennt, beendet er den Text.

Also in etwa so:
Delphi-Quellcode:
var S : String;
begin
S := 'Hallo' + #0; //Diesen String als PChar gecastet übergeben.
end;
Das Gleiche gilt für AnsiStrings, jedoch vorsicht. Caste nicht einen String(Unicode) zu PAnsiChar.
Das würde auch komishce Zeichen ergeben. Oder umgekehrt.

P.S. : Verdammt war jemand schneller
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#6

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 20:33
Sorry, meine vorherige Antwort sollte garnicht so "böse" rüberkommen wie es jetzt aussieht xD.

Jop Forumprofil wird geupdated.
Also ich benutze Delphi RAD Studio XE.

Also wie ich schon ansprach, muss ich einen String in einen AnsiString umwandeln.
Dachte es reicht, wenn ich einfach
Code:
Text := AnsiString(Edit1.Text);
schreibe.

Denn das habe ich versucht aber es geht nicht.
Das ich den Pointer falsch gesetzt habe schließe ich mal aus, da ja wie gesagt alles wunderbar funktioniert, wenn ich folgendes schreibe:

Code:
Text := Edit1.Text + #0;


Hier also mein Code mit UpdateResource:

Code:
function AddString(text,delimiter : string) : Boolean;
var
  hUpdateRes : THandle;
  lpResLock : ^string;

begin

  lpResLock := @text;

  hUpdateRes := BeginUpdateResource('Ausgabe.exe', False);
  if hUpdateRes = 0 then
  showmessage('Could not open file');

  result := UpdateResource(hUpdateRes, RT_String, PChar(delimiter), 0, PChar(text), succ(length(text))*sizeof(char));
  EndUpdateResource(hUpdateRes, false);

end;

Und hier mein Ausruf:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
    AddString(DoXOr(AnsiString(Edit1.Text), 1000), 'TEXT1');
end;
DoXOr ist einfach nur eine kleine XOr verschlüsselung.


Wie gesagt, wenn ich die Funktion so aufrufe funktioniert es wunderbar:

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
    AddString(DoXOr(Edit1.Text + #0), 1000), 'TEXT1');
end;


Edit:
Aber ich habe doch einen String, den ich in einen AnsiString wandeln muss.

Code:
AddString(DoXOr(AnsiString(Edit1.Text), 1000), 'TEXT1');
funktioniert also nicht so einfach ?



PS: Was heißt gecastet? xD Konvertiert?
  Mit Zitat antworten Zitat
NickelM

Registriert seit: 22. Jul 2007
Ort: Carlsberg
445 Beiträge
 
Delphi 2009 Professional
 
#7

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 20:51
Verlangt DoXOr eine AnsiString oder String?
Hört sich so an, als würde DoXOr den String/AnsiString zu PChar/PAnsiChar casten (umwandeln).
Ab Delphi 2009 glaub ich, sind Strings Unicode d.h. 1 Zeichen = 2 Bytes.
1 AnsiZeichen = 1 Byte. Du kannst String einfach zu AnsiString casten, da Delphi die konvertieren von Unicode zu ANSI alleine macht.
Wenn du mit PAnsiChar und PChar arbeitest, musst du darauf achten den Text in den richtigen String zucasten. PChar = String, PAnsiChar = AnsiString.
Falls du einer String-Variable einen AnsiString zuweist, macht Delphi es auch von alleine.

Beim übergeben an eine API, musst entweder so:
Delphi-Quellcode:
var Text : PChar;
    AText : AnsiString;
begin
Text := PChar(String(AText));
end;
oder die APIs mit dem A am Ende nehmen, mit dennen kannst du AnsiString direkt senden.
z.b. SendMessageA;

Das würde es so gehen:
Delphi-Quellcode:
var Text : PAnsiChar;
    AText : AnsiString;
begin
Text := PAnsiChar(AText);
end;
EDIT: Succ brauchst du nicht.
Delphi-Quellcode:
  
result := UpdateResource(hUpdateRes, RT_String, PChar(delimiter), 0, PChar(text), succ(length(text))*sizeof(char));
Nickel
"Lebe und denke nicht an morgen"
Zitat aus dem gleichnamigen Bollywoodfilm.

Geändert von NickelM (24. Feb 2012 um 20:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 21:00
@NickelM: Wie gesagt, Delphi-String enthält schon eine #0 am Ende. Zusätzlich zum enthaltenen Text liegt diese hinter dem letzen Zeichen.

Ausnahme ist nur der Delphi-Referenz durchsuchenShortString / String[x].
WideString ist kein Delphi-String. Da drin ist ein OLE-String der WinAPI gekapselt.
$2B or not $2B
  Mit Zitat antworten Zitat
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#9

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 21:13
Ich danke euch schonmal für die ganzen Antworten, aber irgendwie hilft mir das nicht wirklich.

Der Erste sagt:
Zitat:
Delphi-String enthält schon eine #0 am Ende
Der Andere sagt :
Zitat:
Du kannst String einfach zu AnsiString casten, da Delphi die konvertieren von Unicode zu ANSI alleine macht.
Was denn nun? xD
Wie gesagt, ich hab Edit1.Text ja zu nem AnsiString umgewandelt, was aber nicht geholfen hat.

Oder soll ich statt AnsiString, PChar benutzen?

Ich hab das Gefühl wir drehen uns im Kreis.
Ihr wisst woran es liegt und helft mir schon und dafür bin ich sehr dankbar. Aber irgendwie kommt es mir so vor, als wenn mir das alles noch nicht weiter hilft

Sorry für meine Unwissenheit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Strings und Ansistrings, Nullterminiert?

  Alt 24. Feb 2012, 21:32
String-Resourcen sind schon immer Unicode (seit WinNT) und nun rate mal, in welchem Format du den "Text" an UpdateResource übergeben mußt.
$2B or not $2B
  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 23:01 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