0

我们正在使用的第三方 .DLL 文件中有一个错误,我已被指派修复它。该库是由最后聘请维护代码的公司制作的,我们只有一些源代码。每当用于处理的对象在我们拥有的代码中时,它们都是 OleVariants 的形式。我的解决方案是创建一个有 bug 的子类,并重写该方法来纠正 bug。问题是,每当我尝试从父类调用方法时,我都会从不同的 .DLL 文件中收到内​​存访问冲突错误。

我是一个完整的 Delphi 新手,这是我使用它的第三周。任何帮助,将不胜感激。

谢谢你。

编辑:我可能应该详细说明一下。我将原始对象替换为具有修复程序的新类的实例。我正在尝试将原始对象从 OleVariant 转换为新类并将其重新转换或将其传递给新对象的构造函数,以便我可以维护对象中的数据。我想知道是否有办法做到这一点,并且当我调用继承的函数或从对象转换回其原始类型后的函数时不会出错。再次感谢你。

编辑 2:为了回答一个问题,我试图从 OleVariant 转换为它的原始类或我创建的子类。

回答第二个问题:我导入了所涉及的库,然后写了以下内容:

Subclass = class(SuperclassFromDll)

其中“Subclass”和“SuperclassFromDll”是实际的类名。如果这不是正确的方法,请告诉我如何替换有问题的函数(可能通过将修复写入 DllName_TLB 单元?)。抱歉有任何不清楚的地方,我正在尝试快速提出这个问题,以便我可以重新尝试解决这个问题。

编辑 3:我还应该注意到 DLL 文件是从前一家公司的 Delphi 项目创建的。

4

1 回答 1

2

你不能这样做。正如大卫赫弗南所说,这是“不平凡的”,这是一种很好的说法,你必须是一个天才才能实现它。因此,如果您要尝试它,您不必成为 Delphi 新手。(OTOH,如果您不是德尔福新手,您甚至不会考虑它)。

一方面,如果 COM 对象在 Delphi 中实现、动态链接和使用相同版本的 Delphi 编译,您将只能将 COM 对象转换为 Delphi 对象。

一个更好、更简单的解决方案,因为据报道,当您在类上调用方法时会出现问题,是隔离引起问题的环境,并避免在这些情况下调用方法。

您可以在包装类中做到这一点。因此,与其强制转换 OleVariant(我假设是 COM 对象)并将其强制转换为 delphi 包装类,不如创建您自己的类CProblemObjectShim,该类将问题类作为成员。然后通过调用包含的对象来实现所有方法,并添加解决问题所需的额外检查或步骤。

于 2011-03-15T12:58:48.503 回答