【问题标题】:What is the relationship between COM and windows DLLs?COM 和 windows DLL 之间有什么关系?
【发布时间】:2012-01-18 15:22:22
【问题描述】:

大量问题提醒。

COM 是一种 DLL 接口,还是 DLL 是一种 COM 接口?

如果我使用 ctypes 从 Python 调用 Native(不是 .net)C++ DLL,那是使用 COM 吗?

【问题讨论】:

    标签: python dll com ctypes


    【解决方案1】:

    COM 是一种 DLL 接口,还是 DLL 是一种 COM 接口?

    是和不是。本身 COM 与 DLL 导出本身没有任何关系,但它通常通过一个或多个用于 inproc 服务器的 DLL 入口点来实现。

    在这种情况下,注册表保存一些簿记信息,以便可以找到 DLL(不必将其命名为 *.dll),并且可以在实例化 COM 时隐式调用 DllGetClassObject 入口点对象通过。因此,当您调用 CoCreateInstanceCoCreateInstanceEx 并给出 CLSID/GUID 时,幕后发生的事情是在注册表中查找已注册的 COM 类以找出要使用的机制(其中一个 DLL),然后如果是 DLL,函数 DllGetClassObject 将被调用以创建您请求的实例。理论上,您也可以手动完成所有这些操作。 COM 只是提供了一种很好的方式来隐藏血淋淋的细节,并在顶部为您提供统一的抽象层。

    注意: COM DLL 是 Windows 上的 DLL,但 DLL 通常与 COM 无关。 DLL 仅提供一种实现 COM 对象的方法 - 专门用于 COM InProc 服务器。

    在这样的 COM DLL 中通常有四个函数:

    • DllCanUnloadNow
    • DllGetClassObject
    • DllRegisterServer
    • DllUnregisterServer

    如果我使用 ctypes 从 Python 调用 Native(不是 .net)C++ DLL,那是使用 COM 吗?

    没有。据我所知,Windows 上的 COM 有单独的 Python 机制。见here

    编辑: COM 与 ActiveX

    COM、ActiveX 和 OLE 都是基本相同的底层机制的名称,只是焦点稍有不同(例如 ActiveX)。

    【讨论】:

    • 好的,Windows DLL 是 COM 实现的一种形式。我想知道你能告诉我 ActiveX 是否/如何进入这张图片吗?
    • @Sideshow Bob:我编辑了我的答案。当 COM 服务器通过 DLL 实现时,实际上只是一种实现形式。另一种是进程外服务器及其扩展形式的 COM+,它可以跨机器工作。这就是 COM 和 RPC 混合的地方......
    猜你喜欢
    • 1970-01-01
    • 2012-09-30
    • 2011-11-29
    • 2013-10-30
    • 2015-01-02
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多