空問題警報。COM和windows dll之間有什麼關係?
COM是DLL接口的一種類型,還是DLL是COM接口的一種類型嗎?
如果我使用ctypes從Python調用Native(而不是.net)C++ DLL,那是使用COM嗎?
空問題警報。COM和windows dll之間有什麼關係?
COM是DLL接口的一種類型,還是DLL是COM接口的一種類型嗎?
如果我使用ctypes從Python調用Native(而不是.net)C++ DLL,那是使用COM嗎?
COM是DLL接口的一種類型,還是DLL是COM接口的一種類型嗎?
是和否。每個COM與DLL導出本身無關,但它通常通過一個或多個inproc服務器的DLL入口點來實現。
在這種情況下,註冊表包含一些簿記信息,以便可以找到DLL(不必命名爲*.dll
),並且無論何時通過實例化COM對象,都可以隱式調用入口點。因此,當您撥打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
如果我調用本機(不是。淨)C++ Python使用ctypes的DLL,是使用COM?
不,據我所知,在Windows上有單獨的Python機制。見here。
編輯: COM VS的ActiveX
COM,ActiveX和OLE是基本上與至多一個稍微改變聚焦(例如ActiveX中的情況下)相同的基本機制的所有名字。
好,所以windows DLL是COM實現的一種形式。我不知道你能否告訴我這個圖像是否有ActiveX? –
@Sideshow Bob:我編輯了我的答案。當一個COM服務器通過一個實際上只是一個實現形式的DLL實現時。另一個是進程外服務器,它的擴展形式是COM +,它可以跨機器運行。這就是COM和RPC混合的地方...... – 0xC0000022L