2009-08-04 37 views
3

我知道我錯過了一些簡單的東西,我旁邊沒有這些COM的經驗。如何從c#通過bool通過c + + com接口在IDL

我想在一個IDL

[id(5), helpstring("Returns true if the object is in a valid state.")] 
HRESULT IsValid([out, retval] boolean bValid); 

一個界面中,要做到這一點然而這給:[出]放慢參數不是指針。

好吧,我明白了。

然而,在執行本C#代碼,我不能從方法IsValid(),因爲它是不安全的返回一個bool *。

什麼是我返回布爾值的正確方法?

回答

7

嘗試:

HRESULT IsValid([out, retval] VARIANT_BOOL *bValid); 

爲了作爲輸出工作,它必須是一個指針值;這是它如何被寫入在C++方面:

*bValue = VARIANT_TRUE; 

我不知道,如果你能寫類型boolean - 我只看過VARIANT_BOOL被使用。

在C#的一面,它將成爲等同於:

public bool IsValid() 

換句話說,運行時可調用包裝(RCW)將實施方法簽名的「更好」的版本,並採取不安全的護理爲你翻譯。如果C++實現返回E_FAIL(或E_WHATEVER),那麼RCW的方法將拋出ComException

您可能還會考慮添加[propget]屬性,這會使IsValid作爲屬性而不是方法提供。與任何屬性一樣,只有在評估便宜且沒有副作用時才能執行此操作(調試器會在您逐步執行C#代碼時對其進行評估)。

+0

這工作。此外,我想知道如何使用這個屬性,所以你解決了我的兩個問題。 謝謝! – Erix 2009-08-04 18:33:56