【发布时间】:2012-01-18 15:22:22
【问题描述】:
大量问题提醒。
COM 是一种 DLL 接口,还是 DLL 是一种 COM 接口?
如果我使用 ctypes 从 Python 调用 Native(不是 .net)C++ DLL,那是使用 COM 吗?
【问题讨论】:
大量问题提醒。
COM 是一种 DLL 接口,还是 DLL 是一种 COM 接口?
如果我使用 ctypes 从 Python 调用 Native(不是 .net)C++ DLL,那是使用 COM 吗?
【问题讨论】:
COM 是一种 DLL 接口,还是 DLL 是一种 COM 接口?
是和不是。本身 COM 与 DLL 导出本身没有任何关系,但它通常通过一个或多个用于 inproc 服务器的 DLL 入口点来实现。
在这种情况下,注册表保存一些簿记信息,以便可以找到 DLL(不必将其命名为 *.dll),并且可以在实例化 COM 时隐式调用 DllGetClassObject 入口点对象通过。因此,当您调用 CoCreateInstance 或 CoCreateInstanceEx 并给出 CLSID/GUID 时,幕后发生的事情是在注册表中查找已注册的 COM 类以找出要使用的机制(其中一个 DLL),然后如果是 DLL,函数 DllGetClassObject 将被调用以创建您请求的实例。理论上,您也可以手动完成所有这些操作。 COM 只是提供了一种很好的方式来隐藏血淋淋的细节,并在顶部为您提供统一的抽象层。
注意: COM DLL 是 Windows 上的 DLL,但 DLL 通常与 COM 无关。 DLL 仅提供一种实现 COM 对象的方法 - 专门用于 COM InProc 服务器。
在这样的 COM DLL 中通常有四个函数:
DllCanUnloadNowDllGetClassObjectDllRegisterServerDllUnregisterServer如果我使用 ctypes 从 Python 调用 Native(不是 .net)C++ DLL,那是使用 COM 吗?
没有。据我所知,Windows 上的 COM 有单独的 Python 机制。见here。
编辑: COM 与 ActiveX
COM、ActiveX 和 OLE 都是基本相同的底层机制的名称,只是焦点稍有不同(例如 ActiveX)。
【讨论】: