Hallo,
ich habe da ein Problem mit der Übergabe meiner Liste an das Objekt TStringList. In der Hauptanwendung wird ein Modul(.DLL) aufgerufen. An die
DLL übergebe ich folgende Liste über PChar:
Code:
p := StrAlloc(2048); // p ist vom Typ PChar
s1 := TStringList.Create;
s1.Add('Melanie Mustermann');
s1.Add(#0 + '123' + #0 + '4567');
s1.Add('Das ist ein Test');
s1.Add(#0 + '123' + #0 + '4567');
s1.Add('123');
// die Länge der Liste
Len := Length(s1.CommaText); // Len ist vom Typ integer
// hier werden alle Zeichen einzeln, wegen #0 an p übergeben
for i := 1 to Len do
p[i] := s1.CommaText[i];
DLLAufruf(p, Len);
In der
DLL werden die Werte und die Länge richtig übergeben. Wenn ich aber meine übergebene Liste an eine StringListe übergebe, habe ich nur den ersten Eintrag "Melanie Mustermann" und der Rest wird nicht in die Liste reingeschrieben wegen dem Zeichen #0.
Code:
procedure MachWas(Liste: PChar; Len: integer);
var
s: string;
i: integer;
begin
SetLength(s, Len);
for i := 1 to Len do
s[i] := p[i];
s2.CommaText := s; // nach der Übergabe ist die Liste nicht komplett, s hat allerdings den richtigen Inhalt
Habe dann in die Delphi
Unit Classes nachgeguckt und tatsächlich filtert die Funktion intern alle Einträge bis Zeichen #0. Die nachfolgende Zeichen werden nicht übergeben.
Ist das jetzt ein BUG bei Delphi oder mache ich irgendwo einen Fehler. Den ein String funktioniert meiner Meinung anders als ein nullterminiertes PChar. Ein Strigng kann auch chars mit dem
Ascii Zeichen #0 annehmen.
Kann man das Objekt irgendwie austricksen ohne in die Classes
Unit zu verändern?
P.S. arbeite mit Delphi 7 Pro.
Bin für jede Antwort dankbar.
Gruß