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 690028e1ca7..e30971aba75 100644 --- a/dlls/comdlg32/tests/printdlg.c +++ b/dlls/comdlg32/tests/printdlg.c @@ -134,9 +134,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); @@ -313,9 +311,7 @@ static void test_PrintDlgA(void)
PrintDlgA(pDlg); dm = GlobalLock(pDlg->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(pDlg->hDevMode); GlobalFree(pDlg->hDevMode);