📄 prntmrui.cpp
字号:
{ // malloc() has failed - bail out. ClosePrinter( hPrinter ); return FALSE; } if( ! GetPrinter( hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded ) ) { // Second call to GetPrinter() has failed - bail out. free( pi2 ); ClosePrinter( hPrinter ); return FALSE; } // We won't mess with the security on the printer. pi2->pSecurityDescriptor = NULL; BOOL set = TRUE; if(!(pi2->Attributes & PRINTER_ATTRIBUTE_SHARED)) set = FALSE; // If you want to share the printer, set the bit and the name. if( bShare ) { pi2->pShareName = szShareName; pi2->Attributes |= PRINTER_ATTRIBUTE_SHARED; } else // Otherwise, clear the bit. { pi2->Attributes = pi2->Attributes & (~PRINTER_ATTRIBUTE_SHARED); } // Make the change. if(set && ! SetPrinter( hPrinter, 2, (LPBYTE)pi2, 0 ) ) { // SetPrinter() has failed - bail out free( pi2 ); ClosePrinter( hPrinter ); return FALSE; } // Clean up. free( pi2 ); ClosePrinter( hPrinter ); return TRUE;} //-----------------------------------------------------------------------------LONG PMUIDriver::DrvDevicePropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam){ DUMPMSG("DrvDevicePropertySheets"); PDEVICEPROPERTYHEADER pDPHdr; if ((!pPSUIInfo) || (!(pDPHdr = (PDEVICEPROPERTYHEADER)pPSUIInfo->lParamInit))) { SetLastError(ERROR_INVALID_DATA); return(ERR_CPSUI_GETLASTERROR); } switch (pPSUIInfo->Reason) { case PROPSHEETUI_REASON_INIT: { DUMPMSG("DrvDevicePropertySheets Init "); PROPSHEETPAGE *psp = (PROPSHEETPAGE *)malloc(sizeof(PROPSHEETPAGE)); memset(psp ,0, sizeof(PROPSHEETPAGE)); FillInPropertyPage( psp, IDD_DEVICEDIALOG, TEXT(""), DevicePropertiesDialog,NULL); pPSUIInfo->UserData = NULL; if (pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)psp, (LPARAM)0)) pPSUIInfo->Result = CPSUI_CANCEL; } return 1; case PROPSHEETUI_REASON_DESTROY: { HANDLE hPrinter = pDPHdr->hPrinter; DWORD dwNeeded; GetPrinter( hPrinter, 2, NULL, 0, &dwNeeded ); LPBYTE pi2 = (LPBYTE)malloc( dwNeeded ); GetPrinter( hPrinter, 2, (LPBYTE)pi2, dwNeeded, &dwNeeded ); OutputDebugStringW(((PRINTER_INFO_2 *)pi2)->pPrinterName); DonotSharePrinterNT(((PRINTER_INFO_2 *)pi2)->pPrinterName,NULL,FALSE); free(pi2); return 1; } } return 1;}void ValidateDevMode(VDEVMODE * ValidDevMode , VDEVMODE * inDevMode){ PDEVMODE indm = (PDEVMODE)(inDevMode); PDEVMODE validdm = (PDEVMODE)ValidDevMode; if(indm) { if(indm->dmFields & DM_ORIENTATION) { validdm->dmOrientation = indm->dmOrientation; validdm->dmFields |= DM_ORIENTATION; } if(indm->dmFields & DM_PAPERSIZE) { validdm->dmPaperSize = indm->dmPaperSize; validdm->dmFields |= DM_PAPERSIZE; } if(indm->dmFields & DM_PRINTQUALITY) { validdm->dmPrintQuality = indm->dmPrintQuality; validdm->dmFields |= DM_PRINTQUALITY; } if(indm->dmFields & DM_COLOR) { validdm->dmColor = indm->dmColor; validdm->dmFields |= DM_COLOR; } if(indm->dmFields & DM_DUPLEX) { validdm->dmDuplex = indm->dmDuplex; validdm->dmFields |= DM_DUPLEX; } if(indm->dmFields & DM_COLLATE) { validdm->dmCollate = indm->dmCollate; validdm->dmFields |= DM_COLLATE; } if(indm->dmFields & DM_COPIES) { validdm->dmCollate = indm->dmCopies; validdm->dmFields |= DM_COPIES; } memcpy((void *)&(ValidDevMode->pdm) ,(void *)&(inDevMode->pdm) , sizeof(VPDEVMODE)); }}//-----------------------------------------------------------------------------LONG PMUIDriver::DrvDocumentPropertySheets(PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam){ DUMPMSG("DrvDocumentPropertySheets"); /* * Info without a dialog box */ if (pPSUIInfo == NULL) { PDOCUMENTPROPERTYHEADER pDPH; pDPH = (PDOCUMENTPROPERTYHEADER)lParam; if (pDPH == NULL) { return -1; } /* return the devmode size */ if (pDPH->fMode == 0 || pDPH->pdmOut == NULL) { pDPH->cbOut = sizeof(VDEVMODE); return pDPH->cbOut; } /* call the master function, DrvDocumentProperties for other processing */ if (pDPH->fMode) { LONG pcbNeeded = pDPH->cbOut; if(DrvDocumentProperties(NULL, pDPH->hPrinter, pDPH->pszPrinterName, pDPH->pdmOut, pDPH->pdmIn, pDPH->fMode,TRUE) == 0) return 0; } return 1; } switch (pPSUIInfo->Reason) { case PROPSHEETUI_REASON_INIT: { /* * Initialize the Property sheet */ WCHAR RealDriverName1[256]; PROPSHEETPAGE *psp = (PROPSHEETPAGE *)malloc(sizeof(PROPSHEETPAGE)); PDOCUMENTPROPERTYHEADER pDPH = (PDOCUMENTPROPERTYHEADER)lParam; WCHAR *RealDriverName; LPBYTE pBuffer = NULL; PRINTER_DEFAULTS defaults = { NULL, NULL, PRINTER_ALL_ACCESS }; HANDLE hPrinter; OpenPrinter(pDPH->pszPrinterName,&hPrinter,&defaults); DWORD cbNeeded = 0; BOOL Fail = FALSE; PDEVMODE pdm = NULL; if(GetPrinterData(hPrinter,L"PrinterSettings",NULL, (LPBYTE)pBuffer,0,&cbNeeded) == ERROR_MORE_DATA) { pBuffer = (LPBYTE)malloc(cbNeeded); DWORD dwret = GetPrinterData(hPrinter,L"PrinterSettings",NULL, (LPBYTE)pBuffer,cbNeeded,&cbNeeded); if(dwret == ERROR_SUCCESS) pdm = (PDEVMODE)pBuffer; else Fail = TRUE; } else Fail = TRUE; if(Fail == TRUE) { free(pBuffer); ClosePrinter(hPrinter); hPrinter = GetPrinterInfo(&pBuffer , pDPH->pszPrinterName); if(pBuffer) pdm = ((PRINTER_INFO_2 *)pBuffer)->pDevMode; } RealDriverName = (WCHAR *)((LPBYTE)(pdm) + sizeof(DEVMODEW)); wcscpy(RealDriverName1 , RealDriverName); ClosePrinter(hPrinter); VDEVMODE *pdm1 = &(DllDevmode); // if(!IsSpooler()) ValidateSetRealDriver(RealDriverName1,pdm1); memset(psp ,0, sizeof(PROPSHEETPAGE)); /* Prepare the PrinterSettings which will be used by the PropetySheet Dialog */ VPrinterSettings *ps = (VPrinterSettings *)malloc(sizeof(VPrinterSettings)); memset(ps, 0 , sizeof(VPrinterSettings)); /* Intialize the PrinterSettings ValidDevMode with the default and then later * with the inDevmode and then ValidateDevMode */ if(pDPH->fMode & DM_IN_BUFFER) ps->inDevmode = (VDEVMODE *)(pDPH->pdmIn); ps->ValidDevMode = (VDEVMODE *)malloc(sizeof(VDEVMODE)); if(Fail == TRUE) { OutputDebugString(L"failure in propertysheet"); memcpy(ps->ValidDevMode , ((PRINTER_INFO_2 *)pBuffer)->pDevMode , sizeof(VDEVMODE)); } else memcpy(ps->ValidDevMode , pBuffer , sizeof(VDEVMODE)); if(ps->inDevmode) ValidateDevMode(ps->ValidDevMode , ps->inDevmode); free(pBuffer); /* Hold the pointer to outDevmode to be used in _SET_RESULT */ if(pDPH->fMode & DM_OUT_BUFFER) ps->outDevmode = (VDEVMODE *)(pDPH->pdmOut); /* Fill the PROPSHEETPAGE */ FillInPropertyPage( psp, IDD_PRINTDIALOG, TEXT(""), DocumentProperty,ps); wcscpy(PrinterName , pDPH->pszPrinterName); /* This so that WM_INITDIALOG gets as lparam the PrinterSettings */ pPSUIInfo->UserData = (ULONG_PTR)ps; DWORD result; /* Fill up the other members */ ps->pfnComPropSheet = pPSUIInfo->pfnComPropSheet; ps->hComPropSheet = pPSUIInfo->hComPropSheet; ps->fMode = pDPH->fMode; ps->hPrinter = pDPH->hPrinter; ps->PaperSize = (((PDEVMODE)(ps->ValidDevMode))->dmFields & DM_PAPERSIZE) ? ((PDEVMODE)(ps->ValidDevMode))->dmPaperSize : DMPAPER_LETTER; ps->DimensionUnits = FALSE; ps->PaperOrient = (((PDEVMODE)(ps->ValidDevMode))->dmFields & DM_ORIENTATION) ? ((PDEVMODE)(ps->ValidDevMode))->dmOrientation : DMORIENT_PORTRAIT; if(pDPH->pszPrinterName) { ps->pszPrinterName = (LPTSTR)malloc(sizeof(WCHAR) * (wcslen(pDPH->pszPrinterName)+ 1)); wcscpy(ps->pszPrinterName , pDPH->pszPrinterName); } if (result = pPSUIInfo->pfnComPropSheet(pPSUIInfo->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGE, (LPARAM)psp, (LPARAM)0)) { ps->handle = (HPROPSHEETPAGE)result; pPSUIInfo->Result = CPSUI_CANCEL; } free(psp); } return 1; case PROPSHEETUI_REASON_SET_RESULT: { PSETRESULT_INFO pSRInfo; pSRInfo = (PSETRESULT_INFO) lParam; if (pSRInfo->Result == CPSUI_OK) { /* User pressed ok, modify ValidDevmode and send it to DrvDocumentProperties */ PDOCUMENTPROPERTYHEADER pDPH = (PDOCUMENTPROPERTYHEADER)lParam; VPrinterSettings *ps = (VPrinterSettings *)(pPSUIInfo->UserData); PDEVMODE pdmValid = (PDEVMODE)(ps->ValidDevMode); pdmValid->dmPaperSize = ps->PaperSize; pdmValid->dmFields |= DM_PAPERSIZE; pdmValid->dmFields |= DM_ORIENTATION; pdmValid->dmOrientation = ps->PaperOrient; DrvDocumentProperties(NULL, ps->hPrinter, ps->pszPrinterName, (DEVMODE *)(ps->outDevmode), (DEVMODE *)(ps->ValidDevMode), (ps->fMode & ~DM_PROMPT)); /* * Set the private part of the outDevmode with the corresponding members from * PrinterSettings */ VDEVMODE *pdmOutput = (VDEVMODE*)(ps->outDevmode); VPDEVMODE *PrivateDevmode = &(pdmOutput->pdm); /* We don't use private PaperSize yet */ PrivateDevmode->PaperSize = ps->PaperSize; wcscpy(PrivateDevmode->PrinterName ,ps->PrinterName ); DrvDocumentProperties(NULL, ps->hPrinter, ps->pszPrinterName, NULL, (DEVMODE *)(ps->outDevmode), DM_IN_BUFFER,TRUE); if(bIsExplorer) { HANDLE hPrinter; PRINTER_DEFAULTS defaults = { NULL, NULL, PRINTER_ALL_ACCESS }; OpenPrinter( ps->pszPrinterName, // printer or server name &hPrinter, // printer or server handle &defaults // printer defaults ); DWORD dwret = SetPrinterData( hPrinter, // handle to printer or print server L"PrinterSettings", // data to set REG_BINARY, // data type (LPBYTE)(ps->outDevmode), // configuration data buffer sizeof(VDEVMODE) ); SetRealDriverName(ps->pszPrinterName , PrivateDevmode->PrinterName); ClosePrinter(hPrinter); } wcscpy(RealPrinterName , ps->PrinterName); } } break; case PROPSHEETUI_REASON_DESTROY: { /* Cleanup */ VPrinterSettings *ps = (VPrinterSettings *)(pPSUIInfo->UserData); free(ps->pszPrinterName); free(ps->ValidDevMode); free((void *)(ps)); pPSUIInfo->UserData = NULL; } return 1; } return 1;}//-----------------------------------------------------------------------------BOOL PMUIDriver::DrvPrinterEvent(LPWSTR pPrinterName, INT DriverEvent, DWORD Flags, LPARAM lParam){ if(DriverEvent == PRINTER_EVENT_INITIALIZE) { WCHAR RealDriverName[256]; memset(RealDriverName , 0 , sizeof(WCHAR) * 256); InstalledPrinter(RealDriverName , pPrinterName); SetRealDriverName(pPrinterName , RealDriverName); } return TRUE;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -