def dump_signatures(): tlbs = selecttlb.EnumTlbs() tlbs = {tlb.clsid: tlb for tlb in tlbs} tlbSpec = tlbs.get(module_clsid) if tlbSpec is None: raise LookupError('KHOpenAPI Module not found') if tlbSpec.dll is None: tlb = pythoncom.LoadRegTypeLib(tlbSpec.clsid, int(tlbSpec.major, 16), int(tlbSpec.minor, 16), tlbSpec.lcid) else: tlb = pythoncom.LoadTypeLib(tlbSpec.dll) gen = genpy.Generator(tlb, tlbSpec.dll, None, bBuildHidden=1) oleItems, _enumItems, _recordItems, _vtableItems = gen.BuildOleItemsFromType( ) items = [l for l in oleItems.values() if l is not None] items.sort() iteritems = iter(items) dispatch = next(iteritems, None) event = next(iteritems, None) if dispatch is None: raise LookupError('KHOpenAPI Dispatch not found') if event is None: raise LookupError('KHOpenAPI Event not found') dispatch_funcs = [ (name, entry) for name, entry in dispatch.mapFuncs.items() if not any([ entry.desc[9] & pythoncom.FUNCFLAG_FRESTRICTED and entry.desc[0] != pythoncom.DISPID_NEWENUM, entry.desc[3] != pythoncom.FUNC_DISPATCH, entry.desc[0] == pythoncom.DISPID_NEWENUM ]) ] dispatch_signatures_by_name = OrderedDict() # pylint: disable=redefined-outer-name for func_name, entry in dispatch_funcs: signature = signature_from_entry(entry) dispatch_signatures_by_name[func_name] = signature event_funcs = event.mapFuncs.items() event_signatures_by_name = OrderedDict() # pylint: disable=redefined-outer-name for func_name, entry in event_funcs: signature = signature_from_entry(entry) event_signatures_by_name[func_name] = signature with open(dispatch_signatures_by_name_filepath, 'wb') as f: pickle.dump(dispatch_signatures_by_name, f) with open(event_signatures_by_name_filepath, 'wb') as f: pickle.dump(event_signatures_by_name, f)
def GenerateChildFromTypeLibSpec(child, typelibInfo, verboseLevel = None, progressInstance = None, bUnicodeToString=None): assert bUnicodeToString is None, "this is deprecated and will go away" if verboseLevel is None: verboseLevel = 0 # By default, we use no gui, and no verbose level for the children. if type(typelibInfo)==type(()): typelibCLSID, lcid, major, minor = typelibInfo tlb = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid) else: tlb = typelibInfo tla = typelibInfo.GetLibAttr() typelibCLSID = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] spec = selecttlb.TypelibSpec(typelibCLSID, lcid, major, minor) spec.FromTypelib(tlb, str(typelibCLSID)) typelibs = [(tlb, spec)] if progressInstance is None: progressInstance = SimpleProgress(verboseLevel) progress = progressInstance for typelib, info in typelibs: dir_name = gencache.GetGeneratedFileName(info.clsid, info.lcid, info.major, info.minor) dir_path_name = os.path.join(gencache.GetGeneratePath(), dir_name) progress.LogBeginGenerate(dir_path_name) gen = genpy.Generator(typelib, info.dll, progress) gen.generate_child(child, dir_path_name) progress.SetDescription("Importing module") __import__("win32com.gen_py." + dir_name + "." + child) progress.Close()
def BuildOleItems(clsid): tlbs = selecttlb.EnumTlbs() tlbs = {tlb.clsid: tlb for tlb in tlbs} tlbSpec = tlbs.get(clsid) if tlbSpec is None: return {} raise LookupError('KHOpenAPI Module not found') if tlbSpec.dll is None: tlb = pythoncom.LoadRegTypeLib(tlbSpec.clsid, int(tlbSpec.major, 16), int(tlbSpec.minor, 16), tlbSpec.lcid) else: tlb = pythoncom.LoadTypeLib(tlbSpec.dll) gen = genpy.Generator(tlb, tlbSpec.dll, None, bBuildHidden=1) oleItems, _enumItems, _recordItems, _vtableItems = gen.BuildOleItemsFromType() oleItems = {str(clsId): oleItem for clsId, oleItem in oleItems.items()} return oleItems
def GenerateFromTypeLibSpec(typelibInfo, file = None, verboseLevel = None, progressInstance = None, bUnicodeToString=None, bForDemand = bForDemandDefault, bBuildHidden = 1): assert bUnicodeToString is None, "this is deprecated and will go away" if verboseLevel is None: verboseLevel = 0 # By default, we use no gui and no verbose level! if bForDemand and file is not None: raise RuntimeError("You can only perform a demand-build when the output goes to the gen_py directory") if isinstance(typelibInfo, tuple): # Tuple typelibCLSID, lcid, major, minor = typelibInfo tlb = pythoncom.LoadRegTypeLib(typelibCLSID, major, minor, lcid) spec = selecttlb.TypelibSpec(typelibCLSID, lcid, major, minor) spec.FromTypelib(tlb, str(typelibCLSID)) typelibs = [(tlb, spec)] elif isinstance(typelibInfo, selecttlb.TypelibSpec): if typelibInfo.dll is None: # Version numbers not always reliable if enumerated from registry. tlb = pythoncom.LoadRegTypeLib(typelibInfo.clsid, typelibInfo.major, typelibInfo.minor, typelibInfo.lcid) else: tlb = pythoncom.LoadTypeLib(typelibInfo.dll) typelibs = [(tlb, typelibInfo)] elif hasattr(typelibInfo, "GetLibAttr"): # A real typelib object! # Could also use isinstance(typelibInfo, PyITypeLib) instead, but PyITypeLib is not directly exposed by pythoncom. # pythoncom.TypeIIDs[pythoncom.IID_ITypeLib] seems to work tla = typelibInfo.GetLibAttr() guid = tla[0] lcid = tla[1] major = tla[3] minor = tla[4] spec = selecttlb.TypelibSpec(guid, lcid, major, minor) typelibs = [(typelibInfo, spec)] else: typelibs = GetTypeLibsForSpec(typelibInfo) if progressInstance is None: progressInstance = SimpleProgress(verboseLevel) progress = progressInstance bToGenDir = (file is None) for typelib, info in typelibs: gen = genpy.Generator(typelib, info.dll, progress, bBuildHidden=bBuildHidden) if file is None: this_name = gencache.GetGeneratedFileName(info.clsid, info.lcid, info.major, info.minor) full_name = os.path.join(gencache.GetGeneratePath(), this_name) if bForDemand: try: os.unlink(full_name + ".py") except os.error: pass try: os.unlink(full_name + ".pyc") except os.error: pass try: os.unlink(full_name + ".pyo") except os.error: pass if not os.path.isdir(full_name): os.mkdir(full_name) outputName = os.path.join(full_name, "__init__.py") else: outputName = full_name + ".py" fileUse = gen.open_writer(outputName) progress.LogBeginGenerate(outputName) else: fileUse = file worked = False try: gen.generate(fileUse, bForDemand) worked = True finally: if file is None: gen.finish_writer(outputName, fileUse, worked) if bToGenDir: progress.SetDescription("Importing module") gencache.AddModuleToCache(info.clsid, info.lcid, info.major, info.minor) progress.Close()