【问题标题】:Is there a tool for exploring/testing COM objects?是否有用于探索/测试 COM 对象的工具?
【发布时间】:2011-04-25 19:49:08
【问题描述】:

我正在尝试通过使用 Python (win32com) 中的 COM 对象来自动化流程,但我没有得到预期的结果...是否有工具可以探索/测试 COM 对象而无需编写特定的程序?我的意思是,有什么东西可以让例如实例化一个 COM 对象并调用它的方法?

(基本上我是想知道我的意外结果是不是win32com的错,我想避免安装Visual Studio来编写C#应用程序)

【问题讨论】:

    标签: windows com oleview


    【解决方案1】:

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

    它所做的是通过 GUI 公开 IDispatch 方法(和一些本机接口),以便您可以调用它们,它还提供 IronPython 脚本窗口。您需要通过在“Registry -> CLSID By Name”下查看来找到您的 COM 对象,找到条目(过滤器可用于按名称部分选择)右键单击并选择应该显示一个窗口的“创建实例”类似于:

    然后选择底部的“Operations”菜单并选择“Open Dispatch”以获取方法/属性窗口。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 对不起,我不知道我是否正确使用它。我找到了我需要的对象,我点击“创建实例”,它被选中(粗体字).. 我现在该怎么办?有几个接口可用,但是当我双击其中任何一个时,我得到“IDataObject 接口查看器仅支持 IID_IDataObject”
      • 该软件包可能缺少 iviewers.dll,而 oleview.exe 需要在同一目录中。见:autoitscript.com/autoit3/docs/intro/ComRef.htm
      • 感谢您的参与!无论如何 iviewers.dll 就在那里,如果我将它移到其他地方 OLEviewer 抱怨,所以我猜它正在使用它。无论如何,也许我以错误的方式使用它,使用 OLEviewer 调用方法的过程是什么?我想不通:/
      • 问题是我怀疑,COM 是一个二进制合约,所以没有通用的方法来调用随机接口。嗯,它依赖于构建“双”接口时存在的类型信息
      • @Joril 您只需注册 iviewers.dll,认为您需要同时运行 Regsvr32 的两个版本(如果您也想要 64 位支持)
      【解决方案3】:

      我正在探索 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

      【讨论】:

      • 显然这不包括 COM 可见的 .net 方法。
      【解决方案4】:

      作为记录,我最终使用 SciTe4AutoHotKeyAutoHotKey COM wrappers 编写了一个非常小的脚本,不需要 .Net。
      (而我意想不到的结果不是 Python 的错 :))

      【讨论】:

        猜你喜欢
        • 2010-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2011-12-25
        相关资源
        最近更新 更多