代码之家  ›  专栏  ›  技术社区  ›  Alan Clark

delphi中将对象转换为olevariant

  •  2
  • Alan Clark  · 技术社区  · 14 年前

    有没有一种方法可以通过一个包裹和打开一个tobject子代的olevariant?我正试图在自动化对象之间传递一个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 回复  |  直到 14 年前
        1
  •  2
  •   Cosmin Prund    14 年前

    如果您确实希望并且您确定两个对象处于同一过程中,则可以将任何tobject强制转换为整数,然后再返回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
  •  4
  •   Ondrej Kelle    14 年前

    您可以编写并注册自定义变量类型;请查看 TSQLTimeStampVariantType 举个例子。

    另一种方法是为类编写自动化包装器。双dispInterface自动支持通过 IDispatch 它得到了 OleVariant .

        3
  •  2
  •   The_Fox    14 年前

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

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

    我不能保证这是有效的,你应该按照tondrej的建议为你的类制作一个自动化包装器。如果你知道自己的路,应该不难。