2010-05-14 76 views
5

COM中的雙接口是能夠通過DispInterface或通過VTable方法訪問的接口。COM雙接口

現在有人可以告訴我兩種方法的區別究竟是什麼?

我以爲VTable是一個虛擬表,當實現一個具有虛擬函數並可以在子類中重寫的類層次結構時,該虛表包含指向不同函數的指針。但是我不明白這與COM中的雙接口有什麼關係?

回答

2

簡而言之,COM是二進制規範,而不是語言規範。雙接口和代碼中派生類之間確實沒有關聯。蘋果和桔子。

該VTable是「早綁定」,因此這更快。你知道你在編譯時調用的方法的類型。

使用DispInterface是「後期限制」,因此速度較慢,但​​更靈活。它廣泛用於腳本編寫。方法和屬性類型在運行時確定。

我希望這個簡短的解釋有幫助。

+0

「二元規格」究竟是什麼意思? – 2010-05-14 17:50:51

+2

@Tony:這意味着COM只解決組件如何在二進制級別進行通信 - 它沒有說明組件是如何開發的,或者代碼是用什麼語言編寫的,或者是否存在「類層次結構」。請參閱組件對象模型:技術概述@ http://msdn.microsoft.com/zh-cn/library/ms809980。aspx – 2010-05-14 18:28:23

+0

+1表示早期與晚期結合。 – 2010-05-14 18:28:48

3

主要區別在於調用對象方法。如果DispInterface調用通過IDispatch :: Invoke方法(用於腳本或缺少接口說明),請參閱remarks。這種方法第二種選擇要慢得多。在第二種情況下,直接使用VTable進行方法調用(用於C++或.NET語言的調用)

+0

因此,IDispatch上的invoke方法用於從腳本(如VBScript或JScript)調用方法? – 2010-05-14 17:59:35

+0

@Tony Correct - 如果你希望COM對象在腳本中可用,你需要一個雙接口。 – 2010-05-15 02:16:33

+1

是的,當你在腳本中調用一個方法時,它首先調用IDispatch :: GetIDsOfNames,然後調用IDispatch :: Invoke – Victor 2010-05-15 09:59:20

1

我只想回答Tony的其他問題。

如果你想創建一個可以從VBScript/JScript或從舊的「經典」ASP訪問的COM,你必須實現IDispatch。

在Visual Basic 6或MS Office的VBA中,可以使用兩種方法。如果你添加引用到你的COM,那麼你將使用「早期綁定」(IUnknown或VTable)。如果您在VB6或VBA中使用您的COM與CreateObject(「ProgIdName」),您將使用「遲到」。

理解,使COM可以從VB6/VBA等訪問是非常重要的。僅僅實現IUnknown接口是不夠的。您必須創建並註冊類型庫與oleautomation屬性。爲了做到這一點,您可以在您的COM接口中只使用oleautomation兼容的數據類型(請參閱http://msdn.microsoft.com/en-us/library/aa367129%28VS.85%29.aspx)。爲了理解類型庫扮演客戶端編組DLL的角色,所以它幫助像VB6/VBA這樣的客戶端軟件將數據作爲參數正確地發送到您的COM。你不應該忘記,即使你的COM將是一個InProc服務器,一個DLL,參數將不會直接轉發給COM,而是需要編組。在編組期間,將在運行COM的線程上創建數據副本。它使您的COM DLL線程從一側安全,如果調用COM方法的線程在COM返回值之前結束,您的COM將不會崩潰。

大概我對封送處理的解釋並不容易,但它很重要,不要忘記創建並註冊類型庫,它更適合作爲資源保存在COM中。