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

时间:2009-09-14 10:42:00

标签: 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;

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

修改

调用ChangeFileExt时出现'访问冲突'

4 个答案:

答案 0 :(得分:6)

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需要字符数,而不是字节数

再见。

答案 1 :(得分:0)

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

刚检查过。 GetTempFilename和GetTempPath都需要PWideString。

错误讯息是什么?

答案 2 :(得分:0)

使用GetTempPathAGetTempFileNameAGetTempPathGetTempFileName的Ansi版本。它们仍在Delphi 2009中可用,并在Delphi 2009帮助文件中提及,但未公布。

答案 3 :(得分:0)

我建议总是,我总是想要了解有关dwSize参数和/或返回值的每个API函数的确切期望的文档。

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

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

所有这些都可以在文档中轻松找到,但是应该阅读它。真。它可以节省你的时间。

相关问题