簡體   English   中英

COM 接口問題 - .NET

[英]COM Interface question - .NET

最近我正在閱讀有關互操作編組的文章,但我仍然不明白一件事。 為了使 .NET 程序集對 COM 可見,我需要使用 tlbexp 工具和/或 regasm 工具。 為了使 COM 對 .NET 可見,我必須使用 tlbimp 工具——這對我來說很清楚。

  1. 除此之外,我在互聯網上看到了很多處理帶有 guid 屬性、IUnknown 和 IDispach 的 COM 接口的代碼。

我的問題是所有這些與 COM 有何關系——我需要使用它嗎? 我正在准備認證,但他們沒有說關於接口、guids、IUnknown 等...

我不太喜歡把不清楚的事情拋在腦后,所以如果有人能解釋一下,我將不勝感激。

  1. 我還有一個關於從 COM(tlbimp 工具)導入的類型庫的問題。 從 COM 導入的類型庫是否還需要在系統中注冊 COM 對象?

親切的問候 PK

我不知道為什么有人反對這個問題。 對我來說,這似乎是一個完全有效的問題; 也許他們今天早上還沒有喝咖啡。

您似乎在問 GUID、IUnknown 和 IDispatch 與 COM 有什么關系。 我將嘗試做一個簡短的調查。

每個 COM 組件都公開一個公共接口 IUnknown。 IUnknown 具有 AddRef()、Release() 和 QueryInterface() 方法。 AddRef() 和 Release() 用於支持引用計數,因此當對對象的每個引用都被釋放時,該對象將被銷毀。 QueryInterface() 有點像 C++ 中的 dynamic_cast<> 運算符的 COM 版本。 客戶端代碼使用它來查看他們擁有的 IUnknow 指針是否實際指向另一種類型的對象,如 IDog、ICat 或其他類型的對象。

所以每個 COM 組件都必須實現 IUnknown,但大多數 COM 庫會自動為您實現這一點,因此當您編寫 COM 代碼時,您通常不必編寫任何代碼來獲取 IUnknown; 你免費得到它。

GUID 有點像指紋。 就像在現實生活中兩個人可以擁有完全相同的名稱一樣,在 COM 中兩個 COM 組件也可以具有相同的名稱。 例如,您可以有 2 個都實現 IDog 接口的庫,但它們可能做完全不同的事情。 但是,您仍然應該能夠在您的機器上安裝這兩個庫,並且區分這兩個庫是 GUID 的用途。 GUID 是一個全球唯一標識符,這意味着當您生成一個時,理論上地球上的任何其他人在任何其他時間點都無法創建相同的 GUID。 因此,除了名稱之外,每個 COM 對象(以及協同類和庫等)都有一個 GUID。

IDispatch 是另一個基本接口,很像 IUnknown,但與每個 COM 對象都需要的 IUnknown 不同,IDispatch 是可選的,並提供許多但並非所有 COM 對象都支持的特殊功能。 諸如支持特定語言功能並使您的對象更易於客戶使用之類的事情。 大多數(可能)COM 對象公開此接口。

關於 COM 庫; 是的,它們必須在 Windows 中注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM