Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar Problem (https://www.delphipraxis.net/131300-pchar-problem.html)

WorstNightmare 22. Mär 2009 19:52


PChar Problem
 
Hi,
ich habe mal wieder ein Problem mit Pointern :wall:

In eine Funktion werden mehrere string Parameter übergeben, wovon einer dann zu einem PChar umgewandelt werden muss.
Die Funktion sieht in etwa so aus:
Delphi-Quellcode:
function Test(const proc: Pointer; const a, b, c, s: string): einRecord;
var
  PS: PChar;
begin
  if s <> '' then
    PS := PChar(s)
  else
    PS := nil;

  Showmessage(IntToStr(Length(PS)));
end;
Das ganze spielt sich in einer DLL ab, diese Funktion wird jedoch nur intern verwendet. Nun ist mein Problem, dass die Länge immer 0 ist (obwohl sie in Wahrheit 49 oder so ist), wenn s Binary-Material enthält, welches am Anfang 5x #0 hat. Liegt das daran, dass die mit #0 abgeschlossen werden?

[edit=mkinzler]Code-Tag durch Delphi-Tag ersetzt Mfg, mkinzler[/edit]

Satty67 22. Mär 2009 20:05

Re: PChar Problem
 
Bei mir funktionierts... bei mir ist String aber auch noch ein AnsiString und bei Dir Unicode.

Vielleicht ist es OK, in der Funktion AnsiString statt String zu verwenden?

jbg 22. Mär 2009 21:32

Re: PChar Problem
 
Zitat:

Zitat von WorstNightmare
Length(PS)

Da solltest du besser gleich StrLen(PS) benutzen, denn so macht der Compiler aus PS wieder einen String (bis zum erst #0) und ruft dann die Length() Funktion auf.


Zitat:

wenn s Binary-Material enthält, welches am Anfang 5x #0 hat. Liegt das daran, dass die mit #0 abgeschlossen werden?
Ja, ein Nullterminierter String (aka PChar) endent nun mal an #0.

Satty67 22. Mär 2009 21:36

Re: PChar Problem
 
Ok, dann vergiss meinen Vorschlag. Ich hatte dem letzten Satz zu wenig Beachtung geschenkt :cry:

quendolineDD 23. Mär 2009 14:48

Re: PChar Problem
 
#0#0 ist das Ende eines Strings

WorstNightmare 23. Mär 2009 14:52

Re: PChar Problem
 
Hm, ok. Kann man das denn irgendwie ohne hässliche Workarounds (z.B. "n#0" dahin zu schreiben und es dann im Hauptprogramm ersetzen zu lassen) lösen? Ich kann leider keinen anderen Typen benutzen, weil der PChar dann einer Methode, die nach außen geht, übergeben wird, und ein ShortString wäre zu kurz. :x

quendolineDD 23. Mär 2009 15:28

Re: PChar Problem
 
Array of Byte?

WorstNightmare 23. Mär 2009 16:19

Re: PChar Problem
 
Hm, ok, dann muss ich das System etwas umstellen, was aber kein Problem sein sollte. Ist in Delphi zufällig eine Methode integriert mit der ich einen string in ein AOB umwandeln kann oder muss ich mir das selber schreiben?

quendolineDD 23. Mär 2009 17:05

Re: PChar Problem
 
Wie wärs damit?
Delphi-Quellcode:
type
  TDynByteArr = Array of Byte;

function TryByteArrayToString(const bArr: TDynByteArr;
  var Str: String): Boolean;
var
  i : Integer;
begin
  Result := (sizeof(bArr) <> 0) or false;
  if Result then
  begin
    SetLength(Str, High(bArr)+2);
    for i := 0 to High(bArr) do
      try
        Str[i+1] := chr(bArr[i]);
      except
        Result := false;
      end;
  end;
end;

function TryStringToByteArray(const Str: String;
  var bArr: TDynByteArr): Boolean;
var
  i : Integer;
begin
  Result := (Str <> '') or false;
  if Result then
  begin
    SetLength(bArr, sizeof(Str));
    for i := 1 to sizeof(Str) do
      try
        bArr[i-1] := ord(Str[i]);
      except
        Result := false;
      end;
  end;
end;
Dürfte eigentlich alles einwandfrei funktionieren. Wenn du Array of Bytes verwendest musst du beim Funktionsaufruf erst zu TDynByteArray casten.

WorstNightmare 23. Mär 2009 17:32

Re: PChar Problem
 
Okay, danke für deine Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 Uhr.
Seite 1 von 2  1 2      

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