2017-10-11 7 views
0

Ich versuche, Objekte von .NET-Laufzeit von VBA (Word/Excel) aufzurufen. Dies funktioniert: oT = CreateObject("System.Text.UTF8Encoding") Aber nicht diese: CreateObject("System.Management.Automation.Runspaces.RunspaceFactory") Der Fehler ist: Laufzeitfehler '429'; ActiveX-Komponente kann Objekt nicht erstellenVisual Basic - Aufruf von .NET-Laufzeit

Was ich nicht verstehe ist, wie Excel/Word-legt fest, welche Klassen ausgesetzt sind und welche nicht

+0

Einfach: Excel/Word wird nicht einmal entfernt beteiligt. Es ist die Aufgabe der VBE, nicht die der Host-Anwendung. –

+0

Woher weiß VBE, was zugänglich ist und was nicht? – Konrads

+1

Nur eine Teilmenge der .NET-Klassen ist [ComVisible (true)]. Meistens das, was in .NET 1.0 war, damals, als es noch wichtig war, Programmierer dazu zu bewegen, auf dem .NET-Zug aufzuspringen und sie nicht dazu zu zwingen, alles neu zu schreiben, was sie hatten. Sie müssen Ihren eigenen [ComVisible] -Wrapper erstellen. –

Antwort

3

Das Argument Sie angeben, wenn CreateObject Aufruf ist kein Namespace, Es handelt sich um eine ProgId - eine Zeichenfolge, die COM verwendet, um registrierte Klassen (und die Bibliothek, in der sie definiert sind und wo sich diese Bibliothek befindet) in der Windows-Registrierung zu suchen.

Wenn es keinen registrierten COM-Typ mit einem ProgId Wert von System.Management.Automation.Runspaces.RunspaceFactory gibt, kann ActiveX dieses Objekt nicht erstellen.

Wenn es keine COM-Typbibliothek für einen Namespace gibt (d. H. Die Assembly ist nicht für COM-Interop registriert), versuchen Sie COM von .NET/verwaltetem Code verstehen zu lassen, was nicht möglich ist.

Was ich nicht verstehe ist, wie Excel/Word-legt fest, welche Klassen ausgesetzt sind und welche nicht

Excel/Word/was auch immer Host-Anwendung nichts damit zu tun hat, ist es VBA eigene Laufzeit, die die COM-Typen lädt, und es ist die Windows-Registrierung, die ProgId für alles enthält, was registriert ist.

Wenn Sie Ihre Registrierung für Scripting.Dictionary unter HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID suchen, werden Sie schließlich einen Schlüssel finden {EE09B103-97E0-11CF-978F-00A02463E06F} genannt, mit einem ProgID Unterschlüssel einen Wert von Scripting.Dictionary und einen InprocServer32 Unterschlüssel mit einem Wert von C:\Windows\system32\scrrun.dll hat, und wenn die VBA-Laufzeit erfolgreich bei Wenn Sie eine Instanz des Typs mit der angegebenen Nummer ProgId in dieser Typbibliothek erstellen, ist der Aufruf CreateObject erfolgreich und gibt die Instanz zurück. Andernfalls wird der Fehler 429 ausgegeben und "ActiveX kann kein Objekt erstellen" angezeigt.

+3

FWIW - 'ProgId' ist für ein' CreateObject' nicht zwingend erforderlich - an dessen Stelle kann eine CLSID verwendet werden, die in manchen Fällen hilfreich sein kann, wenn ein COM-konformes Objekt keine 'ProgID' hat. Ein gutes Beispiel ist das 'MSForms.DataObject' von MS Forms 2.0 Library, dem eine' ProgID' fehlt: 'Set objData = CreateObject (" Neu: {1C3B4210-F441-11CE-B9EA-00AA006B1A69} ")' – this