AGB  ·  Datenschutz  ·  Impressum  







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

pChar nach string konvertieren ?

Ein Thema von Andy386 · begonnen am 15. Mai 2008 · letzter Beitrag vom 16. Mai 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#11

Re: pChar nach string konvertieren ?

  Alt 15. Mai 2008, 18:23
StrPas(p) und String(p) 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.
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
Manuel Pöter
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#12

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 08:14
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.
  Mit Zitat antworten Zitat
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#13

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 10:17
Danke für den Tipp, brechi !
Wie kann ich Delphi anweisen, den Wert in den Ram zu legen ?
(wird wohl im ASM enden, oder? )

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 !
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#14

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 10:33
Hi,

ich gehe mal von {$H+} aus.

Delphi-Quellcode:
var
  X: PChar;
  S: String;

S := X;
Du musst gar nichts machen, die CompilerMagic übernimmt in diese Richtung alles.

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

functionGibStringZurück(Rueckgabe: PChar; Laenge: Cardinal): Boolean; stdcall; Das Speicherreservieren/Freigeben dem Aufrufer überlassen. Passt der String nicht, false zurückgeben, sonst true und in Rueckgabe kopieren (z. B. mit StrLCopy).

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#15

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:00
FAlter, was willst du mir damit sagen ?
Dass jetzt ausschliesslich mein Delphi crap ist ?
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:18
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
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Andy386

Registriert seit: 26. Mär 2008
55 Beiträge
 
#17

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:30
Aber wieso zeigt der Pointer auf ne falsche Adresse, wenn der Wert in der Adresse stimmt ?

Funktionsaufruf & Header-DLL stehen oben
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#18

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:38
Hi,

meinst du vielleicht das:

Zitat:
procedure read(No: integer; var Buffer: PChar; var NoOfChars: integer); cdecl;
[edit]Aufruf: Cell( StrToInt(Edit2.Text),pstr,no);[/edit]
Anhand der Parameter schätz ich mal, dass es ein etwas ungewöhnlicher PChar ist. Dieser ist nicht nullterminiert, sondern in einem Extraparameter (NoOfChars) wird die Anzahl der Zeichen übergeben. Somit suchen sämtliche Delphi-Funktionen vergeblich nach #0 und greifen einfach munter weiter auf das, was danach kommt, und da gibts ne AV.

Delphi-Quellcode:
SetLength(S, no);
Move(pstr^, S[1], no);
Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#19

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:45
@Falter: aus der Unit SysUtils
Delphi-Quellcode:
function StrPas(const Str: PChar): string;
begin
  Result := Str;
end;
StrPas wandelt den PChar also in einen normalen String und keinen ShortString.

Ich empfehle außerdem die Verwendung von SetString statt SetLength + Move.
Manuel Pöter
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#20

Re: pChar nach string konvertieren ?

  Alt 16. Mai 2008, 11:50
Zitat von FAlter:
Hi,

meinst du vielleicht das:

Zitat:
procedure read(No: integer; var Buffer: PChar; var NoOfChars: integer); cdecl;
[edit]Aufruf: Cell( StrToInt(Edit2.Text),pstr,no);[/edit]
Anhand der Parameter schätz ich mal, dass es ein etwas ungewöhnlicher PChar ist ...
Außerdem würde man erwarten, daß da Buffer: PChar; steht ohne var. Bei der aktuellen Deklaration müßte procedure read einen pointer auf einen pointer verarbeiten.

Gruß Gammtester
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 09:25 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