3

有没有办法在 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.
4

3 回答 3

4

您可以编写和注册自定义 Variant 类型;看看TSQLTimeStampVariantType一个例子。

另一种方法是为您的课程编写一个自动化包装器。双调度接口自动支持后期绑定,通过IDispatch该绑定由OleVariant.

于 2010-05-05T08:40:53.320 回答
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;
于 2010-05-05T09:27:43.357 回答
2

让你的对象实现一个接口并传递接口。

function GetMyObjAsVariant: OleVariant;
var
  MyObj: IMyObj;
begin
  MyObj := TMyObj.Create;
  result := MyObj;
end;

var
  MyObj: IMyObj;
begin
  MyObj := GetMyObjAsVariant as IMyObj;
end;

我不能保证这行得通,你应该听从 TOndrej 的建议,为你的班级制作一个自动化包装器。如果您知道自己的方式,这应该不难。

于 2010-05-05T09:52:13.263 回答