我不知道为什么有人反对这个问题。对我来说,这似乎是一个完全正确的问题;也许他们今天早上还没有喝咖啡。
您似乎在问 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 中注册。