2017-02-01 9 views
2

Ich versuche, das Beispiel für den externen Zugriff auf ein RhinoScript-Modul aus Excel (in meinem Fall Excel 365 unter Windows 10) mit einer Standardmethode zu folgen.VB - Warten auf Objekterstellung

Dim Rhino As Object 
Dim RhinoScript As Object 

Set Rhino = CreateObject("Rhino4.Application") 
Set RhinoScript = Rhino.GetScriptObject() 

Aber ich renne in einen „Runtime 424 - Objekt erforderlich“ Fehler in der letzten Zeile.

Das Problem scheint zu sein, dass GetScriptObject nicht darauf wartet, dass CreateObject vollständig ausgeführt wird, denn während Rhino4 gestartet wird, fordert mich die Benutzerkontensteuerung von Windows 10 dazu auf, dem Updater Änderungen am System zu erlauben, bevor er hochfährt die GUI. Wenn ich diese Anweisungen debugge und zeilenweise gehe, damit Rhino4 Zeit hat, vollständig zu starten, bevor GetScriptObject eintrifft, funktioniert alles. Gibt es also Möglichkeiten, GetScriptObject warten zu lassen, bis Rhino4 vollständig gestartet ist? Ich habe versucht, eine Schleife einzurichten, die Rhinos Wert überprüft (Nichts?), Aber es fällt sofort durch. Ich bin ein wenig neu in VB, also entschuldige mich für eine Frage, die ein Neuling sein könnte.

Danke,

Matt

+2

Kannst du einen Verweis auf Rhino von VBA hinzufügen, um einen Einblick in die Automatisierung zu bekommen? –

+3

nach dem Aussehen dieser einige API-Programmierung erforderlich ist https://github.com/dalefugier/TestVbAutomation und http://4.rhino3d.com/5/rhinoscript/introduction/external_access.htm. Ich stimme @ Mats Becher zu, du musst den Fehler wiederholen, nicht den Nichts-Status, ich würde einen Wiederholungszähler in die Mischung aufnehmen, nur für den Fall, 100000 Versuche sagen, und eine kleine Verzögerung mit dem Schlaf API vor dem Versuch . –

+0

Ich habe den Link zur externen Zugangsseite @Nathan_Sav nicht gesehen. Ich habe nur die .chm Hilfedatei verwendet, die mit Rhino3D geliefert wurde. Danke für die Referenz. Hoffentlich hilft das mein Problem zu lösen. – tranzmatt

Antwort

5

Ich weiß nichts von dem Rhino-API gibt kann ein besserer Weg, dies zu tun.

Wenn Sie wissen , dass die Laufzeitfehler durch verursacht wird, was Sie beschreiben, und dass Rhino.GetScriptObject ist schließlich gelingen würde, können Sie Schleife, bis es funktioniert:

Dim iterations As Integer 'max value: 32,767 
Do 
    iterations = iterations + 1 'will *eventually* overflow if loop keeps failing 
    On Error Resume Next 'switch off error handling 
    Set RhinoScript = Rhino.GetScriptObject 
    On Error GoTo 0 'restore error handling (IMPORTANT!) 
    If Err.Number <> 0 And Err.Number <> 424 Then Err.Raise Err.Number ' rethrow 
    Err.Clear 
    DoEvents ' so that the host app remains responsive while the loop runs 
While RhinoScript Is Nothing 

Hinweis das erneute Anheben des Fehlers, wenn die Nummer etwas anderes ist als das erwartete 424; Dies ist (um zu versuchen) eine Endlosschleife zu verhindern, wenn die Situation hoffnungslos ist.

Nathan made a good comment über das Hinzufügen eines zusätzlichen Schutzes gegen Endlosschleifen - hier durch Inkrementieren eines Zählers, bis sein Wert seinen Typ überschreitet (Laufzeitfehler 6 wird erhöht). Sie können auch eine Konstante und eine If Prüfung verwenden, wenn 32.768 Iterationen zu lange ein Timeout ist.

Wahrscheinlich nicht die beste Lösung, aber sollte arbeiten. Im Idealfall würden Sie die Rhino4.Application-API untersuchen, um festzustellen, ob sie ein Mitglied verfügbar macht, das verwendet werden könnte, um festzustellen, ob die Instanz "bereit" zur Verwendung ist. IsReady oder State vielleicht.

+0

Ja, sowohl Sie als auch @Nathan_Sav haben hilfreiches Feedback gegeben. Danke für die Hinweise. Hoffentlich wird dies mein Problem lösen. Der ursprüngliche Code wurde für Rhino v3, XP und Excel 2010 erstellt, also waren Dinge wie UAC kein Problem. Windows 10 und Excel 365 scheinen die Arbeiten verklebt zu haben: p. – tranzmatt