2009-01-14 85 views
0

我對「傳統」.dll的工作有很好的瞭解。此外dynamic loadingstatic loading之間的差異等關於COM/ActiveX對象的問題

但我對COM對象的工作如下疑問,

  • 是否必須與regsvr32註冊COM對象?
  • 我可以有兩個版本的註冊COM object躺在相同/不同的目錄?
  • 除了封裝在.dll文件中,「傳統」.dllCOM object之間還有什麼共同點?

回答

4

1)否 - 不需要註冊COM 對象。需要註冊才能創建新的 COM對象。有很多接口(COM或本地函數)需要COM對象。他們的API告訴你你的COM對象應該支持哪個接口。既然你傳入一個現有的COM對象,他們不需要註冊信息來創建你的COM對象。此場景的一個變體是RUnning對象表,您可以在其中註冊已創建的COM對象。這些對象也是由你創建的,你不需要註冊信息。

接口示例:IQueryCancelAutoplay。

2)A COM 對象存在於內存中。您可能正在考慮一個COM ,它與COM工廠一起在一個DLL中實現。 COM類是通過它們的GUID註冊的。每個DLL可以有多個類= GUID,但每個類只能有一個DLL。請記住,調用者向COM請求您的班級實例。如果有兩個DLL實現相同的類,哪個DLL會加載?! 當然,可以有兩個DLL實現一個類,其中兩個類共享一些接口。他們總是分享的IUnknown,例如,經常IDispatch接口,但很少IAcmeCorpFooBarv2

3)COM DLL 正常的DLL其中(a)暴露了一些特定的COM-功能和(b)被註冊,因此COM framewrok可以調用它的LoadLibrary。該DLL還可能暴露其他非COM功能。因此,您可以自己在COM DLL上調用LoadLibrary。這有時可能有助於減少創建第一個COM對象所涉及的延遲。

4

是的,COM程序集已註冊,以便COM基礎結構知道它們存在。這些DLL是通過註冊CLSID而不是通過路徑找到的。

如果兩個版本具有不同的名稱(顯然,您不能在文件夾中具有相同的命名文件),那麼兩個版本可能共存。

所有的COM對象都實現了特定的接口(IUnknown,很多都有IDispatch)。 COM的工作方式真是一種超越我們可以在這裏發表的主題。你可能會得到一本像ATL Internals這樣的書,或者運行一些在線COM教程。

3

1)它是強制性的,如果你不使用一種叫做Reg-Free COM

2)兩個COM對象具有相同的CLSID到進程id映射不能註冊進行註冊。

3)最終傳統的dll和COM DLL都包含機器碼。如果它不是用於實現接口,那麼編寫代碼的方式也沒有多大區別。