/ / win32com COM-Methode ruft den Namen des Objekttyps anstelle von Objekt zurück - python, win32com

Win32com-COM-Methode ruft den Namen des Objekttyps anstelle von Objekt zurück - python, win32com

Meine Firma hat eine interne C # -Bibliothek, die ich binversuchen, von CPython 2.7 mit win32com aufrufen. Wir haben ein Objekt, das ich Type1 aufrufen werde, das sich in einem C # -Namespace befindet, den ich Company.System.SubSystem1 nennen werde. Eine bestimmte Methode dieses Objekts (nennen wir es GetCurrentType2Object) gibt ein Objekt vom Typ Company.System.SubSystem2.Type2 zurück, dessen Code ich wie folgt habe:

import win32com.client
type1_object = win32com.client.Dispatch("Company.System.SubSystem1.Type1")
type2_object = type1_object.GetCurrentType2Object()

Das Problem ist, dass type2_object kein Type2-Objekt zugewiesen wird; Es erhält die Zeichenfolge "Company.System.SubSystem2.Type2".

Es gibt andere Methoden für dasselbe Objektreturn void, integers oder enum-Werte, und alle scheinen erfolgreich zu sein. Es gibt keine andere Methode, die einen Klassentyp für mich zurückgibt, dies ist der einzige.

Ich habe versucht, das Makepy zu verwenden.py Skript in der betreffenden Bibliothek vor dem Ausführen meines Codes, und es hat seine eigenen Probleme, bevor sogar so weit; Die erzeugte Datei scheint eine kleine Teilmenge der tatsächlichen Schnittstelle zu enthalten, die nicht viele der Methoden enthält, die ich brauche. Der Microsoft COM-Objekt-Viewer zeigt die gleiche Teilmenge, also kann ich das nicht dem Skript zuschreiben, und ich habe es aufgegeben, es herauszufinden.

Ich bin mir IronPython bewusst, und ich kann sehr gut endenIch benutze es stattdessen, da dies eine viel weniger umständliche Art der Arbeit mit .NET-Code wäre, aber ich würde wirklich gerne verstehen, was hier passiert, bevor ich irgendwelche Entscheidungen treffe, und nur um meine eigene Neugier zu befriedigen.

Antworten:

0 für die Antwort № 1

Es scheint, dass was Win32com passiert ist.client.dynamic entscheidet, dass die Methode, die ich aufrufen möchte, tatsächlich eine Eigenschaft ist, und daher wird die Methode nicht korrekt aufgerufen. Ich bin nicht sicher, weil ich nicht wirklich verstehe, wie diese Entscheidung getroffen wird, aber ich konnte das Problem umgehen, indem ich eine Methode erzwinge, die anstelle einer Eigenschaft generiert wird. Sie können das tun, indem Sie win32coms _FlagAsMethod aufrufen. Für das Beispiel in der Frage würde das so aussehen:

type1_object._FlagAsMethod("GetCurrentType2Object")

Tun Sie das, bevor Sie versuchen, GetCurrentType2Object aufzurufen, und alles funktioniert einwandfrei.