c++ - 新手关于COM的问题

标签 c++ com dll

我对 COM 很陌生,所以这个问题可能看起来很幼稚。

Q1。关于 Windows DLL

根据我的理解,Windows DLL 可以导出函数、类型(类)和全局变量。这样理解可以吗?

Q2。关于 COM

我天真的理解是:COM DLL 似乎只是一种新的逻辑方式来组织标准 Windows DLL 导出的函数和类型。 COM DLL 导出函数,例如 DllRegisterServer()DllGetClassObject(),以及实现 IUnknownClasses 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/

相关文章:

c++ - 无法运行程序 “g++” : Launching failed - Eclipse C++

c++ - CUDA 条件线程同步

java - Java 中的尾递归编程

c++ - 在 C++ 中使用 COM 属性或 COM setter 和 getter 是最佳实践吗?

c++ - 设置 DLL 以实现与 C#/托管代码的免注册 COM 互操作

c# - 如何将 DLL 访问代码从 C++ 移植到 C#

C++ 类内部结构在其方法中动态分配

c# - 尝试包装 COM 接口(interface)使其 IDisposable 时出现意外的 C# 编译器错误

c# - 编译一个dlib的.dll文件

c# - 从 C# 调用 C dll 中的函数,它返回某种指向函数指针的指针