4

嗨,我一直在 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;

我应该怎么做才能让它工作?

编辑

调用 ChangeFileExt 时出现“访问冲突”

4

4 回答 4

7

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 函数。这些调用需要更改为 Length 函数,因为Windows Widechar API 需要字符数,而不是字节数

再见。

于 2009-09-14T11:00:55.430 回答
0

在 Delphi 2009 中,Char 是 unicode char。该函数可能需要一个 AnsiChar 数组。

刚查了一下。GetTempFilename 和 GetTempPath 都需要 PWideString。

错误信息是什么?

于 2009-09-14T10:47:30.517 回答
0

使用GetTempPathAand , andGetTempFileNameA的 Ansi 版本。它们在 Delphi 2009 中仍然可用,并且在 Delphi 2009 帮助文件中提到,但没有做广告。GetTempPathGetTempFileName

于 2010-03-27T09:19:12.030 回答
0

我建议总是,我真的是说总是,查看文档,了解每个 API 函数对 dwSize 参数和/或返回值的确切期望。

不幸的是,有很多不同的情况,所以仅仅说“所有字符串函数都需要/返回字符数”并不完全正确,可能会让读者陷入零星的无效指针 AV 的噩梦。

  • 大多数 API 函数确实期望/返回字符数,但有些则不然。
  • 有些计算终止的空字符,有些则不计算。
  • 传递 nil 指针与传递非 nil 指针时,某些函数的行为不同。
  • 还有一些函数根本不提供任何方法来指示所需的缓冲区大小。

所有这些东西都可以在文档中轻松找到,但应该阅读它。真的。它可以为您节省数小时。

于 2012-06-07T01:52:55.980 回答