【发布时间】:2011-04-25 19:49:08
【问题描述】:
我正在尝试通过使用 Python (win32com) 中的 COM 对象来自动化流程,但我没有得到预期的结果...是否有工具可以探索/测试 COM 对象而无需编写特定的程序?我的意思是,有什么东西可以让例如实例化一个 COM 对象并调用它的方法?
(基本上我是想知道我的意外结果是不是win32com的错,我想避免安装Visual Studio来编写C#应用程序)
【问题讨论】:
我正在尝试通过使用 Python (win32com) 中的 COM 对象来自动化流程,但我没有得到预期的结果...是否有工具可以探索/测试 COM 对象而无需编写特定的程序?我的意思是,有什么东西可以让例如实例化一个 COM 对象并调用它的方法?
(基本上我是想知道我的意外结果是不是win32com的错,我想避免安装Visual Studio来编写C#应用程序)
【问题讨论】:
我实际上为 SDK 工具 OleView 编写了一个替代品(afaik 它不支持仅枚举调用方法),令人难以置信地称为 OleViewDotNet。您可以获取源代码here,但由于您需要编译,因此编写简单的 C# 程序或使用 Powershell 可能会更快。
它所做的是通过 GUI 公开 IDispatch 方法(和一些本机接口),以便您可以调用它们,它还提供 IronPython 脚本窗口。您需要通过在“Registry -> CLSID By Name”下查看来找到您的 COM 对象,找到条目(过滤器可用于按名称部分选择)右键单击并选择应该显示一个窗口的“创建实例”类似于:
然后选择底部的“Operations”菜单并选择“Open Dispatch”以获取方法/属性窗口。
你可以用它做更多的事情,但这是一个简单的概述。
【讨论】:
如果您通过 WebSetup 下载 Windows SDK,您应该可以选择只下载 SDK 工具。它们包括一个名为 Ole/COM Viewer (oleview.exe) 的程序,可用于浏览所有已注册的 COM 对象,对于支持 Ole 自动化的对象,打开它们并调用方法。
【讨论】:
我正在探索 PowerShell 中的 COM 对象。找到了这个很棒的 recipe,由 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第一个 Cmdlet 从 HKLM:\Software\Classes 然后验证是否有以下两个 条件为真:
- 对象是否符合 ComObject 的命名约定?
注册表项是否有 CLSID 文件夹?每个注册的 ComObject 都应该有一个 CLSID 作为唯一标识符。一个例子 该命令生成的输出如下:
AccClientDocMgr.AccClientDocMgr
AccDictionary.AccDictionary
Access.ACCDAExtension
Access.ACCDC 文件
Access.ACCDEFile
Access.ACCDTFile
Access.ACCFTFile
访问.ADE文件为了使发现 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
【讨论】:
作为记录,我最终使用 SciTe4AutoHotKey 和 AutoHotKey COM wrappers 编写了一个非常小的脚本,不需要 .Net。
(而我意想不到的结果不是 Python 的错 :))
【讨论】: