2017-08-30 2 views
0

Die getType Verfahren soll ein Objekt zurück, das die Art des Elements in die Methode übergeben darstellt:Reflexion kehrt com.sun.star.uno.XInterface Typ für alle Objekte

var serviceManager = new ActiveXObject('com.sun.star.ServiceManager'); 
var desktop = serviceManager.createInstance("com.sun.star.frame.Desktop"); 
var document = desktop.loadComponentFromURL("private:factory/swriter", "_blank", 0, []); 
var coreReflection = serviceManager.createInstance("com.sun.star.reflection.CoreReflection"); 

// should return a type representing the com.sun.star.frame.Desktop type 
var classInfo = coreReflection.getType(desktop); 

jedoch die classInfo immer scheint den com.sun.star.uno.XInterface Typen enthalten:

// outputs com.sun.star.uno.XInterface 
WScript.Echo(classInfo.getName()); 

Auch wenn ich in anderen Objekten zu übergeben, ist der Ausgang gleich:

classInfo = coreReflection.getType(document); 
WScript.Echo(classInfo.getName()); 

Wie kann ich den tatsächlichen Typ herausfinden?

(Ursprünglich bei ask.libreoffice veröffentlicht)

+0

Diese Fragen werden am häufigsten in den LibreOffice-Entwickler-Mailinglisten gestellt. Wahrscheinlich ist die einzige Person, die solche Fragen beantworten und Ratschläge geben kann, wie man eine gute Uno-Brücke implementiert, Stephan Bergmann, der bezahlter LibreOffice-Entwickler ist. – moggi

+0

@moggi Ich bin (noch) nicht daran interessiert, eine Uno-Bridge zu implementieren; Ich bin daran interessiert, [die vorhandene Automatisierungsbrücke] (https://wiki.openoffice.org/wiki/Documentation/DevGuide/ProUNO/Bridge/Automation_Bridge) zu verwenden; aber vielen Dank trotzdem. –

+0

selbst in diesem Fall könnte Stephan und die Mailingliste der beste Ansatz sein. Z.B. com.sun.star.frame.Desktop ist ein Service und kein Typ, aber nur Stephan oder möglicherweise Michael würden die Details wissen, warum getType XInterface anstelle einer der anderen Schnittstellen zurückgibt. – moggi

Antwort

0

Ich glaube, Sie sind für die "Umsetzung Namen" eher als die Suche "Interface-Typ Name."

Der folgende Code angepasst von XrayTool ergibt die Nachricht com.sun.star.comp.framework.Desktop (comp hier kann perhaps be ignored).

Es gibt auch einen guten Ansatz, der jedoch nur für Basic verfügbar ist

obj = createUnoService("com.sun.star.frame.Desktop") 
MsgBox obj.DBG_Properties 

Dies wird eine lange Nachricht erzeugen, mit Properties of object "com.sun.star.frame.Desktop" ausgehend.

Schließlich vergessen Sie nicht über supportsService, obwohl es möglicherweise nicht so relevant für Ihren speziellen Anwendungsfall ist. Wenn Makros geschrieben werden, ist es am besten zu überprüfen, ob ein bestimmtes Objekt einen Dienst unterstützt, anstatt zu prüfen, um welchen Typ es sich tatsächlich handelt.