Esempio n. 1
0
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()
Esempio n. 2
0
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()
Esempio n. 3
0
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()
Esempio n. 4
0
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()
Esempio n. 5
0
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()
Esempio n. 6
0
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()
Esempio n. 7
0
def RevokeClassFactories(infos):
    for factory, revokeId in infos:
        pythoncom.CoRevokeClassObject(revokeId)