gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:13 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com