You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.8 KiB
119 lines
3.8 KiB
6 years ago
|
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()
|