2

最近我正在阅读有关互操作编组的内容,但我仍然不明白一件事。为了使 .NET 程序集对 COM 可见,我需要使用 tlbexp 工具和/或 regasm 工具。为了使 COM 对 .NET 组件可见,我必须使用 tlbimp 工具——这一切对我来说都很清楚。

  1. 除此之外,我在互联网上看到了很多处理具有 guid 属性、IUnknown 和 IDispach 的 COM 接口的代码。

我的问题是所有这些与 COM 有什么关系——我需要使用它吗?我正在准备认证,但他们没有说任何关于接口、指南、IUnknown 等的信息……

我真的不喜欢留下不清楚的东西,所以如果有人可以向我解释一下,我将非常感激。

  1. 我还有一个关于从 COM(tlbimp 工具)导入的类型库的问题。从 COM 导入的类型库是否还需要在系统中注册 COM 对象?

亲切的问候PK

4

1 回答 1

3

我不知道为什么有人反对这个问题。对我来说,这似乎是一个完全正确的问题;也许他们今天早上还没有喝咖啡。

您似乎在问 GUID、IUnknown 和 IDispatch 与 COM 有什么关系。我将尝试做一个简短的调查。

每个 COM 组件都公开一个公共接口 IUnknown。IUnknown 有 AddRef()、Release() 和 QueryInterface() 方法。AddRef() 和 Release() 用于支持引用计数,因此当对对象的每个引用都被释放时,该对象将被销毁。QueryInterface() 有点像 COM 版本的 C++ 中的 dynamic_cast<> 运算符。客户端代码使用它来查看他们拥有的 IUnknow 指针是否实际上指向另一个类型的对象,例如 IDog、ICat 或其他类型的对象。

所以每个 COM 组件都必须实现 IUnknown,但大多数 COM 库会自动为您实现这一点,因此当您编写 COM 代码时,您通常不必编写任何代码来获取 IUnknown;你免费得到它。

GUID 有点像指纹。就像现实生活中两个人可以有完全相同的名字一样,在 COM 中两个 COM 组件也可以有相同的名字。例如,您可以有 2 个库都实现了 IDog 接口,但它们可能会做完全不同的事情。但是,您仍然应该能够在您的机器上安装这两个库,并且区分这两者是 GUID 的用途。GUID 是全球唯一标识符,这意味着当您生成一个时,理论上地球上任何其他时间点上的其他人都无法创建相同的 GUID。因此,除了名称之外,每个 COM 对象(以及 coclass 和库等)都有一个 GUID。

IDispatch 是另一个类似于 IUnknown 的基本接口,但与每个 COM 对象都需要的 IUnknown 不同,IDispatch 是可选的,并提供许多但不是所有 COM 对象都支持的特殊功能。诸如支持某些语言功能并使您的对象更易于客户使用之类的事情。大多数(可能)COM 对象都暴露了这个接口。

关于 COM 库;是的,它们必须在 Windows 中注册。

于 2009-04-19T18:14:42.123 回答