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

时间:2011-12-12 16:38:45

标签: python dll com ctypes

Numpty问题警报。

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

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

1 个答案:

答案 0 :(得分:4)

  

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

是和否。本身COM与DLL导出无关,但它通常通过inproc服务器的一个或多个DLL入口点实现。

在这种情况下,注册表包含一些簿记信息,以便可以找到DLL(不必将其命名为*.dll),并且每当有DllGetClassObject入口点都可以隐式调用通过实例化COM对象。因此,当您调用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的情况下)。