2012-12-10 78 views
0

要麼我不理解COM對象,要麼是所有的混淆。 我經常在Python中使用VB(分別爲Obj = win32com.client.Dispatch('Visum.Visum')Obj = CreateObject("Excel.Application"))'創建','調度'COM對象。這很容易,明顯,一切都很好。 但我怎麼能: 一)連接到已經運行 二)COM對象獲取運行的是COM對象VB連接到COM對象

高度混亂(?COM對象,服務器連接,調度,註冊??)

由於對於claryfying 拉法爾 I2

+1

a)使用GetObject()函數。 b)沒有意義 –

回答

2

首先,我建議讀一本很好的介紹COM加載。就個人而言,我認爲Don Box的'基本COM'是關於COM的最好的書。花費幾個小時的時間將會在幾個小時後節省您的時間。

這就是說,讓我們來看看你的問題。

一)爲了獲取從VB現有的COM對象,你需要調用GetObject功能。這隻適用於使用Running Object Table註冊的COM對象。 Excel做到這一點,所以不應該有任何問題。

b)的漢斯·帕桑特正確地指出,這個問題就沒有意義了。進程和COM對象是完全不相關的東西,除了進程承載COM對象。它類似於詢問'哪些進程是類X的實例'。但是,一個進程可以託管一個COM對象(或其中的很多)。這些對象只能暫時存在,那麼你期望在那裏?此外,許多COM類都是在dll中實現的,但創建的實例顯然是託管在一個進程中 - 那麼您期望在那裏有什麼?

0

COM技術是我沒有沒一會兒使用,很抱歉,如果一些信息可能是錯誤的(反正我有我的書「內部COM +服務基地」跟我來! )

簡單地說,讓我們給一個COM對象的簡單定義:它不是別的,只是帶班露出下面的方法的標準接口IUnkown標準DLL:

  • 的AddRef:註冊客戶機消耗的COM對象
  • 發佈:註銷客戶端(通常使用的對象停止運行,但其他可能保持駐留)
  • 的QueryInterface:獲得一個功能

的QueryInterface的地址是用來動態地重新找出一個功能強大的函數(後期綁定)的地址(你不必在編譯時知道該DLL),但費時。另一方面,你可以在編譯時直接引用這些函數的地址,因爲這些DLL是在系統中註冊的(所有的信息都存儲在註冊表中)

創建一個新對象或獲取一個地址運行對象是通過RPC(遠程過程調用)完成的,它將加載和/或扮演代理的角色

因此,要創建COM對象的新實例,您將調用CreateObject(in VB)(Co)CreateInstance在VC++(甚至c#?)中,爲了獲得執行實例,您可能需要調用GetObject()。如前所述,COM對象不是別的,而是DLL:這意味着庫將主要加載到地址空間中每個進程都是私有的。即使對於在多個進程間共享對象的進程外COM對象(即:Excel是一個進程外COM對象:您不會將DLL加載到應用程序的地址空間中),它們由主機(rpc.exe或專有主機)

希望這有助於 塞爾