web-dev-qa-db-ja.com

COMオブジェクトを探索/テストするためのツールはありますか?

Python(win32com))のCOMオブジェクトを使用してプロセスを自動化しようとしていますが、期待した結果が得られません... COMオブジェクトを探索/テストするツールはありますか特定のプログラムを作成する必要はありませんか?つまり、COMオブジェクトをインスタンス化してそのメソッドを呼び出すことができるものはありますか?

(基本的に、予期しない結果がwin32comのせいであるかどうかを調べようとしているので、Visual StudioをインストールしてC#アプリを作成することは避けたいと思います)

15
Joril

私は実際に、想像を絶するOleViewDotNetと呼ばれるSDKツールOleView(afaikは、列挙するだけのメソッドの呼び出しをサポートしていません)の代わりを作成しました。ソースコードを入手できます ここ しかし、コンパイルする必要があるので、単純なC#プログラムを作成するか、Powershellを使用する方が速いでしょう。

それが行うことは、GUIを介してIDispatchメソッド(およびいくつかのネイティブインターフェイス)を公開することです。これにより、それらを呼び出すことができ、IronPythonスクリプトウィンドウも提供されます。 [レジストリ]-> [CLSID By Name]でCOMオブジェクトを見つけ、エントリを見つけて(フィルタを使用して名前の部分で選択できます)、右クリックして[CreateInstance]を選択するとウィンドウが表示されます。に似ている:

object information

次に、下部にある[操作]メニューを選択し、[ディスパッチを開く]を選択して、メソッド/プロパティウィンドウを表示します。

enter image description here

これでできることはもっとたくさんありますが、それは簡単な概要です。

13
tyranid

WebSetupを介して Windows SDK をダウンロードすると、SDKツールのみをダウンロードすることを選択できるはずです。これらには、登録されているすべてのCOMオブジェクトを参照するために使用できるOle/COM Viewer(oleview.exe)と呼ばれるプログラムが含まれています。また、Ole Automationをサポートするオブジェクトの場合は、それらを開いてメソッドを呼び出します。

13
Chris Becke

PowerShellでCOMオブジェクトを調べています。 Jaap Brasserによって提供されたこの素晴らしい レシピ を見つけました。これは実行が簡単で、私の質問に答えました。

利用可能なすべてのComオブジェクトのリストを取得します投稿者Jaap Brasser、2013年6月27日

注:このヒントには、PowerShell2.0以降が必要です。

最近、PowerShell.comフォーラムに質問が投稿されました:利用可能なComObjectの完全なリストを取得するにはどうすればよいですか?このヒントでは、レジストリからそれらすべてをフェッチする方法を示します。

このリストを生成するために使用できるコードは次のとおりです。

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

最初のコマンドレットは、HKLM:\ Software\Classesから値の完全なリストを読み取り、次の2つの条件が当てはまるかどうかを確認します。

  • オブジェクトはComObjectの命名規則と一致していますか?
  • レジストリキーにはCLSIDフォルダーがありますか?登録されたすべてのComObjectには、一意の識別子としてCLSIDが必要です。このコマンドによって生成される出力の例は次のとおりです。

    AccClientDocMgr.AccClientDocMgr
    AccDictionary.AccDictionary
    Access.ACCDAExtension
    Access.ACCDCFile
    Access.ACCDEFile
    Access.ACCDTFile
    Access.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

8
Markus