@@ -256,25 +256,32 @@ int load_tcl(T lib)
256
256
257
257
void load_tkinter_funcs (void )
258
258
{
259
- // Load Tcl/Tk functions by searching all modules in current process.
260
- HMODULE hMods[1024 ];
261
- HANDLE hProcess;
262
- DWORD cbNeeded;
263
- unsigned int i;
259
+ HANDLE process = GetCurrentProcess (); // Pseudo-handle, doesn't need closing.
260
+ HMODULE* modules = NULL ;
261
+ DWORD size;
262
+ if (!EnumProcessModules (process, NULL , 0 , &size)) {
263
+ PyErr_SetFromWindowsErr (0 );
264
+ goto exit ;
265
+ }
266
+ if (!(modules = static_cast <HMODULE*>(malloc (size)))) {
267
+ PyErr_NoMemory ();
268
+ goto exit ;
269
+ }
270
+ if (!EnumProcessModules (process, modules, size, &size)) {
271
+ PyErr_SetFromWindowsErr (0 );
272
+ goto exit ;
273
+ }
264
274
bool tcl_ok = false , tk_ok = false ;
265
- // Returns pseudo-handle that does not need to be closed
266
- hProcess = GetCurrentProcess ();
267
- // Iterate through modules in this process looking for Tcl/Tk names.
268
- if (EnumProcessModules (hProcess, hMods, sizeof (hMods), &cbNeeded)) {
269
- for (i = 0 ; i < (cbNeeded / sizeof (HMODULE)); i++) {
270
- if (!tcl_ok) {
271
- tcl_ok = load_tcl (hMods[i]);
272
- }
273
- if (!tk_ok) {
274
- tk_ok = load_tk (hMods[i]);
275
- }
275
+ for (unsigned i = 0 ; i < size / sizeof (HMODULE); ++i) {
276
+ if (!tcl_ok) {
277
+ tcl_ok = load_tcl (modules[i]);
278
+ }
279
+ if (!tk_ok) {
280
+ tk_ok = load_tk (modules[i]);
276
281
}
277
282
}
283
+ exit :
284
+ free (modules);
278
285
}
279
286
280
287
#else // not Windows
0 commit comments