Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi PChar schneidet letztes Zeichen ab (https://www.delphipraxis.net/78531-pchar-schneidet-letztes-zeichen-ab.html)

mkinzler 6. Okt 2006 16:07

Re: PChar schneidet letztes Zeichen ab
 
Zitat:

Delphi-Quellcode:
ShowMessage(PChar(GetInstallDir));

Ist doch schon PChar?

Muetze1 6. Okt 2006 16:08

Re: PChar schneidet letztes Zeichen ab
 
Du konvertierst den String temporär zu einem PChar und gibst ihn per Result zurück. Problem dabei ist, dass die Typkonvertierung nur temporär ist und nach verlassen der Funktion ist der Speicher wo der PChar angelegt wurde ungültig. Daher ist es kein Wunder, dass die Daten nicht mehr stimmen. Es ist eher erstaunlich das der PChar soweit noch lesbare Zeichen enthält.

Ich empfehle dir eine andere Art der Stringübergabe: Besorg dir Speicher für den PChar im Hauptprogramm und übergebe diesen samt der Angabe der Länge an die DLL Funktion, welche den Buffer befüllt, wenn er genügend Platz bietet.

Beispiel dazu:
Delphi-Quellcode:
  // Hauptprogramm:
Procedure xy;
Var
  lString: String;
Begin
  SetLength(lString, 2048);
  SetLength(lString, DeineDLLFunc(PChar(lString), 2048));
  ShowMessage(lString);
End;


  // DLL
Function DeineDLLFunc(ABuffer: PChar; Const ABufferLen: Integer): Integer;
Var
  lStr: String;
Begin
  Result := 0;
 
  lStr := Reg.ReadString('whatever');

  If ( ABufferLen > Length(lStr) ) Then // > weil wegen #0 !
  Begin
    StrPCopy(ABuffer, lStr);
    Result := Length(lStr);
  End;
End;
/EDIT: Super - da tippt man die ganze Zeit und zwischenzeitlich wird das gleiche getippelt... Ich hasse umsonst arbeiten...

TheMiller 6. Okt 2006 16:11

Re: PChar schneidet letztes Zeichen ab
 
Hm,

wie soll ich ihn den sonst zurückgeben als per result.

@Luckie: Den Wert habe ich per Hand angelegt. Neuer Schlüssel -> REG-SZ und dann den Pfad eingetragen, aber KEIN abschließendes Leerzeichen. Muss ja auch nicht, oder?

mkinzler 6. Okt 2006 16:13

Re: PChar schneidet letztes Zeichen ab
 
Zitat:

wie soll ich ihn den sonst zurückgeben als per result.
Versuch den Wert mal zwischenzuspeichern bevor du ihn zurückgibst.

Luckie 6. Okt 2006 16:14

Re: PChar schneidet letztes Zeichen ab
 
Siehe mein Edit. Ist auch die Lösung zur Anmerkung von Muetze1.

TheMiller 6. Okt 2006 16:16

Re: PChar schneidet letztes Zeichen ab
 
Hm...

Aber bei ALLEN anderen Werten und sonstigen Strings funktioniert es und hat immer funktioniert... Deine Methode mag richtig und professionell sein - das kann ich jetzt nicht beurteilen - aber das sieht mir nach mehr Aufwand aus, als durch eine DLL gespart werden sollte...

ACHSO: Und Muetze1, umsonst war es nicht. Ist auch sehr gut erklärt. Ich denke, ich teste das mal...

Luckie 6. Okt 2006 16:19

Re: PChar schneidet letztes Zeichen ab
 
Bei deinem Glück solltest du in Erwägung ziehen Lotto zu spielen. Würde sich eventuell lohnen. ;)

Tatsache ist eben, wie schon gesagt wurde, dass es eher verwunderlich ist, dass du überhaupt etwas zurückbekommst. Ob es den Aufwand nun trechtfertigt oder nicht, musst du entscheiden.

Muetze1 6. Okt 2006 16:20

Re: PChar schneidet letztes Zeichen ab
 
Zitat:

Zitat von DJ-SPM
Aber bei ALLEN anderen Werten und sonstigen Strings funktioniert es und hat immer funktioniert... Deine Methode mag richtig und professionell sein - das kann ich jetzt nicht beurteilen - aber das sieht mir nach mehr Aufwand aus, als durch eine DLL gespart werden sollte...

Dann hast du bei ALLEN anderen Funktionen mit einem PChar als Rückgabewert reines Glück, dass der Stack/Heap soweit nicht verändert wurde. Du programmierst jetzt einfach nur nach Zufall - somit: es mag auf x % Rechnern/Konstellationen klappen und bei 100 - x % Rechner im Gegensatz nicht. Auch ist die Suche nach komischen Variablen immer recht (wahn)witzig, vor allem wenn man schon weiss, wo dran es liegt...

/EDIT: Ok, wieder umsonst. Roter Kasten im Urlaub?

TheMiller 6. Okt 2006 16:21

Re: PChar schneidet letztes Zeichen ab
 
Ja das macht es allemahl. Mit dem Lotto kann ich mir auch nochmal überlegen. Können ja, wie der Raab eine Tippgemeinschaft für die 29 Millionen aufmachen!

Ok, ich werde das mit dem Buffer so machen. Ist es auch ok, dass ich einen Buffer von 2048 für meinen String reserviere - oder ist das zu viel?

Luckie 6. Okt 2006 16:22

Re: PChar schneidet letztes Zeichen ab
 
Bau die Funktion so um, dass sie dir sagt, wie viel Speicher sie braucht. Ist, meiner Merinung nach, die sauberste Lösung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:11 Uhr.
Seite 2 von 3     12 3      

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 by Thomas Breitkreuz