为什么此代码在结果上获得访问错误:= 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 }
答案 0 :(得分:14)
GetTempPath期望缓冲区中第一个参数的字符数,而不是字节大小。将SizeOf
更改为Length
即可。
答案 1 :(得分:5)
要使其在D7中工作,请将“string”替换为“AnsiString”,将“Char”替换为“AnsiChar”。另外,调用GetTempPathA和GetTempFileNameA而不是GetTempPath和GetTempFileName。
但是Mason给出的方法可能更好,因为它将支持Unicode文件名。