一个容易被嘲笑的问题。
COM是一种DLL接口类型,还是DLL是COM接口类型中的一种?
如果我使用ctypes从Python调用Native(而不是.NET)C++ DLL,那么这是使用COM吗?
COM是DLL接口的一种类型吗?还是DLL是COM接口的一种类型?
有也有没有。就本质而言,COM与DLL导出没有任何关系,但它通常通过一个或多个进程内服务器的DLL入口点来实现。
在这种情况下,注册表保存一些簿记信息,以便找到DLL(不一定要命名为*.dll
),并在您通过实例化COM对象时隐式调用DllGetClassObject
入口点。因此,当您调用CoCreateInstance
或CoCreateInstanceEx
并给出CLSID/GUID时,背后发生的事情是在注册表中查找已注册的COM类,以确定使用的机制(其中DLL是一种),然后在DLL的情况下,将调用DllGetClassObject
函数来创建您请求的实例。理论上,您也可以手动完成所有这些操作。COM只是提供了一种很好的方法来隐藏可怕的细节并在其上提供统一的抽象层。
注意:COM DLLs是Windows上的DLL,但一般的DLL与COM无关。DLL提供了一种实现COM对象的方法 - 特别是用于COM InProc服务器。
通常,这样的COM DLL中有四个函数:
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
如果我使用ctypes从Python调用本地的(非.NET)C++ DLL,那么这是否使用了COM?
不是。据我所知,在Windows上有单独的Python机制用于COM。请参见here。
编辑:COM vs ActiveX
COM、ActiveX和OLE基本上是同一底层机制的不同名称,最多略有不同的重点(例如在ActiveX的情况下)。