Является ли COM одним типом интерфейса DLL, или DLL является одним из типов интерфейса COM?
Да и нет. Сам по себе COM не имеет ничего общего с экспортом DLL как таковым, но он часто реализуется через одну или несколько точек входа DLL для серверов inproc.
В этом случае в реестре хранится некоторая бухгалтерская информация, позволяющая найти библиотеку DLL (имя которой не обязательно должно именоваться *.dll
), а точка входа DllGetClassObject
может быть неявно вызвана при каждом создании экземпляра COM. объект через. Поэтому, когда вы вызываете CoCreateInstance
или CoCreateInstanceEx
и даете CLSID / GUID, то, что происходит за кулисами, заключается в том, что зарегистрированные реестры COM ищутся в реестре, чтобы выяснить механизм (из которых DLL), а затем в случае DLL будет вызвана функция DllGetClassObject
для создания запрошенного вами экземпляра. Теоретически вы можете делать все это и вручную. COM просто предоставляет хороший способ скрыть кровавые детали и предоставить вам этот унифицированный уровень абстракции сверху.
Примечание: DLL-библиотеки COM являются собственными DLL-библиотеками для Windows, но библиотеки DLL вообще не имеют ничего общего с COM. Библиотеки DLL предоставляют только один способ реализации COM-объектов - особенно для серверов COM InProc.
Часто в такой COM DLL есть четыре функции:
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
Если я вызываю Native (не .net) C ++ DLL из Python с использованием ctypes, это с помощью COM?
Нет. Насколько мне известно, существуют отдельные механизмы Python для COM на Windows. См. здесь .
Редактировать: COM против ActiveX
COM, ActiveX и OLE - это имена, по сути, одних и тех же базовых механизмов с максимально слегка измененным фокусом (например, в случае ActiveX).