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)
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
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
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
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()
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()