Du konvertierst den String temporär zu einem PChar und gibst ihn per Result zurück. Problem dabei ist, dass die Typkonvertierung nur temporär ist und nach verlassen der Funktion ist der Speicher wo der PChar angelegt wurde ungültig. Daher ist es kein Wunder, dass die Daten nicht mehr stimmen. Es ist eher erstaunlich das der PChar soweit noch lesbare Zeichen enthält.
Ich empfehle dir eine andere Art der Stringübergabe: Besorg dir Speicher für den PChar im Hauptprogramm und übergebe diesen samt der Angabe der Länge an die
DLL Funktion, welche den Buffer befüllt, wenn er genügend Platz bietet.
Beispiel dazu:
Delphi-Quellcode:
// Hauptprogramm:
Procedure xy;
Var
lString:
String;
Begin
SetLength(lString, 2048);
SetLength(lString, DeineDLLFunc(PChar(lString), 2048));
ShowMessage(lString);
End;
// DLL
Function DeineDLLFunc(ABuffer: PChar;
Const ABufferLen: Integer): Integer;
Var
lStr:
String;
Begin
Result := 0;
lStr := Reg.ReadString('
whatever');
If ( ABufferLen > Length(lStr) )
Then // > weil wegen #0 !
Begin
StrPCopy(ABuffer, lStr);
Result := Length(lStr);
End;
End;
/EDIT: Super - da tippt man die ganze Zeit und zwischenzeitlich wird das gleiche getippelt... Ich hasse umsonst arbeiten...