Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: PChars mit Null Bytes von DLL zu Programm übergeben

  Alt 27. Mär 2008, 09:18
du solltest deine Funktion so gestalten das sie dir die benötigte Länge zurück gibt und das Ergebnis in den übergebenen Speicher kopiert.

ablauf wäre dann folgender (in Anwendung):
- Gib mir benötigte Länge
- größe der Variablen auf benötigten Speicher setzen
- Funktion nochmal aufrufen und benötigten Speicher übergeben

Delphi-Quellcode:
//**** DLL ******
function GetFileHash(pFileName: PChar; pBuf: Pointer; iBuflen: Integer): Integer; stdcall;
var
  sHash: string;
begin
  sHash := 'a'+#0+'b';
  result:=length(sHash);

  if ((pBuf <> nil) and (iBufLen > 0)) then
  begin
    if (iBuflen > result) then
      iBufLen := result;

    move(sHash[1], pBuf^, iBufLen);
  end;
end;
Delphi-Quellcode:
//***Anwendung***
var
  Hash: String;
  Len: Integer;
begin
  //benötigte Länge abfragen
  Len := GetFileHash('c:\abc.txt', nil, 0);
  //Buffer auf benötigte Länge setzen
  SetLength(Hash, Len);
  //Hash abfragen
  GetFileHash('c:\abc.txt', @Hash[1], Len);
Platz für ein eventuelles 0 Byte wird nicht benötigt weil ja zurück gegeben wird wie groß die Daten sind. Wenn ein 0 Byte gewünscht ist müsste sich das der Aufrufer dazu packen aber in deinem Fall ist es ja zum Beispiel nicht notwendig.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat