Einen PChar als Rückgabewert zu benutzen, kann böse ins Auge gehen.
Der Speicher für die vier Byte für den Pointer sind zwar reserviert, nicht aber der Speicherbereich, auf den der PChar in deinem Fall verweisst.
Bei einem String ist das kein Problem, aber bei PChar kann es zu Fehlern führen, da der Speicher sofort wieder überschrieben werden kann.
Entweder allokierst du in der Funktion Speicher, der hinterher wieder freigegeben wird, oder du übergibst einen PChar mit geung Speicher. MAX_PATH wird hier von MS empfohlen.
Delphi-Quellcode:
function GetWinDir(WinDirPath: PChar): UINT;
begin
Result := GetWindowsDirectory(@WinDirPath[0], MAX_PATH);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Dir: array[0..MAX_PATH-1] of char;
begin
if (GetWinDir(@Dir[0]) >0) then
begin
ShowMessage(Dir);
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
end;
end;
Durch den statischen Array fällt zusätzlich noch das manuelle Allokieren von Speicher weg, das macht der Compiler für uns.