Delphi 2009/2010和Windows API调用的Unicode问题

Cha*_*iga 4 delphi delphi-2009 delphi-2010

嗨,我一直在Delphi 2006中使用此功能,但现在使用D2010它会抛出错误.我认为这与切换到Unicode有关.

  Function TWinUtils.GetTempFile(Const Extension: STRING): STRING;
  Var
     Buffer: ARRAY [0 .. MAX_PATH] OF char;
  Begin
    Repeat
      GetTempPath(SizeOf(Buffer) - 1, Buffer);
      GetTempFileName(Buffer, '~~', 0, Buffer);
      Result := ChangeFileExt(Buffer, Extension);
    Until not FileExists(Result);
  End;
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能让它发挥作用?

编辑

调用ChangeFileExt时,我收到"访问冲突"

RRU*_*RUZ 6

Windows.Pas

function GetTempFileName(lpPathName, lpPrefixString: PWideChar;
  uUnique: UINT; lpTempFileName: PWideChar): UINT; stdcall;

function GetTempPath(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; stdcall;
Run Code Online (Sandbox Code Playgroud)

SysUtils.Pas

function ChangeFileExt(const FileName, Extension: string): string;
Run Code Online (Sandbox Code Playgroud)

试试这个

  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;
Run Code Online (Sandbox Code Playgroud)

或这个

  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;
Run Code Online (Sandbox Code Playgroud)

对于Delphi,Char和PChar类型分别是WideChar和PWideChar类型.

如果您使用任何将数据返回到char缓冲区的Windows API,则需要将这些缓冲区重新声明为字节数组或AnsiChar数组.

如果您正在调用这些Windows API并发送缓冲区,那么在告诉API缓冲区有多长时间时一直使用sizeof函数.这些调用需要更改为Length函数,因为Windows widechar API需要字符数,而不是字节数.

再见.

  • 旧代码出现问题的原因是GetTempPath()中的SizeOf(Buffer) - 1.SizeOf的Chars数组与2009之前Delphi的长度相同,因为SizeOf(AnsiChar)= 1.使用Delphi 2009及更高版本,SizeOf(Char)= SizeOf(WideChar)= 2,因此代码询问GetTempPath()用尽可能多的字符填充缓冲区. (4认同)