Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support arbitrary number of loaded modules on Windows #6761

Merged
merged 9 commits into from
Jan 7, 2023
31 changes: 23 additions & 8 deletions src/Tk/tkImaging.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ load_tkinter_funcs(void) {
* Return 0 for success, non-zero for failure.
*/

HMODULE hMods[1024];
HMODULE* hMods = NULL;
HANDLE hProcess;
DWORD cbNeeded;
unsigned int i;
Expand All @@ -327,33 +327,48 @@ load_tkinter_funcs(void) {
/* Returns pseudo-handle that does not need to be closed */
hProcess = GetCurrentProcess();

/* Allocate module handlers array */
if (!EnumProcessModules(hProcess, NULL, 0, &cbNeeded)) {
#if defined(__CYGWIN__)
PyErr_SetString(PyExc_OSError, "Call to EnumProcessModules failed");
#else
PyErr_SetFromWindowsErr(0);
#endif
return 1;
}
if (!(hMods = (HMODULE*) malloc(cbNeeded))) {
PyErr_NoMemory();
return 1;
}

/* Iterate through modules in this process looking for Tcl / Tk names */
if (EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) {
if (EnumProcessModules(hProcess, hMods, cbNeeded, &cbNeeded)) {
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
if (!found_tcl) {
found_tcl = get_tcl(hMods[i]);
if (found_tcl == -1) {
return 1;
break;
}
}
if (!found_tk) {
found_tk = get_tk(hMods[i]);
if (found_tk == -1) {
return 1;
break;
}
}
if (found_tcl && found_tk) {
return 0;
break;
}
}
}

if (found_tcl == 0) {
free(hMods);
if (found_tcl != 1) {
javidcf marked this conversation as resolved.
Show resolved Hide resolved
PyErr_SetString(PyExc_RuntimeError, "Could not find Tcl routines");
} else {
} else if (found_tk != 1) {
javidcf marked this conversation as resolved.
Show resolved Hide resolved
PyErr_SetString(PyExc_RuntimeError, "Could not find Tk routines");
}
return 1;
return (int) ((found_tcl != 1) && (found_tk != 1));
javidcf marked this conversation as resolved.
Show resolved Hide resolved
}

#else /* not Windows */
Expand Down