⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prntmrui.cpp

📁 PrintMirror 1.5 可用版 VC6 + DDK
💻 CPP
📖 第 1 页 / 共 3 页
字号:
     {          // 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 + -