为啥此代码在 D2010 中失败,但在 D7 中没有?
Posted
技术标签:
【中文标题】为啥此代码在 D2010 中失败,但在 D7 中没有?【英文标题】:Why does this code fail in D2010, but not D7?为什么此代码在 D2010 中失败,但在 D7 中没有? 【发布时间】:2010-05-06 23:01:36 【问题描述】:为什么此代码在 D2010 中的 Result := Buffer 行上出现访问错误,但在 D7 中却没有?
我猜是涉及到 UniCode,但编译器不会生成任何警告。
对优雅的解决方法有什么建议吗?
编辑:哎哟:GetTempPath 调用正在破坏堆栈,这一事实证明了在 GetTempPath 行之后 Extension 是空的,但之前不是……哎呀。
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
【问题讨论】:
“扩展”? “扩展名”的错字? 【参考方案1】:GetTempPath 期望缓冲区中第一个参数的字符数,而不是字节大小。将SizeOf
更改为Length
即可。
【讨论】:
是的,它在 D7 中确实有效,因为对于 AnsiStrings,一个字符是一个字节。【参考方案2】:要使其像在 D7 中一样工作,请将“string”替换为“AnsiString”,将“Char”替换为“AnsiChar”。另外,调用 GetTempPathA 和 GetTempFileNameA 而不是 GetTempPath 和 GetTempFileName。
但 Mason 给出的方法可能更好,因为它将支持 Unicode 文件名。
【讨论】:
大概你的意思是“让它在 D2010 中工作,替换......”因为它在 D7 中工作?在 Delphi 7 中 String 和 AnsiString 也是一样的,所以这不会有任何影响... @DaveBoltman:不。我写的是“为了使它在 D7 中 as 工作,替换...”。 啊是的对不起-我没有仔细阅读你的答案:)你是对的以上是关于为啥此代码在 D2010 中失败,但在 D7 中没有?的主要内容,如果未能解决你的问题,请参考以下文章
为啥此 python 代码在 pyspark 中有效,但在 spark-submit 中无效?
此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?
为啥我的程序在发布模式下运行良好,但在调试模式下失败? [关闭]