繁体   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