From 32fd5b217f25964d12325133e9cc8dd8fe715f58 Mon Sep 17 00:00:00 2001 From: iProgramInCpp Date: Sat, 21 Sep 2024 09:56:55 +0300 Subject: [PATCH] * Fix resource leaks in ProfilePopout --- src/windows/ProfilePopout.cpp | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/windows/ProfilePopout.cpp b/src/windows/ProfilePopout.cpp index 31b6a6f..c00b80e 100644 --- a/src/windows/ProfilePopout.cpp +++ b/src/windows/ProfilePopout.cpp @@ -322,7 +322,7 @@ bool ProfilePopout::Layout(HWND hWnd, SIZE& fullSize) if (hbm) { hdc = GetDC(hWnd); int pps = GetProfilePictureSize(); - m_hBitmap = ResizeWithBackgroundColor( + HBITMAP hnewbm = ResizeWithBackgroundColor( hdc, hbm, GetSysColorBrush(COLOR_3DFACE), @@ -334,7 +334,8 @@ bool ProfilePopout::Layout(HWND hWnd, SIZE& fullSize) ); ReleaseDC(hWnd, hdc); ShowWindow(hChild, SW_SHOW); - SendMessage(hChild, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)m_hBitmap); + HBITMAP holdbm = (HBITMAP) SendMessage(hChild, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hnewbm); + if (holdbm) DeleteBitmap(holdbm); } hChild = GetDlgItem(hWnd, IDC_GUILD_JOIN_DATE); ShowWindow(hChild, SW_SHOW); @@ -351,14 +352,14 @@ bool ProfilePopout::Layout(HWND hWnd, SIZE& fullSize) if (rcMemberSinceDiscord.bottom) { int icsz = GetSystemMetrics(SM_CXSMICON); - if (icsz <= 16) icsz = 16; // ensure a common size so LoadImage wont leak our LR_SHARED loaded icon - else if (icsz <= 32) icsz = 32; - else if (icsz <= 48) icsz = 48; - else icsz = 64; hChild = GetDlgItem(hWnd, IDC_ICON_DISCORD); ShowWindow(hChild, SW_SHOW); MoveWindow(hChild, pos.x, pos.y, joinedAtIconSize, joinedAtIconSize, TRUE); - SendMessage(hChild, STM_SETIMAGE, IMAGE_ICON, (LPARAM) LoadImage(g_hInstance, MAKEINTRESOURCE(DMIC(IDI_ICON)), IMAGE_ICON, icsz, icsz, LR_SHARED | LR_CREATEDIBSECTION)); + + // note: the old icon may have been set by the dialog itself. + HICON hic = (HICON) SendMessage(hChild, STM_SETIMAGE, IMAGE_ICON, (LPARAM)LoadImage(g_hInstance, MAKEINTRESOURCE(DMIC(IDI_ICON)), IMAGE_ICON, icsz, icsz, LR_CREATEDIBSECTION)); + if (hic) DestroyIcon(hic); + hChild = GetDlgItem(hWnd, IDC_DISCORD_JOIN_DATE); ShowWindow(hChild, SW_SHOW); SetWindowText(hChild, dscJoinedAt); @@ -509,18 +510,28 @@ BOOL CALLBACK ProfilePopout::Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP return res; } - case WM_DESTROY: + case WM_DESTROY: { FlushNote(); + HWND hMSDIcon = GetDlgItem(hWnd, IDC_ICON_DISCORD); + HWND hMSGIcon = GetDlgItem(hWnd, IDC_ICON_GUILD); + HICON hic = (HICON) SendMessage(hMSDIcon, STM_SETIMAGE, IMAGE_ICON, (LPARAM) NULL); + if (hic) + DestroyIcon(hic); // the icon was loaded without LR_SHARED + HBITMAP hbm = (HBITMAP) SendMessage(hMSGIcon, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM) NULL); + if (hbm) + DeleteBitmap(hbm); + m_hwnd = NULL; SAFE_DELETE(m_pRoleList); SAFE_DELETE(m_pProfileView); if (m_hBitmap) { - DeleteBitmap(m_hBitmap); + //DeleteBitmap(m_hBitmap); m_hBitmap = NULL; } return TRUE; + } } return FALSE;