Hallo,
Ich versuche grade meine erste
DLL-Datei zu schreiben =) klappt auch relativ gut... nur mit dem string hin-und hertauschen habe ich probleme. um von einer funktion eine rückgabe zu erhalten habe ich die als PChar definiert. jetzt kann es aber sein, da ich mit dateiinhalten und dateihashes arbeite dass irgendwo mitten in einem string ein nullbyte enthalten ist. wenn ich den jetzt mit PChar(s) in einen pchar umwandle um ihn als rückgabewert der funktion anzugeben wird der string ja abgeschnitten. deswegen hab ich mir gedacht ich geb einfach zusätzlich die länge des strings zurück bevor er in einen pchar umgewandelt wird und kann ja dann bestimmt irgendwie den speicherbereich der eigentlich für den pchar reserviert wurde im hauptprogramm wieder auslesen und in einen string umwandeln.
da hab ich mal bissle rumprobiert und bin auf folgendes gestoßen:
DLL-Datei:
Delphi-Quellcode:
function GetFileHash(pFileName: PChar; out pBuff: PChar): Integer; stdcall;
var
sHash: string;
begin
sHash := 'a'+#0+'b';
pBuff := PChar(sHash);
Result := Length(sHash);
end;
Hauptprogramm:
Delphi-Quellcode:
var
i: Integer;
s, s2: string;
p: pchar;
begin
i := DllGetFileHash('c:\CA.txt', p);
s := string(@p^);
showmessage(inttostr(length(p))); //1
showmessage(inttostr(length(s))); //3 (!)
s2 := '';
for i := 1 to Length(s) do
begin
s2 := s2 + IntToHex(Ord(s[i]), 2) + ' ';
end;
ShowMessage(s2); //61 00 62
was ich mich jetz frage ist warum funktioniert das?? und woher weis der delphi dass der speicherbereich von p 3 bytes groß sein sollte?
kann ich die funktion so verwenden oder könnte ich damit probleme bekommen? oder hat vielleicht irgendjemand eine bessere idee?
Vielen Dank!!