I\'m trying to automate a process by using a COM object from Python (win32com), but I\'m not getting the expected results... Is there a tool to explore/test COM objects with
If you download the Windows SDK via the WebSetup you should be able to choose to just download the SDK tools. They include a program called Ole/COM Viewer (oleview.exe) that can be used to browse all registered COM objects, and for objects that support Ole Automation, open them and invoke methods.
I am exploring COM objects in PowerShell. Found this great recipe, provided by Jaap Brasser, which is easy to run and answered my question.
Get a list of all Com objects available Posted by Jaap Brasser on June 27, 2013
Note: This tip requires PowerShell 2.0 or above.
Recently a question was posted on the PowerShell.com forums: How to get a full list of available ComObjects? This tip will show how fetch all of them from the registry.
Here is the code that we can use to generate this list:
Get-ChildItem HKLM:\Software\Classes -ErrorAction SilentlyContinue | Where-Object { $_.PSChildName -match '^\w+\.\w+$' -and (Test-Path -Path "$($_.PSPath)\CLSID") } | Select-Object -ExpandProperty PSChildName
The first Cmdlet reads out a complete list of values from HKLM:\Software\Classes and then verifies if the following two conditions are true:
- Does the object match the naming convention for a ComObject?
Does the registry key have a CLSID folder? Every registered ComObject should have a CLSID as a unique identifier. An example of the output generated by this command is as follows:
AccClientDocMgr.AccClientDocMgr
AccDictionary.AccDictionary
Access.ACCDAExtension
Access.ACCDCFile
Access.ACCDEFile
Access.ACCDTFile
Access.ACCFTFile
Access.ADEFileTo make the process of discovering ComObject easier the following function can be used.
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 } }
This function is available in the TechNet Script Gallery:
http://gallery.technet.microsoft.com/Get-ComObject-Function-to-50a92047
For the record, I ended up writing a very small script using SciTe4AutoHotKey and AutoHotKey COM wrappers, no .Net required.
(and my unexpected results weren't Python's fault :) )
I actually wrote a replacement for the SDK tool OleView (afaik it doesn't support calling methods only enumerating) unimaginatively called OleViewDotNet. You can get the source code here but as you'd need to compile it's likely it would be quicker to write the simple C# program or use Powershell.
What it does do is expose IDispatch methods (and some native interfaces) via a GUI so you can call them and it also provides an IronPython script window. You'd need to find your COM object by looking under "Registry -> CLSID By Name", find the entry (the filter can be used to select by name part) right click and select "Create Instance" that should show up a window similar to:
then select the "Operations" menu at the bottom and choose "Open Dispatch" to get the method/property window.
There's a lot more you can do with this but that's a simple overview.