import glob import os import unittest import warnings import comtypes.typeinfo import comtypes.client import comtypes.client._generate from comtypes.test import requires requires("typelibs") # filter warnings about interfaces without a base interface; they will # be skipped in the code generation. warnings.filterwarnings("ignore", "Ignoring interface .* which has no base interface", UserWarning) # don't print messages when typelib wrappers are generated comtypes.client._generate.__verbose__ = False sysdir = os.path.join(os.environ["SystemRoot"], "system32") progdir = os.environ["ProgramFiles"] common_progdir = os.environ["CommonProgramFiles"] # This test takes quite some time. It tries to build wrappers for ALL # .dll, .tlb, and .ocx files in the system directory which contain typelibs. class Test(unittest.TestCase): def setUp(self): "Do not write the generated files into the comtypes.gen directory" comtypes.client.gen_dir = None def tearDown(self): comtypes.client.gen_dir = comtypes.client._find_gen_dir() number = 0 def add_test(fname): global number def test(self): try: comtypes.typeinfo.LoadTypeLibEx(fname) except WindowsError: return comtypes.client.GetModule(fname) test.__doc__ = "test GetModule(%r)" % fname setattr(Test, "test_%d" % number, test) number += 1 for fname in glob.glob(os.path.join(sysdir, "*.ocx")): add_test(fname) for fname in glob.glob(os.path.join(sysdir, "*.tlb")): add_test(fname) for fname in glob.glob(os.path.join(progdir, r"Microsoft Office\Office*\*.tlb")): if os.path.basename(fname).lower() in ( "grde50.olb", # UnicodeEncodeError "xl5de32.olb", # UnicodeEncodeError "grde50.olb", # UnicodeEncodeError ): continue add_test(fname) for fname in glob.glob(os.path.join(progdir, r"Microsoft Office\Office*\*.olb")): if os.path.basename(fname).lower() in ( "grde50.olb", # UnicodeEncodeError "xl5de32.olb", # UnicodeEncodeError "grde50.olb", # UnicodeEncodeError ): continue add_test(fname) path = os.path.join(progdir, r"Microsoft Visual Studio .NET 2003\Visual Studio SDKs\DIA SDK\bin\msdia71.dll") if os.path.isfile(path): print("ADD", path) add_test(path) for fname in glob.glob(os.path.join(common_progdir, r"Microsoft Shared\Speech\*.dll")): add_test(fname) for fname in glob.glob(os.path.join(sysdir, "*.dll")): # these typelibs give errors: if os.path.basename(fname).lower() in ( "syncom.dll", # interfaces without base interface "msvidctl.dll", # assignment to None "scardssp.dll", # assertionerror sizeof() "sccsccp.dll", # assertionerror sizeof() # Typeinfo in comsvcs.dll in XP 64-bit SP 1 is broken. # Oleview decompiles this code snippet (^ marks are m): #[ # odl, # uuid(C7B67079-8255-42C6-9EC0-6994A3548780) #] #interface IAppDomainHelper : IDispatch { # HRESULT _stdcall pfnShutdownCB(void* pv); # HRESULT _stdcall Initialize( # [in] IUnknown* pUnkAD, # [in] IAppDomainHelper __MIDL_0028, # ^^^^^^^^^^^^^^^^ # [in] void* pPool); # HRESULT _stdcall pfnCallbackCB(void* pv); # HRESULT _stdcall DoCallback( # [in] IUnknown* pUnkAD, # [in] IAppDomainHelper __MIDL_0029, # ^^^^^^^^^^^^^^^^ # [in] void* pPool); #}; "comsvcs.dll", ): continue add_test(fname) if __name__ == "__main__": unittest.main()