在Delphi中将OleVariant转换为Object

时间:2011-03-14 18:31:01

标签: delphi casting delphi-6

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

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

但是我收到以下错误:

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

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

谢谢。

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

2 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分:1)

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

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