Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StrPCopy() funktioniert nicht (https://www.delphipraxis.net/81552-strpcopy-funktioniert-nicht.html)

Moony 29. Nov 2006 11:24


StrPCopy() funktioniert nicht
 
Hallo zusammen,

leider finde ich keine Lösung, warm die Funktion "StrPCopy" nicht funktioniert.

Ich versuche von einem String den Inhalt ins PChar zu laden:

Delphi-Quellcode:
  ...

  Mem   := TFileStream.Create(Filename, fmOpenRead);
  Data  := StrAlloc(Mem.Size + 1);
  ZeroMemory(Data, Mem.Size);

  try
    i := 0;
    while Mem.Position < Mem.Size do
    begin
      Mem.Read(Buf, 1);
      S := S + Chr(Buf);
      Data[i] := Chr(Buf);
      Inc(i);
    end;

    StrPCopy(Data, S);

    ...
  finally
    StrDispose(Data);
    Mem.Free;
  end;
Bei der StrPCopy-Funktion wird der Inhalt von dem String einfach nicht in das PChar kopiert!
Ich hoffe hier weiß jemand eine Lösung.

Gruß, Moony

marabu 29. Nov 2006 14:38

Re: StrPCopy() funktioniert nicht
 
Hi,

also bei mir wird kopiert:

Delphi-Quellcode:
var
  data: PChar;
  s: String;
begin
  data := StrAlloc(6);
  ZeroMemory(data, 6);
  s := 'Hallo';
  StrPCopy(data, s);
  ShowMessage(String(data));
  StrDispose(data);
end;
Allerdings brauchst du diesen Aufruf von StrPCopy() aus verschiedenen Gründen nicht: In deinem Code hast du Data[] schon innerhalb der Schleife befüllt und die Routinen um StrPCopy() sind auch nur noch aus Gründen der Abwärtskompatibilität vorhanden, da Borland AnsiStrings intern eh als PChar verwaltet. Da würde die Zuweisung s := data völlig ausreichen.

Grüße vom marabu

turboPASCAL 29. Nov 2006 14:40

Re: StrPCopy() funktioniert nicht
 
Delphi-Quellcode:
while Mem.Position < Mem.Size do
    begin
      Mem.Read(Buf, 1);
      S := S + Chr(Buf);  // <---<<<
      Data[i] := Chr(Buf); // <---<<<
      Inc(i);             // <---<<<
    end;

    StrPCopy(Data, S);
Äh, versteh ich jetzt auch nicht so recht.

Delphi-Quellcode:
    GetMem(Data, Mem.Size +1);

    Mem.Seek(soFromBeginning, 0); // ggf. Reset zu Pos 0 im File

    while Mem.Position < Mem.Size do
    begin
      Mem.Read(Buf, 1);
      S := S + Chr(Buf);
    end;

    StrCopy(Data, PChar(S)); // bzw. StrPCopy() oder MyPChar := @S[1];

    FreeMem(Data);
Was ist denn Buf, ein Byte ? Und muss es PChar sein ?

Sollte es doch tun, oder ? :gruebel:

Moony 30. Nov 2006 10:41

Re: StrPCopy() funktioniert nicht
 
Also,

@marubu:
Das Data wird in der SChleife deshalb schon gefüllt, weil ich nicht weiß mit welchem Inhalt die Variable gefüllt wird. Anschließend überprüfe ich mit Hilfe einer Boolean-Variable was zu tun ist. und da muß ich eben bei einem bstimmten Fall die Daten aus s so wie Sie sind in das PChar bekommen, eben in HEX-Form.

@turboPASCAL:
Buf ist ein Byte. Es wird eben nicht kopiert. Dort sind die Daten enthalten, welche ursprünglich in der Schleife gefüllt wurden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:13 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