• R/O
  • SSH
  • HTTPS

ttssh2: コミット


コミットメタ情報

リビジョン9923 (tree)
日時2022-05-15 00:29:04
作者zmatsuo

ログメッセージ

[Setup]/[Additional settings]ダイアログでメモリリークが発生することがあったので修正

- プロパティーシートページは表示しない(タブを選択しない)とページが生成されないようだ

- WM_DESTROY で後処理(メモリ開放)を行っていた
- シート(window)が生成されないため WM_DESTROY は発生しない
- メモリの開放が行われない

- 必ず呼び出される PROPSHEETPAGE.pfnCallback を使って後処理を行うよう修正

変更サマリ

差分

--- trunk/teraterm/teraterm/coding_pp.cpp (revision 9922)
+++ trunk/teraterm/teraterm/coding_pp.cpp (revision 9923)
@@ -279,12 +279,6 @@
279279 }
280280 break;
281281 }
282- case WM_DESTROY: {
283- free(DlgData->dlg_templ);
284- free(DlgData);
285- SetWindowLongPtr(hWnd, DWLP_USER, NULL);
286- break;
287- }
288282 default:
289283 return FALSE;
290284 }
@@ -291,6 +285,26 @@
291285 return FALSE;
292286 }
293287
288+static UINT CallBack(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp)
289+{
290+ (void)hwnd;
291+ UINT ret_val = 0;
292+ switch (uMsg) {
293+ case PSPCB_CREATE:
294+ ret_val = 1;
295+ break;
296+ case PSPCB_RELEASE:
297+ free((void *)ppsp->pResource);
298+ ppsp->pResource = NULL;
299+ free((void *)ppsp->lParam);
300+ ppsp->lParam = NULL;
301+ break;
302+ default:
303+ break;
304+ }
305+ return ret_val;
306+}
307+
294308 HPROPSHEETPAGE CodingPageCreate(HINSTANCE inst, TTTSet *pts)
295309 {
296310 // 注 common/tt_res.h と coding_pp_res.h で値を一致させること
@@ -302,8 +316,10 @@
302316
303317 PROPSHEETPAGEW_V1 psp = {};
304318 psp.dwSize = sizeof(psp);
305- psp.dwFlags = PSP_DEFAULT;
319+ psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK | PSP_USETITLE | PSP_HASHELP;
306320 psp.hInstance = inst;
321+ psp.pfnCallback = CallBack;
322+ psp.pszTitle = L"coding"; // TODO lng ファイルに入れる
307323 psp.pszTemplate = MAKEINTRESOURCEW(id);
308324 #if defined(REWRITE_TEMPLATE)
309325 psp.dwFlags |= PSP_DLGINDIRECT;
@@ -310,8 +326,6 @@
310326 Param->dlg_templ = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
311327 psp.pResource = Param->dlg_templ;
312328 #endif
313- psp.pszTitle = L"coding"; // TODO lng ファイルに入れる
314- psp.dwFlags |= (PSP_USETITLE | PSP_HASHELP);
315329
316330 psp.pfnDlgProc = Proc;
317331 psp.lParam = (LPARAM)Param;
--- trunk/teraterm/teraterm/font_pp.cpp (revision 9922)
+++ trunk/teraterm/teraterm/font_pp.cpp (revision 9923)
@@ -252,12 +252,6 @@
252252 }
253253 break;
254254 }
255- case WM_DESTROY: {
256- free(dlg_data->dlg_templ);
257- free(dlg_data);
258- SetWindowLongPtr(hWnd, DWLP_USER, NULL);
259- break;
260- }
261255 default:
262256 return FALSE;
263257 }
@@ -264,6 +258,26 @@
264258 return FALSE;
265259 }
266260
261+static UINT CallBack(HWND hwnd, UINT uMsg, struct _PROPSHEETPAGEW *ppsp)
262+{
263+ (void)hwnd;
264+ UINT ret_val = 0;
265+ switch (uMsg) {
266+ case PSPCB_CREATE:
267+ ret_val = 1;
268+ break;
269+ case PSPCB_RELEASE:
270+ free((void *)ppsp->pResource);
271+ ppsp->pResource = NULL;
272+ free((void *)ppsp->lParam);
273+ ppsp->lParam = NULL;
274+ break;
275+ default:
276+ break;
277+ }
278+ return ret_val;
279+}
280+
267281 HPROPSHEETPAGE FontPageCreate(HINSTANCE inst, TTTSet *pts)
268282 {
269283 // 注 common/tt_res.h と font_pp_res.h で値を一致させること
@@ -276,8 +290,10 @@
276290
277291 PROPSHEETPAGEW_V1 psp = {};
278292 psp.dwSize = sizeof(psp);
279- psp.dwFlags = PSP_DEFAULT;
293+ psp.dwFlags = PSP_DEFAULT | PSP_USECALLBACK | PSP_USETITLE /*| PSP_HASHELP */;
280294 psp.hInstance = inst;
295+ psp.pfnCallback = CallBack;
296+ psp.pszTitle = L"font"; // TODO lng ファイルに入れる
281297 psp.pszTemplate = MAKEINTRESOURCEW(id);
282298 #if defined(REWRITE_TEMPLATE)
283299 psp.dwFlags |= PSP_DLGINDIRECT;
@@ -284,8 +300,6 @@
284300 Param->dlg_templ = TTGetDlgTemplate(inst, MAKEINTRESOURCEA(id));
285301 psp.pResource = Param->dlg_templ;
286302 #endif
287- psp.pszTitle = L"font";
288- psp.dwFlags |= (PSP_USETITLE /*| PSP_HASHELP */);
289303
290304 psp.pfnDlgProc = Proc;
291305 psp.lParam = (LPARAM)Param;
旧リポジトリブラウザで表示