@@ -85,24 +85,30 @@ def find_library(name):
8585 wintypes .DWORD ,
8686 )
8787
88- _psapi = ctypes .WinDLL ('psapi' , use_last_error = True )
89- _enum_process_modules = _psapi ["EnumProcessModules" ]
90- _enum_process_modules .restype = wintypes .BOOL
91- _enum_process_modules .argtypes = (
92- wintypes .HANDLE ,
93- ctypes .POINTER (wintypes .HMODULE ),
94- wintypes .DWORD ,
95- wintypes .LPDWORD ,
96- )
88+ # gh-145307: We defer loading psapi.dll until _get_module_handles is called.
89+ # Loading additional DLLs at startup for functionality that may never be
90+ # used is wasteful.
91+ _enum_process_modules = None
9792
9893 def _get_module_filename (module : wintypes .HMODULE ):
9994 name = (wintypes .WCHAR * 32767 )() # UNICODE_STRING_MAX_CHARS
10095 if _k32_get_module_file_name (module , name , len (name )):
10196 return name .value
10297 return None
10398
104-
10599 def _get_module_handles ():
100+ global _enum_process_modules
101+ if _enum_process_modules is None :
102+ _psapi = ctypes .WinDLL ('psapi' , use_last_error = True )
103+ _enum_process_modules = _psapi ["EnumProcessModules" ]
104+ _enum_process_modules .restype = wintypes .BOOL
105+ _enum_process_modules .argtypes = (
106+ wintypes .HANDLE ,
107+ ctypes .POINTER (wintypes .HMODULE ),
108+ wintypes .DWORD ,
109+ wintypes .LPDWORD ,
110+ )
111+
106112 process = _get_current_process ()
107113 space_needed = wintypes .DWORD ()
108114 n = 1024
0 commit comments