Possible handle leak

Using WindowsXP sp2, SDL version 1.2.12
file: \video\wincommon\sdl_syswm.c

code in question:

void WIN_SetWMCaption(_THIS, const char *title, const char icon)
{
#ifdef _WIN32_WCE
/
WinCE uses the UNICODE version */
LPWSTR lpszW = SDL_iconv_utf8_ucs2((char )title);
SetWindowText(SDL_Window, lpszW);
SDL_free(lpszW);
#else
/

* Try loading SetWindowTextW from kernel32.dll first, and if it exists,
* pass the UCS-2 string to it. If it doesn’t, use
* WideCharToMultiByte(CP_ACP) and hope that the codepage can support
the
* string data in question. This lets us keep binary compatibility with
* Win95/98/ME but still use saner Unicode on NT-based Windows.
*/
static int tried_loading = 0;
static PtrSetWindowTextW swtw = NULL;
Uint16 *lpsz = SDL_iconv_utf8_ucs2(title);
if (!tried_loading) {
HMODULE dll = LoadLibrary(“user32.dll”);
if (dll != NULL) {
swtw = (PtrSetWindowTextW) GetProcAddress(dll,
“SetWindowTextW”);
if (swtw == NULL) {
FreeLibrary(dll);
}
}
tried_loading = 1;
}

if (swtw != NULL) {
    swtw(SDL_Window, lpsz);
} else {
    size_t len = WideCharToMultiByte(CP_ACP, 0, lpsz, -1, NULL, 0, NULL,

NULL);
char *cvt = SDL_malloc(len + 1);
WideCharToMultiByte(CP_ACP, 0, lpsz, -1, cvt, len, NULL, NULL);
SetWindowText(SDL_Window, cvt);
SDL_free(cvt);
}
SDL_free(lpsz);
#endif
}

The call to load the library "HMODULE dll = LoadLibrary(“user32.dll”)"
Does this have a matching close, as the handle is scoped in the if not tried
block and seems to be only release if the function is not found.

Thanks.

Using WindowsXP sp2, SDL version 1.2.12
file: \video\wincommon\sdl_syswm.c

code in question:

void WIN_SetWMCaption(_THIS, const char *title, const char icon)
{
#ifdef _WIN32_WCE
/
WinCE uses the UNICODE version */
LPWSTR lpszW = SDL_iconv_utf8_ucs2((char )title);
SetWindowText(SDL_Window, lpszW);
SDL_free(lpszW);
#else
/

* Try loading SetWindowTextW from kernel32.dll first, and if it exists,

 *  pass the UCS-2 string to it. If it doesn't, use
 *  WideCharToMultiByte(CP_ACP) and hope that the codepage can support

the
* string data in question. This lets us keep binary compatibility with

 *  Win95/98/ME but still use saner Unicode on NT-based Windows.
 */
static int tried_loading = 0;
static PtrSetWindowTextW swtw = NULL;
Uint16 *lpsz = SDL_iconv_utf8_ucs2(title);
if (!tried_loading) {
    HMODULE dll = LoadLibrary("user32.dll");
    if (dll != NULL) {
        swtw = (PtrSetWindowTextW) GetProcAddress(dll,

“SetWindowTextW”);
if (swtw == NULL) {
FreeLibrary(dll);
}
}
tried_loading = 1;
}

if (swtw != NULL) {
    swtw(SDL_Window, lpsz);
} else {
    size_t len = WideCharToMultiByte(CP_ACP, 0, lpsz, -1, NULL, 0, NULL,

NULL);
char *cvt = SDL_malloc(len + 1);
WideCharToMultiByte(CP_ACP, 0, lpsz, -1, cvt, len, NULL, NULL);
SetWindowText(SDL_Window, cvt);
SDL_free(cvt);
}
SDL_free(lpsz);
#endif
}

The call to load the library "HMODULE dll = LoadLibrary(“user32.dll”)"
Does this have a matching close, as the handle is scoped in the if not tried
block and seems to be only release if the function is not found.

Thanks Liam.

file: \video\wincommon\sdl_syswm.c
[…]
static int tried_loading = 0;
static PtrSetWindowTextW swtw = NULL;
Uint16 *lpsz = SDL_iconv_utf8_ucs2(title);
if (!tried_loading) {
HMODULE dll = LoadLibrary(“user32.dll”);
if (dll != NULL) {
swtw = (PtrSetWindowTextW) GetProcAddress(dll,
“SetWindowTextW”);
if (swtw == NULL) {
FreeLibrary(dll);
}
}
tried_loading = 1;
}
[…]
The call to load the library “HMODULE dll = LoadLibrary(“user32.dll”)”

This DLL is not unloaded except by terminating the program and I would say
it’s by design. It wouldn’t be unloaded anyway, only its refcounter
decremented, because user32.dll is loaded in pretty much any process.
Further, it is also only loaded once, notice the ‘static’ for 'tried_loading’
and ‘swtw’.

Summary: it could be technically called a leak, but it doesn’t create a
resource problem.

UliOn Sunday 28 October 2007 20:47:37 liam mail wrote: