Ejemplo n.º 1
0
 def __init__(self, myobject, name=None):
     if type(myobject) == type(''):
         myobject = pythoncom.MakeIID(myobject)
     if name is None:
         try:
             name = pythoncom.ProgIDFromCLSID(myobject)
         except pythoncom.com_error:
             name = str(myobject)
         name = "IID: " + name
     HLICOM.__init__(self, myobject, name)
Ejemplo n.º 2
0
 def WriteClassHeader(self, generator):
     generator.checkWriteDispatchBaseClass()
     doc = self.doc
     stream = generator.file
     print('class ' + self.python_name + '(DispatchBaseClass):', file=stream)
     if doc[1]: print('\t' + build._makeDocString(doc[1]), file=stream)
     try:
         progId = pythoncom.ProgIDFromCLSID(self.clsid)
         print("\t# This class is creatable by the name '%s'" % (progId), file=stream)
     except pythoncom.com_error:
         pass
     print("\tCLSID = " + repr(self.clsid), file=stream)
     if self.coclass_clsid is None:
         print("\tcoclass_clsid = None", file=stream)
     else:
         print("\tcoclass_clsid = " + repr(self.coclass_clsid), file=stream)
     print(file=stream)
     self.bWritten = 1
Ejemplo n.º 3
0
 def WriteEventSinkClassHeader(self, generator):
     generator.checkWriteEventBaseClass()
     doc = self.doc
     stream = generator.file
     print >> stream, 'class ' + self.python_name + ':'
     if doc[1]: print >> stream, '\t' + build._makeDocString(doc[1])
     try:
         progId = pythoncom.ProgIDFromCLSID(self.clsid)
         print >> stream, "\t# This class is creatable by the name '%s'" % (
             progId)
     except pythoncom.com_error:
         pass
     print >> stream, '\tCLSID = CLSID_Sink = ' + repr(self.clsid)
     if self.coclass_clsid is None:
         print >> stream, "\tcoclass_clsid = None"
     else:
         print >> stream, "\tcoclass_clsid = " + repr(self.coclass_clsid)
     print >> stream, '\t_public_methods_ = [] # For COM Server support'
     WriteSinkEventMap(self, stream)
     print >> stream
     print >> stream, '\tdef __init__(self, oobj = None):'
     print >> stream, "\t\tif oobj is None:"
     print >> stream, "\t\t\tself._olecp = None"
     print >> stream, "\t\telse:"
     print >> stream, '\t\t\timport win32com.server.util'
     print >> stream, '\t\t\tfrom win32com.server.policy import EventHandlerPolicy'
     print >> stream, '\t\t\tcpc=oobj._oleobj_.QueryInterface(pythoncom.IID_IConnectionPointContainer)'
     print >> stream, '\t\t\tcp=cpc.FindConnectionPoint(self.CLSID_Sink)'
     print >> stream, '\t\t\tcookie=cp.Advise(win32com.server.util.wrap(self, usePolicy=EventHandlerPolicy))'
     print >> stream, '\t\t\tself._olecp,self._olecp_cookie = cp,cookie'
     print >> stream, '\tdef __del__(self):'
     print >> stream, '\t\ttry:'
     print >> stream, '\t\t\tself.close()'
     print >> stream, '\t\texcept pythoncom.com_error:'
     print >> stream, '\t\t\tpass'
     print >> stream, '\tdef close(self):'
     print >> stream, '\t\tif self._olecp is not None:'
     print >> stream, '\t\t\tcp,cookie,self._olecp,self._olecp_cookie = self._olecp,self._olecp_cookie,None,None'
     print >> stream, '\t\t\tcp.Unadvise(cookie)'
     print >> stream, '\tdef _query_interface_(self, iid):'
     print >> stream, '\t\timport win32com.server.util'
     print >> stream, '\t\tif iid==self.CLSID_Sink: return win32com.server.util.wrap(self)'
     print >> stream
     self.bWritten = 1
Ejemplo n.º 4
0
 def WriteClass(self, generator):
     generator.checkWriteCoClassBaseClass()
     doc = self.doc
     stream = generator.file
     if generator.generate_type == GEN_DEMAND_CHILD:
         # Some special imports we must setup.
         referenced_items = []
         for ref, flag in self.sources:
             referenced_items.append(ref)
         for ref, flag in self.interfaces:
             referenced_items.append(ref)
         print >> stream, "import sys"
         for ref in referenced_items:
             print >> stream, "__import__('%s.%s')" % (
                 generator.base_mod_name, ref.python_name)
             print >> stream, "%s = sys.modules['%s.%s'].%s" % (
                 ref.python_name, generator.base_mod_name, ref.python_name,
                 ref.python_name)
             # And pretend we have written it - the name is now available as if we had!
             ref.bWritten = 1
     try:
         progId = pythoncom.ProgIDFromCLSID(self.clsid)
         print >> stream, "# This CoClass is known by the name '%s'" % (
             progId)
     except pythoncom.com_error:
         pass
     print >> stream, 'class %s(CoClassBaseClass): # A CoClass' % (
         self.python_name)
     if doc and doc[1]: print >> stream, '\t# ' + doc[1]
     print >> stream, '\tCLSID = %r' % (self.clsid, )
     print >> stream, '\tcoclass_sources = ['
     defItem = None
     for item, flag in self.sources:
         if flag & pythoncom.IMPLTYPEFLAG_FDEFAULT:
             defItem = item
         # If we have written a Python class, reference the name -
         # otherwise just the IID.
         if item.bWritten: key = item.python_name
         else: key = repr(str(item.clsid))  # really the iid.
         print >> stream, '\t\t%s,' % (key)
     print >> stream, '\t]'
     if defItem:
         if defItem.bWritten: defName = defItem.python_name
         else: defName = repr(str(defItem.clsid))  # really the iid.
         print >> stream, '\tdefault_source = %s' % (defName, )
     print >> stream, '\tcoclass_interfaces = ['
     defItem = None
     for item, flag in self.interfaces:
         if flag & pythoncom.IMPLTYPEFLAG_FDEFAULT:  # and dual:
             defItem = item
         # If we have written a class, refeence its name, otherwise the IID
         if item.bWritten: key = item.python_name
         else: key = repr(str(item.clsid))  # really the iid.
         print >> stream, '\t\t%s,' % (key, )
     print >> stream, '\t]'
     if defItem:
         if defItem.bWritten: defName = defItem.python_name
         else: defName = repr(str(defItem.clsid))  # really the iid.
         print >> stream, '\tdefault_interface = %s' % (defName, )
     self.bWritten = 1
     print >> stream
Ejemplo n.º 5
0
class KiwoomOpenApiQAxWidget(QWidget):

    CLSID = '{A1574A0D-6BFA-4BD7-9020-DED88711818D}'
    PROGID = 'KHOPENAPI.KHOpenApiCtrl.1'

    try:
        import pythoncom
        from pywintypes import com_error as ComError
    except ImportError:
        pass
    else:
        try:
            PROGID = pythoncom.ProgIDFromCLSID(CLSID) or PROGID
        except ComError:
            pass
        finally:
            del pythoncom
            del ComError

    CONTROL_NAME_KWARG_KEY = 'c'

    METHOD_NAMES = list(dispatch_signatures_by_name.keys())
    EVENT_NAMES = list(event_signatures_by_name.keys())

    def __init__(self, *args, **kwargs):
        super_args = args
        super_kwargs = kwargs

        clsid_or_progid = self.CLSID

        if len(args) > 0 and isinstance(args[0], str):
            super_args = args[1:]
            clsid_or_progid = args[0]
        elif self.CONTROL_NAME_KWARG_KEY in kwargs:
            super_kwargs = {
                k: v
                for k, v in kwargs if k != self.CONTROL_NAME_KWARG_KEY
            }
            clsid_or_progid = kwargs[self.CONTROL_NAME_KWARG_KEY]

        super().__init__(*super_args, **super_kwargs)

        self._ax = QAxWidget(clsid_or_progid, self)
        self._ax_wrapped = KiwoomOpenApiControlWrapper(self)

        self._methods = {}
        self._signals = {}

        self._event_logger = KiwoomOpenApiLoggingEventHandler(self)

        for method_name in self.METHOD_NAMES:
            dynamic_callable = KiwoomOpenApiDynamicCallable(
                self._ax, method_name)
            self._methods[method_name] = dynamic_callable

        for event_name in self.EVENT_NAMES:
            signal_connector = KiwoomOpenApiSignalConnector(event_name)
            if hasattr(self._event_logger, event_name):
                signal_connector.connect(
                    getattr(self._event_logger, event_name))
            self._signals[event_name] = signal_connector
            signal_connector.connect_to(self._ax)

        self._ax.exception.connect(self._onException)

    def _onException(self, code, source, desc, help):  # pylint: disable=redefined-builtin
        logging.exception('QAxBaseException(%r, %r, %r, %r)', code, source,
                          desc, help)

    def __getattr__(self, name):
        if name in self._methods:
            return self._methods[name]
        if name in self._signals:
            return self._signals[name]
        try:
            return getattr(self._ax, name)
        except AttributeError:
            pass
        try:
            return self._ax_wrapped.__getattribute__(name)
        except AttributeError:
            pass
        raise AttributeError("'%s' object has not attribute '%s'" %
                             (self.__class__.__name__, name))

    def changeEvent(self, event):
        if event.type() == QEvent.WindowStateChange:
            if self.windowState() & Qt.WindowMinimized:
                event.accept()

    def closeEvent(self, event):
        self.hide()
        event.ignore()
Ejemplo n.º 6
0
class KiwoomOpenApiQAxWidget(QWidget):

    CLSID = '{A1574A0D-6BFA-4BD7-9020-DED88711818D}'
    PROGID = 'KHOPENAPI.KHOpenApiCtrl.1'

    try:
        import pythoncom
        from pywintypes import com_error as ComError
    except ImportError:
        pass
    else:
        try:
            PROGID = pythoncom.ProgIDFromCLSID(CLSID) or PROGID
        except ComError:
            pass
        finally:
            del pythoncom
            del ComError

    CONTROL_NAME_KWARG_KEY = 'c'

    def __init__(self, *args, **kwargs):
        super_args = args
        super_kwargs = kwargs

        clsid_or_progid = self.CLSID

        if len(args) > 0 and isinstance(args[0], str):
            super_args = args[1:]
            clsid_or_progid = args[0]
        elif self.CONTROL_NAME_KWARG_KEY in kwargs:
            super_kwargs = {
                k: v
                for k, v in kwargs if k != self.CONTROL_NAME_KWARG_KEY
            }
            clsid_or_progid = kwargs[self.CONTROL_NAME_KWARG_KEY]

        super().__init__(*super_args, **super_kwargs)

        self._ax = QAxWidget(clsid_or_progid, self)
        self._ax_wrapped = KiwoomOpenApiControlWrapper(self)
        self._signals = {}
        self._event_logger = KiwoomOpenApiLoggingEventHandler(self)

        for event_name in [
                name for name in dir(KiwoomOpenApiEventHandlerFunctions)
                if name.startswith('On')
        ]:
            # 아래처럼 중간의 프록시 객체 (KiwoomOpenApiSignalConnector) 를 넣지
            # 않으면 외부에서 동적으로 connect 를 할 수가 없어보임 (하더라도
            # 제대로 이벤트를 받지 못함)
            connector = KiwoomOpenApiSignalConnector()
            connector.connect(getattr(self._event_logger, event_name))
            getattr(self._ax, event_name).connect(connector)
            self._signals[event_name] = connector
            # 아래는 기존에 시도해서 실패한 구현 (제대로 이벤트를 받지 못함)
            """
            connector = getattr(self._ax, event_name)
            connector.connect(getattr(self._event_logger, event_name))
            self._signals[event_name] = connector
            """

        self._ax.exception.connect(self._onException)

    def _onException(self, code, source, desc, help):
        logging.exception('QAxBaseException(%r, %r, %r, %r)', code, source,
                          desc, help)

    def __getattr__(self, name):
        try:
            result = getattr(self._ax, name)
        except AttributeError:
            result = self._ax_wrapped.__getattribute__(name)
        else:
            if type(result).__name__ == 'pyqtMethodProxy':
                result = KiwoomOpenApiDynamicCallable(self._ax, name)
            elif name.startswith('On') and name in self._signals:
                result = self._signals[name]
        return result

    def changeEvent(self, event):
        if event.type() == QEvent.WindowStateChange:
            if self.windowState() & Qt.WindowMinimized:
                event.accept()

    def closeEvent(self, event):
        self.hide()
        event.ignore()