2010-05-06 77 views
6

为什么此代码在D2010中的结果:=缓冲区行中发生访问错误,但不是D7中的?为什么此代码在D2010中失败,但不是D7?

有些事情,我猜想,涉及UniCode,但编译器不会产生任何警告。

任何建议在优雅的解决方法?

编辑:Ouch:GetTempPath调用正在垃圾堆栈中,这是由于GetTempPath行后面的扩展名为空,但之前没有... 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

“aExtension”? “扩展”的拼写错误? – 2010-05-06 23:16:53

回答

14

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

+6

是的,它在D7中工作,因为对于AnsiStrings,一个字符是一个字节。 – 2010-05-06 23:20:03

5

要使它在D7工作,将“串”与“AnsiString类型”和“字符”和“ANSIChar类型”。此外,调用GetTempPathA和GetTempFileNameA而不是GetTempPath和GetTempFileName。

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

+0

假设你的意思是“让它在** D2010 **中工作,替换...”,因为它在D7中工作?另外String和AnsiString在Delphi 7中是一样的,所以这不会有任何影响... – DaveBoltman 2015-03-17 18:27:38

+0

@DaveBoltman:不,我写的是“为了使它在**中工作**,替换...”。 – 2015-03-17 18:40:37

+0

对不起 - 我没有仔细阅读你的答案:)你说对了 – DaveBoltman 2015-03-18 07:06:23

相关问题