我对 COM 很陌生,所以这个问题可能看起来很幼稚。
Q1。关于 Windows DLL
根据我的理解,Windows DLL 可以导出函数、类型(类)和全局变量。这样理解可以吗?
Q2。关于 COM
我天真的理解是:COM DLL 似乎只是一种新的逻辑方式来组织标准 Windows DLL 导出的函数和类型。 COM DLL 导出函数,例如 DllRegisterServer() 和 DllGetClassObject(),以及实现 IUnknown的 Classes em> 界面。这样理解可以吗?
Q3。 *.def & *.idl
*.def 用于定义Windows DLL 以传统方式导出的函数,例如DllGetClassObject()。 *.idl 用于定义由 COM 组件类实现的接口(interface)。
提前致谢。
最佳答案
将 COM 视为一种跨 DLL 边界共享接口(interface)的二进制兼容方式。由于在不同编译器版本之间进行了非标准名称修改,因此无法轻松地从 DLL 中导出 C++ 类。 COM 允许一个 DLL 或可执行文件中的代码从另一个 DLL 或 EXE 创建接口(interface)的实现,只要该实现遵循已定义的接口(interface)和调用约定。这就是允许用 C# 编写 COM 类并从 C++、Python 和许多其他支持 COM 的语言调用它的原因。
COM 接口(interface)只是标准的 C++ 类,包含所有纯虚函数并派生自 IUnknown。 IUnknown 是一个预定义的接口(interface),所有兼容的 COM 接口(interface)都必须派生自该接口(interface),它提供了通用设施,例如引用计数和查询对象是否实现特定接口(interface)的能力。
希望通过导出 4 个函数来宣传它们可以创建 COM 接口(interface)的实现的 DLL:
- DllGetClassObject => 返回请求接口(interface)的类工厂
- DllCanUnloadNow => 是否所有分发的实例都已释放
- DllRegisterServer => 在注册表中注册此 DLL 提供的类型
- DllUnregisterServer => 从注册表中注销此 DLL 及其类型
所以回答你的问题:
Q1. About Windows DLL Based on my understanding, a Windows DLL can export functions, types(classes) and global variables. Is this understanding all right?
DLL 可以导出函数和类(不确定全局变量,但即使可以,您也不希望将它们导出为 DLL!:-))但是,导出的类将被名称损坏,因此只能由其他人使用碰巧具有相同名称的 DLL 或 EXE 重整(这不是做生意的好方法)。具有 C 风格调用约定的函数没有名称损坏,因此可以毫无问题地从其他地方导出和调用。
Q2. A COM DLL exports both functions such as DllRegisterServer() and DllGetClassObject(), and also the Classes which implements the IUnknown interface. Is this understanding all right?
中途,有 4 个函数可以导出为完整的 COM 兼容 DLL(如上所示)。您可以在 MSDN 中搜索这些名称中的任何一个,以查看它们的完整签名。您对 DllGetClassObject 的实现将成为外部各方将使用的主要实现。他们可以使用它来获取一个 IClassFactory 到您的 DLL 提供的接口(interface),然后使用它来创建一个实例。
COM 是一个庞大而复杂的野兽,但它的基础相当简单。您也可以查看此链接 COM Intro了解更多信息。祝你好运!
关于c++ - 新手关于COM的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2527739/