2010-05-06 118 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

相關問題