Windows.pas
function GetTempFileName(lpPathName, lpPrefixString: PWideChar;
uUnique: UINT; lpTempFileName: PWideChar): UINT; stdcall;
function GetTempPath(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; stdcall;
SysUtils.Pas
function ChangeFileExt(const FileName, Extension: string): string;
Попробуйте это
Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
Var
Buffer: ARRAY [0 .. MAX_PATH] OF WideChar;
Begin
Repeat
GetTempPath(Length(Buffer), Buffer);
GetTempFileName(Buffer, '~~', 0, Buffer);
Result := ChangeFileExt(Buffer, Extension);
Until not FileExists(Result);
End;
или это
Function GetTempFile(Const Extension: String): String;
Var
Buffer: String;
Begin
SetLength(Buffer,MAX_PATH);
Repeat
GetTempPath( MAX_PATH, PChar( Buffer) );
GetTempFileName(PChar( Buffer), '~~', 0, PChar( Buffer));
Result := ChangeFileExt(Buffer, Extension);
Until not FileExists(Result);
End;
Для типов Delphi, Char и PChar - это типы WideChar и PWideChar соответственно.
Если вы используете какие-либо API-интерфейсы Windows, которые возвращают данные в буферы символов, эти буферы должны быть повторно объявлены как массивы байтов или массив AnsiChar.
Если вы вызываете эти API-интерфейсы Windows и отправляете в буферы, если вы использовали функцию sizeof, сообщая API, какова длина вашего буфера. Эти вызовы должны быть изменены на функцию Length, поскольку API-интерфейс widechar Windows требует количество символов, а не количество байтов .
Bye.