Automation using Python and win32all
Hi,
I have been working a bit on this, and in conjunction with developers using Python and COM, seem to have arrived at what was causing us difficulty (see end of this message for E-mail explanation)
The issue seems to be that the Alibre COM object does not support calling through the COM IDispatch process. Since VB doesn't use that interface, it works OK.
I would (respectfully, of course) request from the Alibre development team, looking into fixing this deficiency in the COM interface, which would then open up automation of Alibre to many other platforms and languages.
I am more than willing to help with this!
Thanks,
Duane
(Attached E-mail response)
> Hello,
>
> I am trying to use pywin32 to automate a CAD package from Alibre (
http://www.alibre.
com) called Design Express.
>
> The documentation I can get is written for Visual Basic (and not all that
well at that), and I get the following error from the following lines:
>
> [Python Code]
> import win32com.client
> AlibreObject=win32com.client.Dispatch(r"AlibreX.
AutomationHook")
> [End Python code]
>
> Error traceback:
> AlibreObject = win32com.client.Dispatch(r"AlibreX.AutomationHook")
> File "C:\\Python24\\Lib\\site-packages\\win32com\\client\\__init__.py", line 95,
in Dispatch
> dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,
userName,clsctx)
> File "C:\\Python24\\Lib\\site-packages\\win32com\\client\\dynamic.py", line 98,
in _GetGoodDispatchAndUserName
> return (_GetGoodDispatch(IDispatch, clsctx), userName)
> File "C:\\Python24\\Lib\\site-packages\\win32com\\client\\dynamic.py", line 78,
in _GetGoodDispatch
> IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.
IID_IDispatch)
> pywintypes.com_error: (-2147467262, 'No such interface supported', None, None)
>
The problem seems that the COM object that Alibre implements is buggy.
According to the
type library (I've installed the free Express version) the call above should
return an
object that implements the IAutomationHook interface, which is derived from
IDispatch:
[
odl,
uuid(424539A8-7014-4174-B0BF-F5EE5BB71DF5),
helpstring("IAutomationHook interface"),
dual,
oleautomation
]
interface IAutomationHook : IDispatch {
[id(0x00000001), propget, helpstring("Returns the automation root")]
HRESULT Root([out, retval] IDispatch** ppRoot);
[id(0x00000002), helpstring("Initiates a new Alibre Design Automation
client")]
HRESULT Initialize(
[in] BSTR serverURL,
[in] BSTR loginID,
[in] BSTR passwd,
[in] VARIANT_BOOL disableSecureMode,
[in] int unused);
[id(0x00000003), helpstring("Initiates a new Debug client")]
HRESULT InitializeDebug(
[in] BSTR serverURL,
[in] BSTR loginID,
[in] BSTR passwd,
[in] VARIANT_BOOL disableSecureMode,
[in] int unused);
};
Experiments with comtypes (the ctypes com framework) show that the
object can successfully be QueryInterface'd for IAutomationHook, but not
for IDispatch. I'm not sure pywin32 can handle such a buggy object,
but you could probably try to run makepy on the typelib and then
create the object. Others may have more knowledge if or how this
would work.
Thomas