我對圖書館並不熟悉,但我可以提出一些建議。一旦你從COM的角度來看問題,你會發現沒有簡單的答案。 (請記住,在COM中,所有對象都只是對象,唯一的要求是它必須支持IUNKNOWN(可能還有其他接口)。因此,對於「它是什麼類型的對象」 「通常可以有多個答案。)
要記住的重要一點是,在COM中,對象的接口列表沒有在任何類型的元數據中定義,例如它在.NET中(除了通常的庫提供了一個可選的類型庫作爲開發工具的文檔形式 - 更多內容在一分鐘內)。
接口列表僅由調用IUNKNOWN的QueryInterface()方法的結果正式定義 - 也就是說,它完全由執行代碼的結果定義。
某些時候,列表可能是硬編碼的。通常情況下,列表可能不會在運行時才知道,甚至可能不知道,直到有人詢問。唯一的規則是接口列表需要穩定,我稱之爲合理:對於給定的對象實例,列表不能隨時間變化;它必須支持有時讓人忘記的IUNKNOWN;如果它支持派生接口,它必須支持它的基礎;和其他一些我確定我忘了。
最後一點對您的問題至關重要:COM不知道先驗什麼對象支持哪些接口。 .NET運行時並不知道 - 無論如何都不是。 .NET知道的唯一方法就是如果對象的類型庫聲明返回的對象是特定的接口。缺乏這一點,你所擁有的只是一個IUNKNOWN指針,你必須通過代碼請求特定的接口,看看你是否得到了一個不是NULL的答案。
由於SelectedItem
propery的類型是object,這意味着類型庫只是簡單地說「返回類型是IUNKNOWN類型的接口指針」(它可能是IDISPATCH,但原理是stand)。確切的類型顯然取決於運行時環境 - 「現在選擇什麼」。
(在.NET中,返回類型實際上是System.__ComObject
,因爲你沒有得到一個裸體的接口指針但COM調用包裝它基於.NET代理的對象)
你是在憐憫庫的(poor?)文檔來獲取返回對象可能支持的接口類型。缺乏這一點,像Chibacity的代碼也可能會給你一個部分列表(我還沒有審查過這個代碼)。最終,您可能希望在調試期間使用該代碼獲取候選接口列表。只要使用C#as
運算符(這會導致COM可調用包裝器針對本機對象發出相應的COM法術),您可以節省一些打字的麻煩。
我不認爲`IsAssignableFrom`在這種情況下工作。 – 2010-12-02 20:35:06
@Nicolas你確定嗎? – 2010-12-02 20:36:50