【发布时间】:2009-10-27 13:35:08
【问题描述】:
我在Delphi 7 中使用COM,它是在C# 中创建的,并且类的方法之一返回一个类型的数组。但是,当 Delphi 导入它时,我得到的不是该类型的数组,而是 PSafeArray。
如何将该数组的项转换为其基本类型?
我尝试使用SafeArrayGetElement,但找不到将项目转换为其原始类型的方法。
【问题讨论】:
我在Delphi 7 中使用COM,它是在C# 中创建的,并且类的方法之一返回一个类型的数组。但是,当 Delphi 导入它时,我得到的不是该类型的数组,而是 PSafeArray。
如何将该数组的项转换为其基本类型?
我尝试使用SafeArrayGetElement,但找不到将项目转换为其原始类型的方法。
【问题讨论】:
我不确定你为什么需要像 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;
【讨论】:
我不确切知道 Delphi 如何处理类型库解释,但 SAFEARRAY 有一个关联类型。
如果您可以查看 C# 程序集的类型库,您可能可以从那里收集基础类型。
如果没有,您可以在数组上调用 SafeArrayGetVarType 以在运行时获取其关联类型(不过,这在某些 API 创建的 SAFEARRAYs 上存在问题,因此您可能会返回垃圾。)
不过,它很可能以 SAFEARRAY 或 VARIANT 的形式公开,其中每个项目都是“动态”类型。
你知道你是否可以在 Delphi 中处理VARIANTs 吗?
【讨论】: