我正在开发这个项目,我们没有项目大块的源代码,但我们有.DLL文件包含一些信息。 DLL文件中存在错误。我能够创建一个带有bug的类的子类,我想向下转换已经存在的对象,我可以访问它。问题是,在任何时候我都可以访问该对象,它被转换为Variant。我已经尝试了以下(编辑删除上下文):
tempSubclass := Subclass(ParentClass(Integer(oleVariantCast)));
但是我收到以下错误:
Could not convert variant of type (Dispatch) into type (Integer)
有没有其他方法可以从OleVariant中获取指向对象的指针和/或进行类型转换?
谢谢。
编辑:是的,Parentclass实现了IDispatch。 更正:父类实现了一个继承自IDispatch的接口。
答案 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))));