2017-10-11 138 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