Arrays 对象数组的变量 我试图得到一个OLVEARANT“对象数组”,我有这个C++代码来完成这个任务,但是我没有把它与德尔菲代码进行交易。 VARIANT vComps; HRESULT hr = swAssembly->GetComponents(VARIANT_TRUE, &vComps); IDispatch* HUGEP *pDispData; HRESULT hr = SafeArrayAccessData(vComps.parray, (void**)&pDispData); long bound = 0; hr = SafeArrayGetUBound(vComps.parray, 1, &bound); for (int i = 0; i < count; i++) { IComponent2 *nextComp = NULL; hr = pDispData[i]->QueryInterface(IID_IComponent2, (void**)&nextComp); //do stuff with Component pointer }

Arrays 对象数组的变量 我试图得到一个OLVEARANT“对象数组”,我有这个C++代码来完成这个任务,但是我没有把它与德尔菲代码进行交易。 VARIANT vComps; HRESULT hr = swAssembly->GetComponents(VARIANT_TRUE, &vComps); IDispatch* HUGEP *pDispData; HRESULT hr = SafeArrayAccessData(vComps.parray, (void**)&pDispData); long bound = 0; hr = SafeArrayGetUBound(vComps.parray, 1, &bound); for (int i = 0; i < count; i++) { IComponent2 *nextComp = NULL; hr = pDispData[i]->QueryInterface(IID_IComponent2, (void**)&nextComp); //do stuff with Component pointer },arrays,delphi,variant,Arrays,Delphi,Variant,但函数是从tbl文件导入的 swAssembly.getComponents(const toplevelonly:boolean) 而“getcomponents”只有一个参数,所以我不能这样做 swAssembly.GetComponents(true,vComps); 我试过了 vComps:=swAssembly.getComponents(true); 将vComps作为olevariant类型,因为编译器只允许此类型 执行这一行时没有错误,但当我尝试读取vComps时 i组件2

但函数是从tbl文件导入的

swAssembly.getComponents(const toplevelonly:boolean)
而“getcomponents”只有一个参数,所以我不能这样做

swAssembly.GetComponents(true,vComps);
我试过了

vComps:=swAssembly.getComponents(true);
将vComps作为olevariant类型,因为编译器只允许此类型 执行这一行时没有错误,但当我尝试读取vComps时

i组件2v组件[i]

我有一个访问错误。。。 我尝试了safearray,但我发现它们有一些困难…

试试这个:

vComps := swAssembly.GetComponents(true);
for i := VarArrayLowBound(vComps, 1) to VarArrayHighBound(vComps, 1) do
begin
  comp := vComps[i] as IComponent2;
  ...
end;
给出编译器错误

[DCC Error] Unit1.pas(62): E2015 Operator not applicable to this operand type
同样的事情

v := Icomponent2(o[I]);
只有for语句我才能编译,但进入循环时出错

for I := VarArrayLowBound(o, 1) to VarArrayHighBound(o, 1) do
begin
end;

class EVariantInvalidArgError with message 'Invalid argument'.

-你已经问过这个问题了。斯蒂恩花了宝贵的时间写了一个答案。然后你删除了这个问题,因此无法奖励斯蒂恩的努力。这太不礼貌了。非常感谢斯蒂恩·桑德斯!但我认为上一篇文章被你“暂停作为非主题”阻止了,我创建了这篇新文章,而不是编辑。很抱歉这是我关于堆栈溢出的第一个问题…是的,请稍候。这是供您编辑并修复其缺陷的队列。这样就可以重新打开。我不介意。我甚至没有注意到,除非这正是我的第8000个代表点,我想知道为什么我突然又降到了7999。+1但如果你解释一下重写safecallfunction GetComponentsTopLevelOnly:WordBool:OleVariant的方法会更好;安全呼叫;我在getComponents之后插入了一个断点,我在编译器中看到v是未赋值的,lengthv返回0
v := Icomponent2(o[I]);
for I := VarArrayLowBound(o, 1) to VarArrayHighBound(o, 1) do
begin
end;

class EVariantInvalidArgError with message 'Invalid argument'.