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

时间:2010-05-06 23:01:36

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

2 个答案:

答案 0 :(得分:14)

GetTempPath期望缓冲区中第一个参数的字符数,而不是字节大小。将SizeOf更改为Length即可。

答案 1 :(得分:5)

要使其在D7中工作,请将“string”替换为“AnsiString”,将“Char”替换为“AnsiChar”。另外,调用GetTempPathA和GetTempFileNameA而不是GetTempPath和GetTempFileName。

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