gpt4 book ai didi

delphi - 引发异常时,Delphi 2010/2009 中内置的 Dll 与 Delphi 7 不兼容

转载 作者:行者123 更新时间:2023-12-03 18:08:51 24 4
gpt4 key购买 nike

我在 Delphi 2010 中构建了一个 dll,并在我的 Delphi 7 应用程序中使用了它。

我知道 unicode AnsiString/字符串问题,根据我的测试,一切正常,直到我的 delphi 2010 dll 没有引发异常为止。

事实是,是否有任何与 unicode/AnsiString 世界兼容的特殊/处理过的异常?也就是说,我的 Delphi 2010 是否能够引发可以在我的 Delphi 7 应用程序中适当处理的异常?

感谢您的帮助。

达尼洛。

最佳答案

看到 Mason 和 Jeroen 都提示我,这里是:(Jeroen,不要放弃你的分数,你也有有效的分数)。

Jeroen 声明任何特定语言都不应跨越 dll 边界。在某种程度上我同意。这取决于 dll 的预期用途,尤其是涉及到诸如字符串之类的语言特定功能时。如果您开发的 dll 将专门用于 Delphi 项目,尤其是当它仅用于您自己的 Delphi 项目时,没有理由仅仅为了避免字符串越界而乱用 PChar 之类的东西。

因此,尽管异常是特定于语言的,但对我来说,这并不是不允许异常逃逸 dll 的主要原因。也不是因为它们的语言特殊性,不可能在 dll 之外处理它们。

不允许异常转义 dll 的基本原因与不允许异常转义线程的基本原因相同:清理你自己的烂摊子。另外:转义线程的异常会使您的应用程序崩溃。对于转义 dll 的异常,情况可能并非如此,但 dll - 甚至比线程更应该是一个自包含实体,独立于调用它的人,包括独立于调用方处理不可预见的情况,即异常。

那么怎么保证一个dll不会把调用方踩得满地都是呢?我想条条大路通罗马,但在我看来最简单的是 OLE 所做的:

  • 每个导出的方法都应该返回一个代码,告诉调用者是否一切正常,或者是否出了问题。

  • 返回代码要具体。不要只是报告出了什么问题,要为所有阻止该方法执行它被调用的操作的代码。因此有 DLL_OK、DLL_OUT_OF_MEMORY、DLL_FILE_NOT_FOUND、DLL_INVALID_XXX(用于报告无效输入参数)等代码。

  • 在调用 dll 的应用程序中,编写通用 DLL_Check 函数以检查返回码并引发适当的异常,您的其余代码可以根据需要进行处理。

  • 使用特定的异常类来执行此操作。即一个通用的 EDllError 异常类及其各种后代,用于您需要处理的特定情况。这对除了 E... 之外的编码有很大帮助。

  • 因为方法的返回值用于ok/error报告:在需要返回有意义值的方法中使用out或var参数。

  • 查看有关 OLE 拖放的 msdn 文档,了解特定返回代码的示例以及如何使用 var 和 out 参数与调用方交换信息。

链接:

关于delphi - 引发异常时,Delphi 2010/2009 中内置的 Dll 与 Delphi 7 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3120545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com