理解如何在Python中使用COM
我正在尝试用Python通过COM实现一个和VB程序等效的功能。以下是VB程序中的相关代码:
eConCall = New Microsoft.Dynamics.GP.eConnect.eConnectMethods
eConCall.eConnect_EntryPoint(sConnectionString, EnumTypes.ConnectionStringType.SqlClient, myXmlDocument, EnumTypes.SchemaValidationType.None)
在Python中,我这样做:
import win32com.client
eConCall = win32com.client.Dispatch("Microsoft.Dynamics.GP.eConnect.eConnectMethods")
但是eConCall
没有eConnect_EntryPoint
这个方法。实际上,它似乎没有任何方法:
eConCall = win32com.client.gencache.EnsureDispatch("Microsoft.Dynamics.GP.eConnect.eConnectMethods")
dir(eConCall)
打印出来的是:
['CLSID', '_ApplyTypes_', '__doc__', '__eq__', '__getattr__',
'__init__', '__module__', '__ne__', '__repr__', '__setattr__',
'_get_good_object_', '_get_good_single_object_', '_oleobj_',
'_prop_map_get_', '_prop_map_put_', 'coclass_clsid']
我很确定我对Dispatch的使用方式和如何在Python中访问eConnectMethods
有些误解。有没有好心人能帮我一下?我该如何获取eConnectMethods
的实例,以便我可以调用eConnect_EntryPoint
?
2 个回答
0
你可以考虑使用comtypes,它可以让你更底层地访问COM。
2
我觉得你看不到任何方法,是因为你遇到了所谓的“晚绑定”。这意味着你尝试调用的内容是在运行时通过标准的COM IDispatch接口进行检查的。当你使用有效的方法或属性时,它就能正常工作。否则,你就会遇到运行时错误,这和VBScript很像。
看起来你的任务对于晚绑定的尝试和错误来说并不简单,也许你可以考虑一下早绑定的选项——可以查看这个链接:http://oreilly.com/catalog/pythonwin32/chapter/ch12.html。
我还建议你尝试一些更简单的COM示例,这样可以帮助你更好地理解在Python中使用IDispatch,比如查看一些在线的简单Excel或Word自动化示例。
更新 好吧,我之前没注意到你已经尝试创建早绑定的包装器。看看makepy.py的结果(在\Lib\site-packages\win32com\gen_py\.py的某个地方),并将其与COM服务器的IDL进行比较。也许这个方法仍然可以通过晚绑定来使用,只是因为某些原因没有包含在包装器中……