在 python 并发调用 Com 组件时需要作如下处理,每次 Com 组件的函数调用需要在 context 中
import win32com.client
import pythoncom
import contextlib
class ComInterface:
def __init__(self, com_id):
inst = win32com.client.Dispatch(com_id)
self._inst_stream = pythoncom.CreateStreamOnHGlobal()
pythoncom.CoMarshalInterface(self._inst_stream,
pythoncom.IID_IDispatch,
inst._oleobj_,
pythoncom.MSHCTX_LOCAL,
pythoncom.MSHLFLAGS_TABLESTRONG)
@contextlib.contextmanager
def context(self):
self._inst_stream.Seek(0, 0)
inst_interface = pythoncom.CoUnmarshalInterface(self._inst_stream, pythoncom.IID_IDispatch)
inst = win32com.client.Dispatch(inst_interface)
yield inst
def do_something(self):
with self.context() as api:
api.do_something()