从.DLL文件访问方法或属性时Delphi 6内存访问冲突错误

时间:2011-03-15 12:43:44

标签: delphi dll delphi-6

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

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

谢谢。

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

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

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

Subclass = class(SuperclassFromDll)

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

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

1 个答案:

答案 0 :(得分:2)

你不能这样做。正如David Heffernan所说的那样“非平凡”,这是一种很好的说法,你必须成为一个天才才能实现这一目标。所以如果你要尝试它,你不需要成为德尔福新手。 (OTOH,如果你不是德尔福新手,你甚至不会考虑它)。

首先,如果COM对象在Delphi中实现,并且动态链接,并使用相同版本的Delphi进行编译,则只能将COM对象转换为Delphi对象。

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

您可以在包装类中执行此操作。因此,不是强制使用OleVariant(我假设COM对象在引擎盖下)并将其转换为delphi包装类,而是创建自己的类CProblemObjectShim,它将问题类作为成员。然后通过调用包含的对象来实现所有方法,并添加必要的附加检查或步骤来解决问题。