Win32com事件没有提升内线?

时间:2016-08-30 10:48:38

标签: python pywin32 win32com

我是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循环的单独线程,但它没有任何区别。我想不出任何解决方案。

0 个答案:

没有答案