def serve(clsid="{506e67c3-55b5-48c3-a035-eed5deea7d6d}"): """Launch the COM server, clsid is the XLPython objectok class id """ clsid = pywintypes.IID(clsid) # Ovveride CreateInstance in default policy to instantiate the XLPython object --- BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return serverutil.wrap(XLPython(), reqIID) else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy # Create the class factory and register it factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() print('xlwings server running, clsid=%s' % clsid) pythoncom.PumpMessages() pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()
def serve(clsid="{506e67c3-55b5-48c3-a035-eed5deea7d6d}"): """Launch the COM server, clsid is the XLPython object class id """ clsid = pywintypes.IID(clsid) # Ovveride CreateInstance in default policy to instantiate the XLPython object --- BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return serverutil.wrap(XLPython(), reqIID) else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy # Create the class factory and register it factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() print('xlwings server running, clsid=%s' % clsid) while True: rc = win32event.MsgWaitForMultipleObjects([idle_queue_event], 0, win32event.INFINITE, win32event.QS_ALLEVENTS) while True: pythoncom.PumpWaitingMessages() if not idle_queue: break task = idle_queue.pop(0) try: task() except: import traceback print("TaskQueue '%s' threw an exeception: %s", task, traceback.format_exc()) pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()
def RegisterClassFactories(clsids, flags=None, clsctx=None): """Given a list of CLSID, create and register class factories. Returns a list, which should be passed to RevokeClassFactories """ if flags is None: flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED if clsctx is None: clsctx = pythoncom.CLSCTX_LOCAL_SERVER ret = [] for clsid in clsids: # Some server append '-Embedding' etc if clsid[0] not in ['-', '/']: factory = pythoncom.MakePyFactory(clsid) regId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) ret.append((factory, regId)) return ret
def serve(clsid="{506e67c3-55b5-48c3-a035-eed5deea7d6d}"): """Launch the COM server, clsid is the XLPython object class id """ clsid = pywintypes.IID(clsid) # Ovveride CreateInstance in default policy to instantiate the XLPython object --- BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return serverutil.wrap(XLPython(), reqIID) else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy # Create the class factory and register it factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() msg = 'xlwings server running, clsid=%s' logger.info(msg, clsid) if logger.hasHandlers() else print(msg % clsid) waitables = [idle_queue_event] while True: timeout = TIMEOUT if idle_queue else win32event.INFINITE rc = win32event.MsgWaitForMultipleObjects(waitables, 0, timeout, win32event.QS_ALLEVENTS) if rc == win32event.WAIT_OBJECT_0 or rc == win32event.WAIT_TIMEOUT: while idle_queue: task = idle_queue.popleft() if not _execute_task(task): break elif rc == win32event.WAIT_OBJECT_0 + len(waitables): if pythoncom.PumpWaitingMessages(): break # wm_quit pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()
def serve(clsid="{506e67c3-55b5-48c3-a035-eed5deea7d6d}"): """Launch the COM server, clsid is the XLPython object class id""" clsid = pywintypes.IID(clsid) # Override CreateInstance in default policy to instantiate the XLPython object --- BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return serverutil.wrap(XLPython(), reqIID) else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy # Create the class factory and register it factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() if not loop.is_running(): t = threading.Thread(target=_start_background_loop, daemon=True) t.start() tid = t.ident else: tid = None msg = "xlwings server running, clsid=%s, event loop on %s" logger.info(msg, clsid, tid) if logger.hasHandlers() else print(msg % (clsid, tid)) while True: rc = win32event.MsgWaitForMultipleObjects( (), 0, win32event.INFINITE, win32event.QS_ALLEVENTS ) if rc == win32event.WAIT_OBJECT_0: if pythoncom.PumpWaitingMessages(): break # wm_quit pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()
def execute(clsid): clsid = IID(clsid) BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return win32com.server.util.wrap(CommandLoop(), reqIID) else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED try: revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() pythoncom.PumpMessages() finally: pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()
BaseDefaultPolicy = win32com.server.policy.DefaultPolicy class MyPolicy(BaseDefaultPolicy): def _CreateInstance_(self, reqClsid, reqIID): if reqClsid == clsid: return serverutil.wrap(XLPython(), reqIID) print reqClsid else: return BaseDefaultPolicy._CreateInstance_(self, clsid, reqIID) win32com.server.policy.DefaultPolicy = MyPolicy # --- create the class factory and register it factory = pythoncom.MakePyFactory(clsid) clsctx = pythoncom.CLSCTX_LOCAL_SERVER flags = pythoncom.REGCLS_MULTIPLEUSE | pythoncom.REGCLS_SUSPENDED revokeId = pythoncom.CoRegisterClassObject(clsid, factory, clsctx, flags) pythoncom.EnableQuitMessage(win32api.GetCurrentThreadId()) pythoncom.CoResumeClassObjects() pythoncom.PumpMessages() pythoncom.CoRevokeClassObject(revokeId) pythoncom.CoUninitialize()