1

我正在处理这个项目,我们没有大部分项目的源代码,但我们有包含一些信息的 .DLL 文件。DLL 文件中存在错误。我能够创建一个包含错误的类的子类,并且我想向下转换在我可以访问它的点上已经存在的对象。问题是在任何时候我都可以访问该对象,它被转换为一个变体。我尝试了以下方法(已编辑以删除上下文):

tempSubclass := Subclass(ParentClass(Integer(oleVariantCast)));

但我收到以下错误:

Could not convert variant of type (Dispatch) into type (Integer)

有没有其他方法可以从 OleVariant 中获取指向对象的指针和/或进行类型转换?

谢谢你。

编辑:是的,Parentclass 实现了 IDispatch。更正:父类实现了一个从 IDispatch 继承的接口。

4

2 回答 2

2

Dispatch Variant 是一个非常通用的接口,而不是一个类(这就是为什么它不能被类型转换为 Delphi 对象的原因 - 它不是一个,并且没有你试图转换的类的 VMT成为)。

如果 DLL 包含一个类型库,您可以将其导入 Delphi,然后直接使用它包含的接口,而无需先尝试将它们转换为其他任何东西。

如果您有关于 DLL 中实际接口实现的文档,您可以编写一个使用该接口的 Delphi 类。您可以通过定义表示接口的类型来转换它,然后使用以下方法访问它as

type
  TYourInterface=interface(IDispatch)
    // the interface definition here
  end;

var
  Intf: TYourInterface;
begin
  Intf := YuorOleVariant as TYourInterface;
  // work with interface from DLL using Intf.
  Intf := nil;
end;
于 2011-03-14T18:47:00.207 回答
1

首先尝试将类型转换为 IUnknown。

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast))));
于 2011-03-14T19:09:17.577 回答