代码之家  ›  专栏  ›  技术社区  ›  Charles Faiga

Delphi2009/2010和Windows API调用的Unicode问题

  •  4
  • Charles Faiga  · 技术社区  · 16 年前

    嗨,我在Delphi2006中使用过这个函数,但是现在对于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 回复  |  直到 13 年前
        1
  •  6
  •   RRUZ    16 年前

    视窗

    function GetTempFileName(lpPathName, lpPrefixString: PWideChar;
      uUnique: UINT; lpTempFileName: PWideChar): UINT; stdcall;
    
    function GetTempPath(nBufferLength: DWORD; lpBuffer: PWideChar): DWORD; stdcall;
    

    雪莲花

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

    再见。

        2
  •  0
  •   Wim ten Brink    16 年前

    对于Delphi2009,char是Unicode字符。函数可能需要一个ansichar数组。

    刚刚检查过。GetTempFileName和GetTempPath都需要pWideString。

    错误信息是什么?

        3
  •  0
  •   JensG    14 年前

    我建议始终,而且我的真正意思是始终,查看文档,了解每个API函数对dwSize参数和/或返回值的准确期望。

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

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

    所有这些都可以很容易地在文档中找到,但是应该阅读它。真的?它可以帮你节省时间。

        4
  •  0
  •   GDP Danny    13 年前

    使用 GetTempPathA GetTempFileNameA ,的ANSI版本 GetTempPath GetTempFileName .它们仍然在Delphi2009中提供,并在Delphi2009帮助文件中提到,但没有广告。