COM和Windows DLL之间有什么关系?

4

一个容易被嘲笑的问题。

COM是一种DLL接口类型,还是DLL是COM接口类型中的一种?

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

1个回答

4

COM是DLL接口的一种类型吗?还是DLL是COM接口的一种类型?

有也有没有。就本质而言,COM与DLL导出没有任何关系,但它通常通过一个或多个进程内服务器的DLL入口点来实现。

在这种情况下,注册表保存一些簿记信息,以便找到DLL(不一定要命名为*.dll),并在您通过实例化COM对象时隐式调用DllGetClassObject入口点。因此,当您调用CoCreateInstanceCoCreateInstanceEx并给出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的情况下)。


好的,Windows DLL是COM实现的一种形式。我想知道ActiveX在这个情况下是否有所涉及? - Sideshow Bob
@Sideshow Bob:我编辑了我的答案。当通过DLL实现COM服务器时,确实只有一种实现形式。另一种是外部进程服务器及其扩展形式COM+,可跨机器工作。这就是COM和RPC混合的地方... - 0xC0000022L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接