【问题标题】:Cast object as OleVariant in Delphi在 Delphi 中将对象转换为 OleVariant
【发布时间】:2011-02-15 19:48:38
【问题描述】:

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

【问题讨论】:

    标签: delphi com variant


    【解决方案1】:

    您可以编写和注册自定义 Variant 类型;以TSQLTimeStampVariantType 为例。

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

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 如前所述:这只适用于同一进程。所以只在进程 COM 对象 (dll) 中!
      • 这就是我要找的黑客!其他答案也很好,但这满足了我的迫切需要,谢谢。
      • 如果它是一个进程内 COM DLL,那么你为什么首先要限制自己使用 OLEVariant?如果提供调度接口(用于自动化客户端),您只需要坚持自动化兼容类型。使用进程内 COM DLL,我认为您可以简单地选择退出自动化类型安全并直接传递您的 TObject。但是我已经很久没有在那个级别做COM了,所以我可能记错了。
      • 该 dll 包含一些现有 TObject 类的包装器。一些包装器需要共享一个 TObject。以前,我只是简单地定义了一个 TObject 的全局实例,然后每个人都可以访问它。但是,当有多个 dll 实例时,这不起作用。所以我必须正确地传递物体。另一种解决方案是将公共对象本身重新创建为自动化对象以传递它,但在这种情况下需要做很多工作。我希望我能清楚地解释情况。
      【解决方案3】:

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

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

      我不能保证这会奏效,您应该按照 TOndrej 的建议为您的课程制作一个自动化包装器。如果您知道自己的方式,这应该不难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-18
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-07
        • 1970-01-01
        相关资源
        最近更新 更多