有没有办法传递一个包装并在OleVariant中解包一个TObject后代?我试图跨自动化对象传递TObject。我知道这不是一个好主意,但我没有一个好的选择。
对象将在来自同一自动化dll的对象之间传递,如果这有任何区别的话。
这样的事情:
function GetMyObjAsVariant;
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
result := OleVariant(MyObj);
end;
客户将使用
var
MyObj: TMyObj;
begin
MyObj := GetMyObjAsVariant as TMyObj;
end;
无法编译,返回
E2015 Operator not applicable to this operand type.
答案 0 :(得分:4)
您可以编写并注册自定义Variant类型;请查看TSQLTimeStampVariantType
示例。
另一种方法是为您的类编写自动化包装器。双重调度接口自动支持IDispatch
支持的OleVariant
后期绑定。
答案 1 :(得分:2)
如果你绝对,真的想要,并且你确定两个对象都在同一个进程中,你可以将任何TObject转换为Integer,然后再转换回TObject:
function GetMyObjAsVariant;
var
MyObj: TMyObj;
begin
MyObj := TMyObj.Create;
result := OleVariant(Integer(MyObj));
end;
然后:
var
anInt: Integer;
MyObj: TMyObj;
begin
anInt := GetMyObjAsVariant;
MyObj := TMyObj(anInt);
end;
答案 2 :(得分:2)
让你的对象实现一个接口并传递接口。
function GetMyObjAsVariant: OleVariant;
var
MyObj: IMyObj;
begin
MyObj := TMyObj.Create;
result := MyObj;
end;
var
MyObj: IMyObj;
begin
MyObj := GetMyObjAsVariant as IMyObj;
end;
我不保证这有效,你应该选择TOndrej的建议并为你的班级制作一个自动包装器。如果你了解自己的方式,那应该不会很难。