![]() |
pChar nach string konvertieren ?
Also, ich hab ein bissl gegoogelt, ein bissl Forumsuche gemacht, aber nix gefunden.
Alles dreht sich immer darum, einen string zu einem pchar zu machen. Die verschiedenen Methoden kenne ich jetzt. Aber wie geht es anders herum ? Hier ein paar verzweifelte Versuche:
Delphi-Quellcode:
var pstr: pchar;
sstr: shortstring; delphi_helper: Integer; str:string;
Delphi-Quellcode:
PS: str:=(string)pstr; bringt auch einen Absturz.
// str:=pstr; -> Absturz
// strcopy(str,pstr); -> incompatible types for delphi_helper:=1 to ord(pstr[0]) do //füllt meist nur das erste Element ?! sstr[delphi_helper]:=pstr[delphi_helper]; no:=; delete(sstr,pos('#',sstr),10000); //ab und an sieht mein string so aus: '123'#A#...#...#... str:=String(sstr); //währe ja sowieso zu einfach Der pchar kommt aus einer dll, zu der ich maximal die "Zugriffs"-Pascal-Datei ändern kann - habe dort aus pchar shortstring gemacht, kommt aber auch nur ein Absturz. |
Re: pChar nach string konvertieren ?
Du kannst nicht einfach die Deklaration der Funktionen ändern!
Eigentlich bist du schon ganz nahe dran. Anscheinend hast du aber noch den C-Cast-Style im Kopf. In Pascal musst du schreiben str := string(pstr); |
Re: pChar nach string konvertieren ?
Delphi-Quellcode:
so einfach :)
var
p: Pchar; s: String; begin p := 'test' s := p;
Delphi-Quellcode:
das bei der anzeige sollte richtig sein, denn '123' ist der string # ist der hexwert wenn ich mich jetzt nicht vertuhe. also in dem String selbst ist dann keine # sondern der ascii wert der hinter der # steht (#A = ascii(10))
delete(sstr,pos('#',sstr),10000); //ab und an sieht mein string so aus: '123'#A#...#...#...
|
Re: pChar nach string konvertieren ?
Delphi-Quellcode:
Mit DLL's musste da aufpassen, schick da nicht so viele Strings rum.
String(PChar)
PChar(String) |
Re: pChar nach string konvertieren ?
du musst dir immer bewusst machen das ein PChar nur ein Pointer-Typ ist.
Folgendes solltest du zum Beispiel daher nie machen:
Delphi-Quellcode:
denn zurück gegeben wird nur ein Pointer (PChar) auf meinString und meinString ist nach verlassen der Funktion nicht mehr gültig. PChar verhält sich also wie so ziemlich jeder andere Pointer und zeigt auf das erste Zeichen der Zeichenkette.
function Irgendwas(): PChar;
var meinString: String; meinPChar: PChar; begin meinString := 'Text'; meinPChar := PChar(meinString); result := meinPChar; end; |
Re: pChar nach string konvertieren ?
und noch ne Lösung:
Delphi-Quellcode:
var s: String; p: PChar; [...] StrPCopy(p, 'HALLO WELT'); // Schreibt 'Hallo Welt' in den PChar p s := StrPas(p); // Wandelt von Pchar nach String; |
Re: pChar nach string konvertieren ?
Zitat:
rollstuhlfahrer |
Re: pChar nach string konvertieren ?
Delphi-Quellcode:
wirft Adressverletzung; hatte ich schon oben
s:=p
Delphi-Quellcode:
auch
s := string(p);
Delphi-Quellcode:
hatte ich noch nich, geht aber auch nich.
s := StrPas(p);
Hier die Wete aus dem Debug Inspector: pstr: PAnsiChar $12F628 Wert 'wrong command' ich bin echt gleich am Ende.... |
Re: pChar nach string konvertieren ?
dann versuchs mal mit
Delphi-Quellcode:
rollstuhlfahrer
S := Copy(p, 1, maxInt);
|
Re: pChar nach string konvertieren ?
Zitat:
|
Re: pChar nach string konvertieren ?
Delphi-Quellcode:
und
StrPas(p)
Delphi-Quellcode:
sind genau dasselbe (StrPas macht intern auch nichts anderes als einen einfachen Cast auf String). Eigentlich braucht man gar keinen Cast, denn der Compiler erzeugt sowohl mit als auch ohne Cast genau denselben Code.
String(p)
Wenn das bei dir also nicht funktioniert muss es an was anderem liegen. Zeigt der Pointer überhaupt an die korrekte Adresse? Check das mal im Debugger... Prinzipiell zu Strings und PChars kann ich dir mein String-Tutorial empfehlen (wobei es da eigentlich hauptsächlich um die Umwandlung von String zu PChar geht). Gruß, Motzi |
Re: pChar nach string konvertieren ?
Die Adresse mit der du das versuchst liegt aufm Stack. Zeig mal den genauen Aufruf und den Funktionheader für den Aufruf in der dll.
|
Re: pChar nach string konvertieren ?
Danke für den Tipp, brechi !
Wie kann ich Delphi anweisen, den Wert in den Ram zu legen ? (wird wohl im ASM enden, oder? :gruebel: ) Hier der Header: procedure read(No: integer; var Buffer: PChar; var NoOfChars: integer); cdecl; [edit]Aufruf: Cell( StrToInt(Edit2.Text),pstr,no);[/edit] Die DLL wurde auch mit Delphi geschrieben, aber das hat vielleicht nix zu sagen @ rollstuhlfahrer: geht auch nicht... @ Nuclear-Ping: ich glaub dir schon, dass das klappt. Hilft aber nix, wenn Delphi hier anders kompiliert als gewünscht @ Motzi: s.o. "Hier die Wete aus dem Debug Inspector: pstr: PAnsiChar $12F628 Wert 'wrong command' " - oder meinst du was anderes ! |
Re: pChar nach string konvertieren ?
Hi,
ich gehe mal von {$H+} aus.
Delphi-Quellcode:
Du musst gar nichts machen, die CompilerMagic übernimmt in diese Richtung alles.
var
X: PChar; S: String; S := X; StrPas ist nicht dasselbe wie String(). StrPas wandelt einen PChar in eine ShortString (Pascal-String) um. String() - siehe oben. Explizite Typumwandlung - da es auch implizit geht, passiert letztendlich das gleiche wie ohne den Typecast. Rückgabe eines PChar von einer DLL am besten über
Delphi-Quellcode:
Das Speicherreservieren/Freigeben dem Aufrufer überlassen. Passt der String nicht, false zurückgeben, sonst true und in Rueckgabe kopieren (z. B. mit StrLCopy).
functionGibStringZurück(Rueckgabe: PChar; Laenge: Cardinal): Boolean; stdcall;
Mfg FAlter |
Re: pChar nach string konvertieren ?
FAlter, was willst du mir damit sagen ?
Dass jetzt ausschliesslich mein Delphi crap ist ? |
Re: pChar nach string konvertieren ?
Hi,
ich will sagen, dass du dich nicht um die Umwandlung kümmern musst. Da musst du gar nichts machen, eine einfache Zuweisung genügt. Wenn es zu einer AV kommt, dann zeigt der PChar wo falsch hin. Der Fehler liegt nicht an der Umwandlung, sondern schon vorher. Und beim Zugriffsversuch krachts dann. Bei einer AV sollte man sich nicht auf die Stelle, die der Debugger anzeigt, verlassen. Meist ist der eigentliche Fehler schon viel früher. Wo bekommst du denn den PChar her? Ich meine, DLL ist klar. Falls der Fehler nicht in der DLL liegt, findest du ihn aber in deinem Code, also zeig mal den Funktionsaufruf und was danach passiert bis du versuchst, auf den PChar zuzugreifen. Mfg FAlter |
Re: pChar nach string konvertieren ?
Aber wieso zeigt der Pointer auf ne falsche Adresse, wenn der Wert in der Adresse stimmt ?
Funktionsaufruf & Header-DLL stehen oben |
Re: pChar nach string konvertieren ?
Hi,
meinst du vielleicht das: Zitat:
Delphi-Quellcode:
Mfg
SetLength(S, no);
Move(pstr^, S[1], no); FAlter |
Re: pChar nach string konvertieren ?
@Falter: aus der Unit SysUtils
Delphi-Quellcode:
StrPas wandelt den PChar also in einen normalen String und keinen ShortString.
function StrPas(const Str: PChar): string;
begin Result := Str; end; Ich empfehle außerdem die Verwendung von SetString statt SetLength + Move. |
Re: pChar nach string konvertieren ?
Zitat:
Gruß Gammtester |
Re: pChar nach string konvertieren ?
Hi,
bei älteren Delphi-Versionen ging StrPas jedenfalls mit ShortString, und direktzuweisung funktionierte bei ebendiesen nicht, nur bei AnsiStrings. Oder jedenfalls musste man sie bei ShortStrings verwenden. Bei anderen erübrigt sich das, denn wozu denn noch die Ticks für den Call verschwenden? Dann lieber gleich selbst zuweisen. SetString kannte ich noch gar nicht. Dann eben:
Delphi-Quellcode:
Mfg
SetString(S, pstr, no);
FAlter |
Re: pChar nach string konvertieren ?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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