为什么这个代码在D2010中失败,而不是D7?

Rob*_*ank 6 delphi

为什么此代码在结果上获得访问错误:= D2010中的缓冲行,但不是D7?

我猜,有些东西涉及UniCode,但编译器不会产生任何警告.

有关优雅解决方案的任何建议吗?

编辑:哎呀:GetTempPath调用正在摧毁堆栈,因为GetTempPath行之后Extension是空的,但之前没有... Yikes.

    function GetTempPathAndFileName( const Extension: string):  string;
    var
      Buffer: array[0..MAX_PATH] of Char;
    begin
      repeat
        GetTempPath(SizeOf(Buffer) - 1, Buffer);
        GetTempFileName(Buffer, '~', 0, Buffer);
        Result := Buffer;    // <--- crashes on this line,
        Result := ChangeFileExt(Result, Extension);
      until not FileExists(Result);
    end; { GetTempPathAndFileName }
Run Code Online (Sandbox Code Playgroud)

Mas*_*ler 14

GetTempPath期望缓冲区中第一个参数的字符数,而不是字节大小.更改SizeOfLength,它会工作.

  • 是的,它确实在D7中工作,因为对于AnsiStrings,一个字符是一个字节. (6认同)

And*_*and 5

要使它像D7一样工作,将"string"替换为"AnsiString",将"Char"替换为"AnsiChar".此外,调用GetTempPathA和GetTempFileNameA而不是GetTempPath和GetTempFileName.

但是Mason给出的方法可能更好,因为它将支持Unicode文件名.