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 型です。
データを char バッファーに返す Windows API を使用する場合、それらのバッファーをバイト配列または AnsiChar 配列として再宣言する必要があります。
これらの Windows API を呼び出してバッファを送信している場合、API にバッファの長さを伝えるときに sizeof 関数を使用していた場合。Windows widechar API はバイト数ではなく文字数を必要とするため、これらの呼び出しを Length 関数に変更する必要があります。
さよなら。