Einzelnen Beitrag anzeigen

Benutzerbild von edosoft
edosoft

Registriert seit: 27. Okt 2003
Ort: Wehingen
258 Beiträge
 
Turbo Delphi für Win32
 
#1

PChars mit Null Bytes von DLL zu Programm übergeben

  Alt 27. Mär 2008, 09:06
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!!
Dominik Weber
www.edo-soft.com
  Mit Zitat antworten Zitat