为啥此代码在 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 中没有?的主要内容,如果未能解决你的问题,请参考以下文章

为啥此查询在 ODBC 表上运行但在本地表上运行时会失败?

为啥此 python 代码在 pyspark 中有效,但在 spark-submit 中无效?

此 SQL 代码在 SMMS 中执行时有效,但在 .Net 中通过 ExecuteNonQuery() 调用时无效,为啥?

为啥我的程序在发布模式下运行良好,但在调试模式下失败? [关闭]

为啥 JPA 提交在应用程序中失败,但在 JUnit 中有效?

为啥此查询字符串在 Access 中有效,但在 C# 中无效?