2010-10-15 14 views
10

Próbuję zautomatyzować proces za pomocą obiektu COM z Python (win32com), ale nie uzyskuję oczekiwanych rezultatów ... Czy istnieje narzędzie do eksploracji/testowania obiektów COM bez konieczności pisania konkretnego programu ? Mam na myśli, czy jest coś, co pozwala np. utworzyć instancję obiektu COM i wywołać jej metody?Czy istnieje narzędzie do eksplorowania/testowania obiektów COM?

(W zasadzie staram się dowiedzieć, czy moje nieoczekiwane wyniki są win32com winą, i chciałbym, aby uniknąć instalowania programu Visual Studio napisać aplikacji C#)

Odpowiedz

10

Jeśli pobrać Windows SDK poprzez WebSetup ty powinien mieć możliwość pobrania tylko narzędzi SDK. Obejmują one program o nazwie Ole/COM Viewer (oleview.exe), który może być używany do przeglądania wszystkich zarejestrowanych obiektów COM, oraz do obiektów obsługujących Ole Automation, otwierania ich i wywoływania metod.

+0

Przykro mi, ale nie wiem, czy używam go poprawnie. Znalazłem obiekt, którego potrzebuję, kliknę "Utwórz instancję" i zostanie wybrany (pogrubiony tekst). Co mam teraz zrobić? Dostępnych jest kilka interfejsów, ale po dwukrotnym kliknięciu dowolnego z nich pojawia się "Przeglądarka IDataObject obsługuje tylko IID_IDataObject" – Joril

+0

Prawdopodobnie pakiet nie zawiera pliku iviewers.dll, który oleview.exe wymaga w tym samym katalogu. Zobacz: http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm –

+0

Dzięki za dzwonki! W każdym razie iviewers.dll jest tam, i jeśli przeniesię go gdzie indziej OLEviewer narzeka, więc domyślam się, że to używa .. W każdym razie może używam go w niewłaściwy sposób, jaka jest procedura wywoływania metody za pomocą OLEviewer? Nie mogę tego rozgryźć:/ – Joril

4

Eksploruję obiekty COM w PowerShell. Znalazłem tę wspaniałą recipe dostarczoną przez Jaap Brasser, która jest łatwa do uruchomienia i odpowiedziała na moje pytanie.

uzyskać listę wszystkich obiektów COM dostępne Wysłany przez Jaap Brasser w dniu 27 czerwca 2013

Uwaga: Ta końcówka wymaga PowerShell 2.0 lub wyżej.

Niedawno na forach PowerShell.com pojawiło się pytanie: jak uzyskać uzyskać pełną listę dostępnych obiektów ComObjects? Ta wskazówka pokaże, jak pobrać wszystkie z rejestru.

Oto kod, który możemy użyć do wygenerowania tej listy:

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

Pierwszy komandletu odczytuje pełną listę wartości z HKLM: \ Software \ Classes, a następnie sprawdza, czy po dwóch są spełnione warunki:

  • Czy obiekt jest zgodny z konwencją nazewnictwa obiektu ComObject?
  • Czy klucz rejestru ma folder CLSID? Każdy zarejestrowany obiekt ComObject powinien mieć identyfikator CLSID jako unikalny identyfikator. Przykład wyjściu generowany przez to polecenie jest następujący:

    AccClientDocMgr.AccClientDocMgr
    AccDictionary.AccDictionary
    Access.ACCDAExtension
    Access.ACCDCFile
    Access.ACCDEFile
    Access.ACCDTFile
    dostępu. ACCFTFile
    Access.ADEFile

Aby ułatwić proces wyszukiwania ComObject można użyć następującej funkcji .

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 
    } 
} 

Funkcja ta jest dostępna w TechNet Script Galeria:

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

+0

Wygląda na to, że nie obejmuje to widocznych metod COM .net. – Konrads

7

I rzeczywiście napisał zastępstwo dla OleView narzędzi SDK (AFAIK nie obsługuje wywołanie metody tylko wyliczający) niewyobrażalnie nazywany OleViewDotNet. Możesz pobrać kod źródłowy here, ale ponieważ będziesz musiał go skompilować, najprawdopodobniej szybciej napiszesz prosty program C# lub użyjesz Powershell.

To, co robi, to udostępnianie metod IDispatch (i niektórych natywnych interfejsów) za pośrednictwem graficznego interfejsu użytkownika, dzięki czemu można je wywoływać, a także udostępnia okno skryptu IronPython. Musisz znaleźć swój obiekt COM, patrząc pod "Rejestr -> CLSID według nazwy", znajdź wpis (filtr może być użyty do wyboru według nazwy) prawym przyciskiem myszy i wybierz "Utwórz instancję", która powinna pokazać okno podobny do:

object information

następnie wybierz z menu „Operacje” na dole i wybierz „Otwórz wysyłki”, aby uzyskać okno metoda/nieruchomość.

enter image description here

Dużo więcej można z tym zrobić, ale to prosty przegląd.

Powiązane problemy