2012-11-14 108 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