Reputation: 2079
Is there a way to pass a wrap and unwrap a TObject descendent in an OleVariant? I am trying to pass a TObject across automation objects. I know it's not a good idea but I don't have a good alternative.
The object is to be passed between objects from the same automation dll, if that makes any difference.
Something like this:
function GetMyObjAsVariant;
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
result := OleVariant(MyObj);
end;
Which would be used by a client as
var
MyObj: TMyObj;
begin
MyObj := GetMyObjAsVariant as TMyObj;
end;
This fails to compile, returning
E2015 Operator not applicable to this operand type.
Upvotes: 3
Views: 6722
Reputation: 7062
Let your object implement an interface and pass the interface.
function GetMyObjAsVariant: OleVariant;
var
MyObj: IMyObj;
begin
MyObj := TMyObj.Create;
result := MyObj;
end;
var
MyObj: IMyObj;
begin
MyObj := GetMyObjAsVariant as IMyObj;
end;
I won't guarantee this works, you should go with TOndrej's suggestion and make an automation wrapper for your class. It shouldn't be to hard if you know your way around.
Upvotes: 2
Reputation: 25678
If you absolutely, really want to, and you know for sure both objects are in the same process, you can cast any TObject to an Integer and then back to an TObject:
function GetMyObjAsVariant;
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
result := OleVariant(Integer(MyObj));
end;
and then:
var
anInt: Integer;
MyObj: TMyObj;
begin
anInt := GetMyObjAsVariant;
MyObj := TMyObj(anInt);
end;
Upvotes: 2
Reputation: 37221
You could write and register a custom Variant type; have a look at TSQLTimeStampVariantType
for an example.
An alternative would be to write an automation wrapper for your class. The dual dispinterface automatically supports late binding through IDispatch
which is supported by OleVariant
.
Upvotes: 4