Convert OleVariant to Object in Delphi

2019-01-29 13:06发布

I'm working on this project where we don't have the source code for large chunks of the project, but we have the .DLL files with some information. There is a bug in the DLL files. I am able to create a subclass of the class with the bug in it and I would like to downcast the object which already exists at a point I have access to it. The issue is that at any point I have access to the object, it's cast as a Variant. I've tried the following (edited to remove context):

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

but I get the following error:

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

Is there any other way to get the pointer to the object out of the OleVariant and/or do the typecasting involved?

Thank you.

EDIT: Yes, the Parentclass implements IDispatch. CORRECTION: The parentclass implements an interface which inherits from IDispatch.

2条回答
【Aperson】
2楼-- · 2019-01-29 13:14

Try type cast to IUnknown first.

tempSubclass := Subclass(ParentClass(Integer(IUnknown(oleVariantCast))));
查看更多
虎瘦雄心在
3楼-- · 2019-01-29 13:23

A Dispatch Variant is a pretty generic interface, not a class (which is why it can't be typecast to a Delphi object - it isn't one, and doesn't have the VMT for the class you're trying to cast it to become).

If the DLL contains a type library, you can import that into Delphi and then use the interfaces it contains directly without trying to cast them to anything else first.

If you have documentation about the actual interface implementation in the DLL, you can write a Delphi class that uses that interface. You can convert it by defining a type to represent the interface, and then get access to it using 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;
查看更多
登录 后发表回答