2017-10-11 328 views
0

我想從VBA(Word/Excel)從.net運行時調用對象。 這工作: oT = CreateObject("System.Text.UTF8Encoding") 但不是這樣的: CreateObject("System.Management.Automation.Runspaces.RunspaceFactory") 的錯誤是: 運行時錯誤 '429'; ActiveX組件不能創建對象Visual Basic - 調用.net運行時

我不明白的是Excel中/ Word確定哪些類是暴露的,哪些不是

+0

簡單:Excel/Word甚至不會遠程參與。這是VBE的工作,而不是主機應用程序的工作。 –

+0

那麼VBE如何知道什麼是可訪問的,哪些不可以? – Konrads

+1

只有.NET類的一個子集是[ComVisible(true)]。大部分是.NET 1.0中的東西,當讓程序員轉向.NET的潮流並不強迫他們重寫他們所擁有的所有東西時,仍然很重要。你必須創建你自己的[ComVisible]包裝器。 –

回答

3

時指定調用CreateObject不是命名空間的說法,它是一個ProgId - 一個字符串COM用於在Windows註冊表中查找註冊類(以及它們定義的庫以及該庫所在的位置)。

如果沒有使用ProgIdSystem.Management.Automation.Runspaces.RunspaceFactory的註冊COM類型,則ActiveX無法創建該對象。

如果沒有用於名稱空間的COM類型庫(即該程序集沒有爲COM互操作註冊),那麼您試圖讓COM瞭解它無法執行的.NET /託管代碼。

我不明白的是Excel中/ Word確定哪些類是暴露的,哪些不是

的Excel /字/任何主機應用程序無關,它是VBA自己的加載COM類型的運行時,它是Windows註冊表,包含ProgId註冊的所有內容。

如果您搜索HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID下你對註冊表Scripting.Dictionary,你最終會找到一個名爲{EE09B103-97E0-11CF-978F-00A02463E06F}鍵,用ProgID子項具有Scripting.Dictionary值和InprocServer32子項與C:\Windows\system32\scrrun.dll的值,如果VBA運行在成功創建該類型庫中指定的ProgId類型的實例,然後CreateObject調用成功並返回該實例。否則,它會拋出錯誤429並說「ActiveX無法創建對象」。

+3

FWIW - 'CreateObject'並不是嚴格需要''ProgId' - 在它的位置可以使用CLSID,在符合COM的對象沒有'ProgID'的某些情況下可以使用CLSID。一個很好的例子是MS Forms 2.0庫中的'MSForms.DataObject',它缺少'ProgID':'Set objData = CreateObject(「New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}」) – this