我是COM和Python的新手,所以我不太熟悉确切的术语。因此使用不准确的术语表示歉意。
我正在尝试使用pywin32通过专有的COM接口连接到桌面应用程序。 我创建了一个PoC,运行正常。处理COM函数调用,我得到了预期的事件。
class MyEvents:
def __init__(self):
print("Callback class initialized")
def OnMyEvent(self, data):
print('MyEvent raised')
class ComUser:
comObj = None
def __init__(self):
comObj = win32com.client.DispatchWithEvents("ProproetaryInterface.InterfaceClass",
MyEvents)
comObj.Register()
comObj.DoSomething(data)
time.sleep(120)
userObj = ComUser()
到目前为止一切顺利。我在屏幕上看到了这个活动
回调类已初始化
MyEvent提出
接下来我试着把它放到我有多个线程的应用程序中。用简单的术语解释一下: Main创建了一个X类对象,用于初始化XMLRPC服务器线程。 XMLRPC处理程序只接收传入信息并将其放入队列中 该队列来自多处理lib。 另一个线程在此队列上等待传入消息
def __startPollingThread(self):
pythoncom.CoInitialize()
pollingThread = Thread(target=self.__checkQueue )
pollingThread.start()
pythoncom.CoUninitialize()
这是轮询线程方法:
def __checkQueue(self):
try:
pythoncom.CoInitialize()
while True:
currMessage = self.__messageQueue.get()
self.__processMessage(currMessage);
except :
#Log message
finally:
pythoncom.CoUninitialize()
__processMessage在遇到处理COM接口的类之前,会通过多个类(类似于策略模式+状态模式)。
在ComUser类中,我有一个向客户端应用程序的com接口注册的方法:
def initSystem(self):
import pythoncom
try:
pythoncom.CoInitialize()
self.ComConnector = win32com.client.DispatchWithEvents("ProprietaryInterface.InterfaceClass",
MyEvents)
self.ComConnector.Register()
except:
finally:
pythoncom.CoUninitialize()
另一种方法在到达时处理特定请求并进行相应的COM调用。
def handleMessage(self, message):
#if message = this then
comObj.DoSomething(data)
从__processMessage方法调用这两个方法。我的所有类都驻留在单独的Py文件中。除了在同一个py模块中的ComUser和MyEvents
我可以调用Com接口并看到Application对COM方法调用作出反应,但我看不到任何事件被引发。我已经尝试了很多CoInitialize和Uninitialze以及“import pythoncom”语句的组合,以确保它不是线程的问题。还尝试设置sys.coinit_flags = 0并检查。似乎毫无差别。我只是没有看到任何事件。
我在子线程而不是主线程中调用DispatchWithEvents是否是一个问题(调用似乎工作正常)?或者是主线程(即程序的主方法)消失了。我也试过在那里长时间睡觉。我甚至尝试了一个带有PumpWaitingMessages循环的单独线程,但它没有任何区别。我想不出任何解决方案。