2012-11-14 72 views
0

我在调用COM对象(Inventor 2012)上的方法的for循环中调用方法。从输出变量读取COM方法?

曾经是该代码:

foreach (var occ in occurrences) 
{ 
    // [...] 
    SomeMethod(occ); 
    // [...] 

重构时,我决定到内联方法调用:

foreach (var occ in occurrences) 
{ 
    // [...] 
    BOMQuantityTypeEnum quantityType; 
    object quantity; 
    occ.Definition.BOMQuantity.GetBaseQuantity(out quantityType, out quantity); 
    if (quantityType == 
    // [...] 
} 

当改变不出意外,今年开始失败了,扔E_INVALIDARG。此外,它只在第二次调用该方法时失败。但是,通过将其更改为以下版本,可以再次运行:

BOMQuantityTypeEnum quantityType = 0; 
    object quantity = null; 
    occ.Definition.BOMQuantity.GetBaseQuantity(out quantityType, out quantity); 

为什么会发生这种情况?

编辑:

难道说的COM对象读取上一次迭代的价值?

签名在文档中给出的(在VB中)为:

Sub GetBaseQuantity(ByRef QuantityType As BOMQuantityTypeEnum, ByRef Quantity As [optional] VARIANT) 

是C#-signature错了吗? COM接口不是自动生成的吗?

+0

相当于VB ByRef的C#不等于ref关键字而不是out关键字吗?我不确定这是否应该有所作为,但可能值得一试? –

+0

'GetBaseQuantity(ref quantityType,ref quantity)'不能编译。 – johv

+0

嗯,它只是意味着GetBaseQuantity被编码为在非空数量通过时拒绝该调用。 –

回答

0

难道是COM对象读取前一次迭代的值吗?

是的。在COM自动化中,除了一个方法的返回值之外,没有相当于。你如何以结束而不是ref是相当神秘的。可能只是用于声明COM接口的IDL中的一个错误。唯一的与COM自动化兼容的IDL属性是[in],[in,out]和[out,retval]。

仍然不应该是一个问题,COM服务器可以调用VariantClear()来重置变体。似乎它也不想那样做。您无法修复该代码,重新设置自己的价值肯定是一个足够好的解决方法。

+0

我最终添加了一个等同的扩展方法与出去替换参考。 – johv