Eu tenho um plugin que estou tentando criar como um exemplo para um aplicativo da empresa que trabalho. Eu estou tentando escrever este plugin em Python.
A maneira como a arquitetura do plugin funciona é que oO plugin precisa implementar uma interface definida em uma biblioteca de tipos COM. Portanto, é um cliente COM para essa biblioteca de tipos e, no final, é registrado como um servidor COM no registro e no aplicativo, dando-lhe o ClassID para o COM de ligação tardia pelo aplicativo.
Eu estou usando pythoncom e win32com e tenho usadomakepy.py para gerar o código python necessário do tipo libarary, mas não consigo encontrar uma maneira de criar uma classe que implemente a interface dessa biblioteca de tipos.
Qualquer ponteiro sobre isso seria muito apreciado.
obrigado
Quando tento executar o Dispatch para obter o objeto COM, recebo a seguinte exceção:
>>> interface = win32com.client.Dispatch("{68AC7909-804F-4D6D-861C-8382DAA7B029}")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:Python26libsite-packageswin32comclient__init__.py", line 95, in Dispatch
dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:Python26Libsite-packageswin32comclientdynamic.py", line 108, in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:Python26Libsite-packageswin32comclientdynamic.py", line 85, in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)
pywintypes.com_error: (-2147221164, "Class not registered", None, None)
Respostas:
4 para resposta № 1Você pode simplesmente usar win32com.client.Dispatch()
:
object = win32com.client.Dispatch("Class.Name")
Este é o exemplo do guia de início rápido do ActiveState:
>>> import win32com.client
>>> w=win32com.client.Dispatch("Word.Application")
>>> w.Visible=1
>>> w
<win32com.gen_py.Microsoft Word 8.0 Object Library._Application>
Se não funcionar, você pode usar win32com.client.gencache.EnsureModule()
para ter certeza de que você gerou o módulo de cache correto.
from win32com.client import Dispatch
from win32com.client import gencache
# This comes from running: makepy.py -i "Microsoft Excel 14.0 Object Library"
gencache.EnsureModule("{00020813-0000-0000-C000-000000000046}", 0, 1, 7)
obj = Dispatch("Excel.Application.14")
# gives <win32com.gen_py.Microsoft Excel 14.0 Object Library._Application instance ...>
print repr(obj)
A mesma coisa com os tipos (mais simples e suporta interfaces customizadas)
from comtypes.client import CreateObject
obj = CreateObject("Excel.Application")