If the "Properties" button is clicked in the printdlg it opens the print properties dlg. The problem is the values set in the properties dlg don't get passed through correctly to the final printing stage. This prevents properties like duplex and page size from working.
-- v2: comdlg32: Don't use a shadow devmode structure in PrintDlgA. comdlg32/tests: Add tests for changing devmode properties in the hook procedure for PrintDlgA. comdlg32: Don't use a shadow devmode structure in PrintDlgW. comdlg32/tests: Add tests for changing devmode properties in the hook procedure for PrintDlgW.
From: Jacob Czekalla jczekalla@codeweavers.com
--- dlls/comdlg32/tests/printdlg.c | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)
diff --git a/dlls/comdlg32/tests/printdlg.c b/dlls/comdlg32/tests/printdlg.c index 7fd4567ba9e..bf96edca7ea 100644 --- a/dlls/comdlg32/tests/printdlg.c +++ b/dlls/comdlg32/tests/printdlg.c @@ -632,6 +632,67 @@ end: trace("Failed to delete temporary file (err = %lx)\n", GetLastError()); }
+static UINT_PTR CALLBACK printer_properties_hook_procW(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp) +{ + DEVMODEW* dm; + PRINTDLGW* dlg; + + if (msg == WM_INITDIALOG) + { + dlg = (PRINTDLGW*)lp; + dm = GlobalLock(dlg->hDevMode); + todo_wine + ok(dm->dmDuplex != 123, "dmDuplex should not equal 123 in the hook.\n"); + todo_wine + ok(dm->dmPaperSize != 321, "dmPaperSize should not equal 321 in the hook.\n"); + GlobalUnlock(dlg->hDevMode); + PostMessageW(hdlg, WM_COMMAND, psh2, lp); + } + if (msg == WM_COMMAND && wp == psh2) + { + dlg = (PRINTDLGW*)lp; + dm = GlobalLock(dlg->hDevMode); + dm->dmDuplex = 999; + dm->dmPaperSize = 888; + GlobalUnlock(dlg->hDevMode); + PostMessageW(hdlg, WM_COMMAND, IDOK, FALSE); + return TRUE; + } + return 0; +} + +void test_printer_propertiesW(void) +{ + PRINTDLGW pd = { 0 }; + DEVMODEW* dm; + + pd.lStructSize = sizeof(pd); + pd.Flags = PD_ENABLEPRINTHOOK; + pd.lpfnPrintHook = printer_properties_hook_procW; + + pd.hDevMode = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DEVMODEW)); + dm = GlobalLock(pd.hDevMode); + dm->dmSize = sizeof(*dm); + dm->dmFields |= DM_DUPLEX | DM_PAPERSIZE; + dm->dmDuplex = 123; + dm->dmPaperSize = 321; + GlobalUnlock(pd.hDevMode); + + if(!PrintDlgW(&pd)) + { + skip("No default printer available.\n"); + GlobalFree(pd.hDevMode); + return; + } + dm = GlobalLock(pd.hDevMode); + todo_wine + ok(dm->dmDuplex == 999, "expected 999, but got %d.\n", dm->dmDuplex); + todo_wine + ok(dm->dmPaperSize == 888, "expected 888, but got %d.\n", dm->dmPaperSize); + GlobalUnlock(pd.hDevMode); + GlobalFree(pd.hDevMode); +} + /* ########################### */
START_TEST(printdlg) @@ -643,4 +704,5 @@ START_TEST(printdlg) test_PrintDlgA(); test_PrintDlgExW(); test_abort_proc(); + test_printer_propertiesW(); }
From: Jacob Czekalla jczekalla@codeweavers.com
Changes to hDevMode made in the hook procedure should persist. --- dlls/comdlg32/printdlg.c | 71 +++++++++++++--------------------- dlls/comdlg32/tests/printdlg.c | 4 -- 2 files changed, 27 insertions(+), 48 deletions(-)
diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c index b5c67c3abad..a56498be05c 100644 --- a/dlls/comdlg32/printdlg.c +++ b/dlls/comdlg32/printdlg.c @@ -70,7 +70,6 @@ typedef struct
typedef struct { - LPDEVMODEW lpDevMode; LPPRINTDLGW lpPrintDlg; LPPRINTER_INFO_2W lpPrinterInfo; LPDRIVER_INFO_3W lpDriverInfo; @@ -660,7 +659,7 @@ static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, PRINT_PTRW* PrintStructures) { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; - PDEVMODEW lpdm = PrintStructures->lpDevMode; + PDEVMODEW lpdm = GlobalLock(lppd->hDevMode); LPPRINTER_INFO_2W pi = PrintStructures->lpPrinterInfo;
@@ -699,6 +698,7 @@ static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, resourcestr, 255); MessageBoxW(hDlg, resultstr, resourcestr, MB_OK | MB_ICONWARNING); + GlobalUnlock(lppd->hDevMode); return FALSE; } lppd->nFromPage = nFromPage; @@ -745,6 +745,7 @@ static BOOL PRINTDLG_UpdatePrintDlgW(HWND hDlg, lppd->nCopies = GetDlgItemInt(hDlg, edt3, NULL, FALSE); } } + GlobalUnlock(lppd->hDevMode); return TRUE; }
@@ -1288,7 +1289,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, PRINT_PTRW *PrintStructures) { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; - LPDEVMODEW lpdm = NULL; + LPDEVMODEW lpdm, dm_tmp; LONG dmSize; DWORD needed; HANDLE hprn; @@ -1314,28 +1315,27 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name,
PRINTDLG_UpdatePrinterInfoTextsW(hDlg, lppd->Flags, PrintStructures->lpPrinterInfo);
- free(PrintStructures->lpDevMode); - PrintStructures->lpDevMode = NULL; - dmSize = DocumentPropertiesW(0, 0, name, NULL, NULL, 0); if(dmSize == -1) { ERR("DocumentProperties fails on %s\n", debugstr_w(name)); return FALSE; } - PrintStructures->lpDevMode = malloc(dmSize); - dmSize = DocumentPropertiesW(0, 0, name, PrintStructures->lpDevMode, NULL, + dm_tmp = malloc(dmSize); + dmSize = DocumentPropertiesW(0, 0, name, dm_tmp, NULL, DM_OUT_BUFFER); - if(lppd->hDevMode && (lpdm = GlobalLock(lppd->hDevMode)) && - !lstrcmpW(lpdm->dmDeviceName, - PrintStructures->lpDevMode->dmDeviceName)) { - /* Supplied devicemode matches current printer so try to use it */ - DocumentPropertiesW(0, 0, name, PrintStructures->lpDevMode, lpdm, - DM_OUT_BUFFER | DM_IN_BUFFER); - } - if(lpdm) + if(lppd->hDevMode) + { + lpdm = GlobalLock(lppd->hDevMode); + if(!lstrcmpW(lpdm->dmDeviceName, dm_tmp->dmDeviceName)) + /* Supplied devicemode matches current printer so try to use it */ + DocumentPropertiesW(0, 0, name, dm_tmp, lpdm, DM_OUT_BUFFER | DM_IN_BUFFER); GlobalUnlock(lppd->hDevMode); - - lpdm = PrintStructures->lpDevMode; /* use this as a shortcut */ + lppd->hDevMode = GlobalReAlloc(lppd->hDevMode, dm_tmp->dmSize + dm_tmp->dmDriverExtra, GMEM_MOVEABLE); + }else + lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, dm_tmp->dmSize + dm_tmp->dmDriverExtra); + lpdm = GlobalLock(lppd->hDevMode); + memcpy(lpdm, dm_tmp, dm_tmp->dmSize + dm_tmp->dmDriverExtra); + free(dm_tmp);
if(!(lppd->Flags & PD_PRINTSETUP)) { /* Print range (All/Range/Selection) */ @@ -1488,6 +1488,7 @@ static BOOL PRINTDLG_ChangePrinterW(HWND hDlg, WCHAR *name, /* hide if PD_SHOWHELP not specified */ ShowWindow(GetDlgItem(hDlg, pshHelp), SW_HIDE); } + GlobalUnlock(lppd->hDevMode); return TRUE; }
@@ -1900,21 +1901,24 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, { LPPRINTDLGW lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; - LPDEVMODEW lpdm = PrintStructures->lpDevMode; + LPDEVMODEW lpdm = GlobalLock(lppd->hDevMode);
switch (LOWORD(wParam)) { case IDOK: TRACE(" OK button was hit\n"); if (!PRINTDLG_UpdatePrintDlgW(hDlg, PrintStructures)) { FIXME("Update printdlg was not successful!\n"); - return(FALSE); + GlobalUnlock(lppd->hDevMode); + return(FALSE); } EndDialog(hDlg, TRUE); + GlobalUnlock(lppd->hDevMode); return(TRUE);
case IDCANCEL: TRACE(" CANCEL button was hit\n"); EndDialog(hDlg, FALSE); + GlobalUnlock(lppd->hDevMode); return(FALSE);
case pshHelp: @@ -1965,8 +1969,8 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, break; } DocumentPropertiesW(hDlg, hPrinter, PrinterName, - PrintStructures->lpDevMode, - PrintStructures->lpDevMode, + lpdm, + lpdm, DM_IN_BUFFER | DM_OUT_BUFFER | DM_IN_PROMPT); ClosePrinter(hPrinter); break; @@ -2050,6 +2054,7 @@ static LRESULT PRINTDLG_WMCommandW(HWND hDlg, WPARAM wParam, break; } } + GlobalUnlock(lppd->hDevMode); return FALSE; }
@@ -2548,30 +2553,9 @@ BOOL WINAPI PrintDlgW(LPPRINTDLGW lppd) (LPARAM)PrintStructures));
if(bRet) { - DEVMODEW *lpdm = PrintStructures->lpDevMode, *lpdmReturn; PRINTER_INFO_2W *pi = PrintStructures->lpPrinterInfo; DRIVER_INFO_3W *di = PrintStructures->lpDriverInfo;
- if (lppd->hDevMode == 0) { - TRACE(" No hDevMode yet... Need to create my own\n"); - lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, - lpdm->dmSize + lpdm->dmDriverExtra); - } else { - WORD locks; - if((locks = (GlobalFlags(lppd->hDevMode) & GMEM_LOCKCOUNT))) { - WARN("hDevMode has %d locks on it. Unlocking it now\n", locks); - while(locks--) { - GlobalUnlock(lppd->hDevMode); - TRACE("Now got %d locks\n", locks); - } - } - lppd->hDevMode = GlobalReAlloc(lppd->hDevMode, - lpdm->dmSize + lpdm->dmDriverExtra, - GMEM_MOVEABLE); - } - lpdmReturn = GlobalLock(lppd->hDevMode); - memcpy(lpdmReturn, lpdm, lpdm->dmSize + lpdm->dmDriverExtra); - if (lppd->hDevNames != 0) { WORD locks; if((locks = (GlobalFlags(lppd->hDevNames) & GMEM_LOCKCOUNT))) { @@ -2587,7 +2571,6 @@ BOOL WINAPI PrintDlgW(LPPRINTDLGW lppd) ); GlobalUnlock(lppd->hDevMode); } - free(PrintStructures->lpDevMode); free(PrintStructures->lpPrinterInfo); free(PrintStructures->lpDriverInfo); free(PrintStructures); diff --git a/dlls/comdlg32/tests/printdlg.c b/dlls/comdlg32/tests/printdlg.c index bf96edca7ea..c2be5424695 100644 --- a/dlls/comdlg32/tests/printdlg.c +++ b/dlls/comdlg32/tests/printdlg.c @@ -641,9 +641,7 @@ static UINT_PTR CALLBACK printer_properties_hook_procW(HWND hdlg, UINT msg, WPAR { dlg = (PRINTDLGW*)lp; dm = GlobalLock(dlg->hDevMode); - todo_wine ok(dm->dmDuplex != 123, "dmDuplex should not equal 123 in the hook.\n"); - todo_wine ok(dm->dmPaperSize != 321, "dmPaperSize should not equal 321 in the hook.\n"); GlobalUnlock(dlg->hDevMode); PostMessageW(hdlg, WM_COMMAND, psh2, lp); @@ -685,9 +683,7 @@ void test_printer_propertiesW(void) return; } dm = GlobalLock(pd.hDevMode); - todo_wine ok(dm->dmDuplex == 999, "expected 999, but got %d.\n", dm->dmDuplex); - todo_wine ok(dm->dmPaperSize == 888, "expected 888, but got %d.\n", dm->dmPaperSize); GlobalUnlock(pd.hDevMode); GlobalFree(pd.hDevMode);
From: Jacob Czekalla jczekalla@codeweavers.com
--- dlls/comdlg32/tests/printdlg.c | 62 ++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+)
diff --git a/dlls/comdlg32/tests/printdlg.c b/dlls/comdlg32/tests/printdlg.c index c2be5424695..3a09e2db196 100644 --- a/dlls/comdlg32/tests/printdlg.c +++ b/dlls/comdlg32/tests/printdlg.c @@ -689,6 +689,67 @@ void test_printer_propertiesW(void) GlobalFree(pd.hDevMode); }
+static UINT_PTR CALLBACK printer_properties_hook_procA(HWND hdlg, UINT msg, WPARAM wp, LPARAM lp) +{ + DEVMODEA* dm; + PRINTDLGA* dlg; + + if (msg == WM_INITDIALOG) + { + dlg = (PRINTDLGA*)lp; + dm = GlobalLock(dlg->hDevMode); + todo_wine + ok(dm->dmDuplex != 123, "dmDuplex should not equal 123 in the hook.\n"); + todo_wine + ok(dm->dmPaperSize != 321, "dmPaperSize should not equal 321 in the hook.\n"); + GlobalUnlock(dlg->hDevMode); + PostMessageW(hdlg, WM_COMMAND, psh2, lp); + } + if (msg == WM_COMMAND && wp == psh2) + { + dlg = (PRINTDLGA*)lp; + dm = GlobalLock(dlg->hDevMode); + dm->dmDuplex = 999; + dm->dmPaperSize = 888; + GlobalUnlock(dlg->hDevMode); + PostMessageW(hdlg, WM_COMMAND, IDOK, FALSE); + return TRUE; + } + return 0; +} + +void test_printer_propertiesA(void) +{ + PRINTDLGA pd = { 0 }; + DEVMODEA* dm; + + pd.lStructSize = sizeof(pd); + pd.Flags = PD_ENABLEPRINTHOOK; + pd.lpfnPrintHook = printer_properties_hook_procA; + + pd.hDevMode = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, sizeof(DEVMODEA)); + dm = GlobalLock(pd.hDevMode); + dm->dmSize = sizeof(*dm); + dm->dmFields |= DM_DUPLEX | DM_PAPERSIZE; + dm->dmDuplex = 123; + dm->dmPaperSize = 321; + GlobalUnlock(pd.hDevMode); + + if(!PrintDlgA(&pd)) + { + skip("No default printer available.\n"); + GlobalFree(pd.hDevMode); + return; + } + dm = GlobalLock(pd.hDevMode); + todo_wine + ok(dm->dmDuplex == 999, "expected 999, but got %d.\n", dm->dmDuplex); + todo_wine + ok(dm->dmPaperSize == 888, "expected 888, but got %d.\n", dm->dmPaperSize); + GlobalUnlock(pd.hDevMode); + GlobalFree(pd.hDevMode); +} + /* ########################### */
START_TEST(printdlg) @@ -701,4 +762,5 @@ START_TEST(printdlg) test_PrintDlgExW(); test_abort_proc(); test_printer_propertiesW(); + test_printer_propertiesA(); }
From: Jacob Czekalla jczekalla@codeweavers.com
Changes to hDevMode made in the hook procedure should persist. --- dlls/comdlg32/printdlg.c | 61 +++++++++++++++------------------- dlls/comdlg32/tests/printdlg.c | 4 --- 2 files changed, 26 insertions(+), 39 deletions(-)
diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c index a56498be05c..84079c6a004 100644 --- a/dlls/comdlg32/printdlg.c +++ b/dlls/comdlg32/printdlg.c @@ -56,7 +56,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
typedef struct { - LPDEVMODEA lpDevMode; LPPRINTDLGA lpPrintDlg; LPPRINTER_INFO_2A lpPrinterInfo; LPDRIVER_INFO_3A lpDriverInfo; @@ -556,7 +555,7 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, PRINT_PTRA* PrintStructures) { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; - PDEVMODEA lpdm = PrintStructures->lpDevMode; + PDEVMODEA lpdm = GlobalLock(lppd->hDevMode); LPPRINTER_INFO_2A pi = PrintStructures->lpPrinterInfo;
@@ -588,6 +587,7 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, wsprintfW(resultstr,resourcestr, lppd->nMinPage, lppd->nMaxPage); LoadStringW(COMDLG32_hInstance, PD32_PRINT_TITLE, resourcestr, 255); MessageBoxW(hDlg, resultstr, resourcestr, MB_OK | MB_ICONWARNING); + GlobalUnlock(lppd->hDevMode); return FALSE; } lppd->nFromPage = nFromPage; @@ -652,6 +652,7 @@ static BOOL PRINTDLG_UpdatePrintDlgA(HWND hDlg, } } } + GlobalUnlock(lppd->hDevMode); return TRUE; }
@@ -1082,7 +1083,7 @@ static void PRINTDLG_UpdatePrinterInfoTextsW(HWND hDlg, DWORD flags, const PRINT static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStructures) { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; - LPDEVMODEA lpdm = NULL; + LPDEVMODEA lpdm, dm_tmp; LONG dmSize; DWORD needed; HANDLE hprn; @@ -1108,28 +1109,27 @@ static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStru
PRINTDLG_UpdatePrinterInfoTextsA(hDlg, lppd->Flags, PrintStructures->lpPrinterInfo);
- free(PrintStructures->lpDevMode); - PrintStructures->lpDevMode = NULL; - dmSize = DocumentPropertiesA(0, 0, name, NULL, NULL, 0); if(dmSize == -1) { ERR("DocumentProperties fails on %s\n", debugstr_a(name)); return FALSE; } - PrintStructures->lpDevMode = malloc(dmSize); - dmSize = DocumentPropertiesA(0, 0, name, PrintStructures->lpDevMode, NULL, + dm_tmp = malloc(dmSize); + dmSize = DocumentPropertiesA(0, 0, name, dm_tmp, NULL, DM_OUT_BUFFER); - if(lppd->hDevMode && (lpdm = GlobalLock(lppd->hDevMode)) && - !lstrcmpA( (LPSTR) lpdm->dmDeviceName, - (LPSTR) PrintStructures->lpDevMode->dmDeviceName)) { - /* Supplied devicemode matches current printer so try to use it */ - DocumentPropertiesA(0, 0, name, PrintStructures->lpDevMode, lpdm, - DM_OUT_BUFFER | DM_IN_BUFFER); - } - if(lpdm) + if(lppd->hDevMode) + { + lpdm = GlobalLock(lppd->hDevMode); + if(!lstrcmpA((LPSTR)lpdm->dmDeviceName, (LPSTR)dm_tmp->dmDeviceName)) + /* Supplied devicemode matches current printer so try to use it */ + DocumentPropertiesA(0, 0, name, dm_tmp, lpdm, DM_OUT_BUFFER | DM_IN_BUFFER); GlobalUnlock(lppd->hDevMode); - - lpdm = PrintStructures->lpDevMode; /* use this as a shortcut */ + lppd->hDevMode = GlobalReAlloc(lppd->hDevMode, dm_tmp->dmSize + dm_tmp->dmDriverExtra, GMEM_MOVEABLE); + }else + lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, dm_tmp->dmSize + dm_tmp->dmDriverExtra); + lpdm = GlobalLock(lppd->hDevMode); + memcpy(lpdm, dm_tmp, dm_tmp->dmSize + dm_tmp->dmDriverExtra); + free(dm_tmp);
if(!(lppd->Flags & PD_PRINTSETUP)) { /* Print range (All/Range/Selection) */ @@ -1282,6 +1282,7 @@ static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name, PRINT_PTRA *PrintStru /* hide if PD_SHOWHELP not specified */ ShowWindow(GetDlgItem(hDlg, pshHelp), SW_HIDE); } + GlobalUnlock(lppd->hDevMode); return TRUE; }
@@ -1744,21 +1745,24 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, { LPPRINTDLGA lppd = PrintStructures->lpPrintDlg; UINT PrinterComboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4; - LPDEVMODEA lpdm = PrintStructures->lpDevMode; + LPDEVMODEA lpdm = GlobalLock(lppd->hDevMode);
switch (LOWORD(wParam)) { case IDOK: TRACE(" OK button was hit\n"); if (!PRINTDLG_UpdatePrintDlgA(hDlg, PrintStructures)) { FIXME("Update printdlg was not successful!\n"); + GlobalUnlock(lppd->hDevMode); return(FALSE); } EndDialog(hDlg, TRUE); + GlobalUnlock(lppd->hDevMode); return(TRUE);
case IDCANCEL: TRACE(" CANCEL button was hit\n"); EndDialog(hDlg, FALSE); + GlobalUnlock(lppd->hDevMode); return(FALSE);
case pshHelp: @@ -1809,8 +1813,8 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, break; } DocumentPropertiesA(hDlg, hPrinter, PrinterName, - PrintStructures->lpDevMode, - PrintStructures->lpDevMode, + lpdm, + lpdm, DM_IN_BUFFER | DM_OUT_BUFFER | DM_IN_PROMPT); ClosePrinter(hPrinter); break; @@ -1893,6 +1897,7 @@ static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam, break; } } + GlobalUnlock(lppd->hDevMode); return FALSE; }
@@ -2403,22 +2408,9 @@ BOOL WINAPI PrintDlgA(LPPRINTDLGA lppd) (LPARAM)PrintStructures));
if(bRet) { - DEVMODEA *lpdm = PrintStructures->lpDevMode, *lpdmReturn; PRINTER_INFO_2A *pi = PrintStructures->lpPrinterInfo; DRIVER_INFO_3A *di = PrintStructures->lpDriverInfo;
- if (lppd->hDevMode == 0) { - TRACE(" No hDevMode yet... Need to create my own\n"); - lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, - lpdm->dmSize + lpdm->dmDriverExtra); - } else { - lppd->hDevMode = GlobalReAlloc(lppd->hDevMode, - lpdm->dmSize + lpdm->dmDriverExtra, - GMEM_MOVEABLE); - } - lpdmReturn = GlobalLock(lppd->hDevMode); - memcpy(lpdmReturn, lpdm, lpdm->dmSize + lpdm->dmDriverExtra); - PRINTDLG_CreateDevNames(&(lppd->hDevNames), di->pDriverPath, pi->pPrinterName, @@ -2426,7 +2418,6 @@ BOOL WINAPI PrintDlgA(LPPRINTDLGA lppd) ); GlobalUnlock(lppd->hDevMode); } - free(PrintStructures->lpDevMode); free(PrintStructures->lpPrinterInfo); free(PrintStructures->lpDriverInfo); free(PrintStructures); diff --git a/dlls/comdlg32/tests/printdlg.c b/dlls/comdlg32/tests/printdlg.c index 3a09e2db196..57fcbabad30 100644 --- a/dlls/comdlg32/tests/printdlg.c +++ b/dlls/comdlg32/tests/printdlg.c @@ -698,9 +698,7 @@ static UINT_PTR CALLBACK printer_properties_hook_procA(HWND hdlg, UINT msg, WPAR { dlg = (PRINTDLGA*)lp; dm = GlobalLock(dlg->hDevMode); - todo_wine ok(dm->dmDuplex != 123, "dmDuplex should not equal 123 in the hook.\n"); - todo_wine ok(dm->dmPaperSize != 321, "dmPaperSize should not equal 321 in the hook.\n"); GlobalUnlock(dlg->hDevMode); PostMessageW(hdlg, WM_COMMAND, psh2, lp); @@ -742,9 +740,7 @@ void test_printer_propertiesA(void) return; } dm = GlobalLock(pd.hDevMode); - todo_wine ok(dm->dmDuplex == 999, "expected 999, but got %d.\n", dm->dmDuplex); - todo_wine ok(dm->dmPaperSize == 888, "expected 888, but got %d.\n", dm->dmPaperSize); GlobalUnlock(pd.hDevMode); GlobalFree(pd.hDevMode);
Let's merge `test_printer_propertiesA()` with the existing `test_PrintDlgA()` tests (i.e. add the code in the former to the end of the latter) - this will get you the printer not configured check for free.
Similarly, let's make `test_printer_propertiesW()` more general, call it `test_PrintDlgW()` and move it to just below `test_PrintDlgA()` in the file. You'll need to add a printer not configured check here, but there's no need to copy all the other 'A' tests.