2010-10-15 8 views
10

Ich versuche, einen Prozess zu automatisieren, indem Sie ein COM-Objekt von Python (win32com) verwenden, aber ich bekomme nicht die erwarteten Ergebnisse ... Gibt es ein Werkzeug zum Erkunden/Testen von COM-Objekten, ohne ein bestimmtes Programm schreiben zu müssen ? Ich meine, gibt es etwas, das z.B. ein COM-Objekt instanziieren und seine Methoden aufrufen?Gibt es ein Werkzeug zum Erkunden/Testen von COM-Objekten?

(Im Grunde versuche ich herauszufinden, ob meine unerwartete Ergebnisse win32com Schuld sind, und ich möchte Visual Studio vermeiden, die Installation einer C# -Anwendung zu schreiben)

Antwort

-2

Für die Aufzeichnung, habe ich am Ende schreiben ein sehr kleines Skript mit SciTe4AutoHotKey und AutoHotKey COM wrappers, keine .Net erforderlich.
(und meine unerwarteten Ergebnisse waren nicht Pythons Fehler :))

10

Wenn Sie die Windows SDK über das WebSetup downloaden Sie sollte in der Lage sein, die SDK-Tools einfach herunterzuladen. Sie enthalten ein Programm Ole/COM Viewer (Oleview.exe) das verwandt werden kann, um alle registrierte COM-Objekte zu durchsuchen, und für Objekte, die Ole-Automatisierung unterstützen, öffnen Sie sie, und rufen Sie Methoden auf.

+0

Es tut mir leid, aber ich kann nicht herausfinden, ob ich es richtig verwende .. Ich habe das Objekt gefunden, das ich brauche, ich klicke auf "Create instance" und es wird ausgewählt (fetter Text) .. Was sollte ich jetzt tun? Es gibt ein paar Schnittstellen zur Verfügung, aber wenn ich auf einen von ihnen doppelklicke, bekomme ich "IDataObject interface viewer unterstützt nur IID_IDataObject" – Joril

+0

Wahrscheinlich fehlt das Paket iliewers.dll, die oleview.exe im selben Verzeichnis benötigt. Siehe: http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm –

+0

Danke für das Einspielen! Wie auch immer, die iviewers.dll ist da, und wenn ich sie woanders hinbewege, beschwert sich OLEviewer, also schätze ich, dass sie es benutzt. Wie auch immer, vielleicht benutze ich es falsch, wie ist das Verfahren, um eine Methode mit OLEviewer aufzurufen? Ich kann es nicht herausfinden:/ – Joril

4

Ich untersuche COM-Objekte in PowerShell. Fand dieses großartige recipe, von Jaap Brasser zur Verfügung gestellt, die einfach zu bedienen ist und meine Frage beantwortet hat.

Erhalten Sie eine Liste aller Com von Jaap Brasser am 27. Juni, bekannt gemacht verfügbar Objekte 2013

Hinweis: Diese Spitze erfordert Powershell 2.0 oder höher.

Kürzlich wurde eine Frage auf die PowerShell.com Foren geschrieben: Wie zu erhalten Sie eine vollständige Liste der verfügbaren ComObjects? Dieser Tipp zeigt, wie alle aus der Registrierung abgerufen werden.

Hier ist der Code, dass wir diese Liste zu erzeugen, verwenden können:

Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object { 
    $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID") 
} | Select-Object -ExpandProperty PSChildName 

Das erste Cmdlets liest HKLM aus einer vollständigen Liste der Werte aus: \ Classes \ Software und überprüft dann, ob die folgende zwei Bedingungen sind erfüllt:

  • Passt das Objekt der Namenskonvention für ein ComObject?
  • Hat der Registrierungsschlüssel einen CLSID-Ordner? Jedes registrierte ComObject sollte eine CLSID als eindeutigen Bezeichner haben. Ein Beispiel für der durch diesen Befehl erzeugten Ausgabe ist wie folgt:

    AccClientDocMgr.AccClientDocMgr
    AccDictionary.AccDictionary
    Access.ACCDAExtension
    Access.ACCDCFile
    Access.ACCDEFile
    Access.ACCDTFile
    Access. ACCFTFile
    Access.ADEFile

Um die Erkennung von ComObject zu vereinfachen, kann die folgende Funktion verwendet werden.

function Get-ComObject { 

    param(
     [Parameter(Mandatory=$true, 
     ParameterSetName='FilterByName')] 
     [string]$Filter, 

     [Parameter(Mandatory=$true, 
     ParameterSetName='ListAllComObjects')] 
     [switch]$ListAll 
    ) 

    $ListofObjects = Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object { 
     $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID") 
    } | Select-Object -ExpandProperty PSChildName 

    if ($Filter) { 
     $ListofObjects | Where-Object {$_ -like $Filter} 
    } else { 
     $ListofObjects 
    } 
} 

Diese Funktion ist in der TechNet Script Galerie verfügbar:

http://gallery.technet.microsoft.com/Get-ComObject-Function-to-50a92047

+0

Offenbar enthält dies keine sichtbaren COM-Methoden. NET. – Konrads

7

ich tatsächlich einen Ersatz für die SDK-Tool OleView schrieb (afaik nicht nur das Aufrufen von Methoden Aufzählen nicht unterstützt) einfallslos OleViewDotNet genannt. Sie können den Quellcode here erhalten, aber da Sie kompilieren müssen, ist es wahrscheinlich schneller, das einfache C# -Programm zu schreiben oder Powershell zu verwenden.

Was es tut, ist die Bereitstellung von IDispatch-Methoden (und einige native Schnittstellen) über eine GUI, so dass Sie sie aufrufen können, und es bietet auch ein IronPython-Skriptfenster. Sie müssten Ihr COM-Objekt finden, indem Sie unter "Registry -> CLSID nach Name" suchen, den Eintrag suchen (der Filter kann nach Namensteil ausgewählt werden), rechtsklicken und "Create Instance" auswählen, das ein Fenster anzeigen soll ähnlich wie:

object information

dann das „Operationen“ Menü unten auswählen und auf „Öffnen Versand“ zu erhalten, das Verfahren/Eigenschaftsfenster wählen.

enter image description here

Es gibt viel mehr Sie können aber das ist eine einfache Übersicht mit diesem tun.

Verwandte Themen