是否有用于探索/测试COM对象的工具?

Jor*_*ril 15 windows com oleview

我正在尝试使用Python中的COM对象(win32com)来自动化进程,但是我没有得到预期的结果......是否有工具来探索/测试COM对象而无需编写特定的程序?我的意思是,是否存在允许例如实例化COM对象并调用其方法的东西?

(基本上我试图找出我的意外结果是否是win32com的错,我想避免安装Visual Studio来编写C#应用程序)

tyr*_*nid 14

我实际上写了一个SDK工具OleView的替代品(afaik它不支持仅枚举的调用方法),无法想象地称为OleViewDotNet.您可以在这里获取源代码,但是由于您需要编译它,因此编写简单的C#程序或使用Powershell可能会更快.

它所做的是通过GUI公开IDispatch方法(和一些本机接口),这样你就可以调用它们,它还提供了一个IronPython脚本窗口.您需要通过查看"注册表 - > CLSID按名称"查找您的COM对象,找到条目(过滤器可用于按名称部分选择)右键单击并选择应显示窗口的"创建实例"相近:

对象信息

然后选择底部的"操作"菜单并选择"打开调度"以获取方法/属性窗口.

在此输入图像描述

你可以做更多的事情,但这是一个简单的概述.


Chr*_*cke 13

如果您通过WebSetup 下载Windows SDK,您应该可以选择只下载SDK工具.它们包括一个名为Ole/COM Viewer(oleview.exe)的程序,可用于浏览所有已注册的COM对象,以及支持Ole Automation的对象,打开它们并调用方法.

  • 问题是我怀疑,COM是一个二进制契约,所以没有通用的方法来调用随机接口.那就是 - 它依赖于构建"双"接口时存在的类型信息 (2认同)

小智 8

我在PowerShell中探索COM对象.找到了这个由Jaap Brasser提供的好食谱,它很容易运行并回答了我的问题.

获取所有Com对象的列表 由Jaap Brasser于2013年6月27日发布

注意:此提示需要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
Run Code Online (Sandbox Code Playgroud)

第一个Cmdlet从HKLM:\ Software\Classes中读出一个完整的值列表,然后验证以下两个条件是否为真:

  • 该对象是否与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
    }
}
Run Code Online (Sandbox Code Playgroud)

TechNet脚本库中提供了此功能:

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