在Delphi中将对象转换为OleVariant

时间:2010-05-05 08:23:06

标签: delphi com variant

有没有办法传递一个包装并在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.

3 个答案:

答案 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的建议并为你的班级制作一个自动包装器。如果你了解自己的方式,那应该不会很难。