2010-10-15 53 views
10

我試圖通過使用來自Python(win32com)的COM對象來自動化一個進程,但我沒有得到預期的結果......是否有工具可以在不必編寫特定程序的情況下探索/測試COM對象?我的意思是,有什麼可以讓實例化一個COM對象並調用它的方法?是否有一個用於瀏覽/測試COM對象的工具?

(基本上我試圖找出如果我的意想不到的結果是win32com的錯,我想避免安裝Visual Studio編寫C#應用程序)

回答

10

如果通過WebSetup下載Windows SDK你應該可以選擇只下載SDK工具。它們包括一個名爲Ole/COM Viewer(oleview.exe)的程序,可用於瀏覽所有註冊的COM對象,以及支持Ole Automation的對象,打開它們並調用方法。

+0

對不起,但我不知道我是否正確使用它..我找到了我需要的對象,我點擊「創建實例」,它被選中(粗體文本)..我現在應該怎麼做?有幾個接口可用,但是當我雙擊其中任何一個時,我會得到「IDataObject接口查看器只支持IID_IDataObject」 – Joril 2010-10-15 14:08:37

+0

可能該包缺少iviewers.dll,而oleview.exe需要在同一目錄中。請參閱:http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm – 2010-10-18 21:48:20

+0

感謝您的支持!無論如何,iviewers.dll在那裏,如果我把它移動到別處OLEviewer抱怨,所以我猜它正在使用它..無論如何,也許我用錯了方式,什麼是使用OLEviewer調用方法的過程?我無法弄清楚:/ – Joril 2010-10-20 08:24:35

4

我正在探索PowerShell中的COM對象。發現這個偉大的recipe,由Jaap Brasser提供,很容易運行並回答了我的問題。

獲取所有的COM對象的列表發佈由夏侯Brasser餐廳於6月27日可,2013

注:本技巧需要的PowerShell 2.0或更高版本。

最近在PowerShell.com論壇上發佈了一個問題:如何 獲得可用ComObjects的完整列表?這篇技巧將展示如何從註冊表中獲取 所有這些內容。

這裏是我們可以用它來生成這個列表的代碼:

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

第一Cmdlet的讀出從 HKLM值的完整列表:\ Software \ Classes下,然後驗證如果以下兩個 條件是正確的:

  • 該對象是否符合ComObject的命名約定?
  • 註冊表項是否有CLSID文件夾?每個註冊的ComObject都應該有一個CLSID作爲唯一標識符。 由該命令所產生的輸出的一個例子是如下:

    AccClientDocMgr.AccClientDocMgr
    AccDictionary.AccDictionary
    Access.ACCDAExtension
    Access.ACCDCFile
    Access.ACCDEFile
    Access.ACCDTFile
    訪問。 ACCFTFile
    Access.ADEFile

要使發現ComObject的過程更容易,可以使用以下 函數。

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

此功能是在TechNet腳本庫中提供:

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

+0

顯然這不包括COM可見的.net方法。 – Konrads 2017-10-12 09:18:01

7

其實我寫的SDK工具OLEVIEW更換(據我所知它不支持調用方法只列舉)毫無想像力地稱爲OleViewDotNet。你可以得到源代碼here,但是如果你需要編譯它的話,編寫簡單的C#程序或者使用Powershell可能會更快。

它所做的是通過GUI公開IDispatch方法(以及一些本地接口),以便您可以調用它們,並且它還提供一個IronPython腳本窗口。你需要通過在「Registry - > CLSID By Name」下查找你的COM對象,找到條目(過濾器可以用來選擇名稱部分),右鍵單擊並選擇應該顯示一個窗口的「Create Instance」類似於:

object information

然後在底部選擇「操作」菜單,選擇「打開調度」來獲得方法/屬性窗口。

enter image description here

還有很多更你可以用這一點,但該做的是一個簡單的概述。

相關問題