【问题标题】:How to cast an PSafeArray item into its original type如何将 PSafeArray 项转换为其原始类型
【发布时间】:2009-10-27 13:35:08
【问题描述】:

我在Delphi 7 中使用COM,它是在C# 中创建的,并且类的方法之一返回一个类型的数组。但是,当 Delphi 导入它时,我得到的不是该类型的数组,而是 PSafeArray

如何将该数组的项转换为其基本类型?

我尝试使用SafeArrayGetElement,但找不到将项目转换为其原始类型的方法。

【问题讨论】:

    标签: c# delphi com delphi-7


    【解决方案1】:

    我不确定你为什么需要像 SafeArrayGetElement 那样为你做任何转换。一个例子:

    var
      Scope : ICOMScope;
      LBound, UBound, I : Integer;
    begin
      SafeArrayGetLBound(fMyComObject.Scopes, 1, LBound);
      SafeArrayGetUBound(fMyComObject.Scopes, 1, HBound);
      for i := lBound to Hbound do
      begin
        SafeArrayGetElement(fMyComObject.Scopes, i, Scope);
        //do something with scope
      end;
    end;
    

    【讨论】:

      【解决方案2】:

      我不确切知道 Delphi 如何处理类型库解释,但 SAFEARRAY 有一个关联类型。

      如果您可以查看 C# 程序集的类型库,您可能可以从那里收集基础类型。

      如果没有,您可以在数组上调用 SafeArrayGetVarType 以在运行时获取其关联类型(不过,这在某些 API 创建的 SAFEARRAYs 上存在问题,因此您可能会返回垃圾。)

      不过,它很可能以 SAFEARRAYVARIANT 的形式公开,其中每个项目都是“动态”类型。

      你知道你是否可以在 Delphi 中处理VARIANTs 吗?

      【讨论】:

      • 是的,Delphi 可以处理变体。真正的问题是我确实知道类型,但是当我尝试将其转换为它时,会引发异常。我认为所有问题都是因为类型是在 COM 中定义的。
      • 我想知道 /casting/ 是否不是这样做的方法。或者这是从 Variant 中获取价值的一般机制?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-04-16
      • 2013-06-19
      • 2019-05-17
      相关资源
      最近更新 更多