📄 uidriverentrypoints.cpp
字号:
/* * * UIDriverEntryPoints.cpp * Copyright (C) 2006 Michael H. Overlin This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Contact at poster_printer@yahoo.com */#define UIDRIVERENTRYPOINTS_C#include "UIDriverEntryPoints.h"#include "..\lib\debug.h"#include "..\lib\extDevMode.h"#include "..\lib\prcommandline.h"#include "..\lib\prspoolerdatafile.h"#include "..\lib\printResizerCommon.h"#include "..\lib\prutils.h"#include "..\lib\utils.h"#include "..\lib\spoolutils.h"#include <windows.h>#include <wingdi.h>#include <winspool.h>#include <shellapi.h>#include <prsht.h>#include <winddi.h>#include <winddiui.h>#include <malloc.h>#include <stdio.h>#include <stdlib.h>#include <tchar.h>#include <strsafe.h>#define PREVIEWAPP_STARTUPTIME_MAX ( (DWORD) 5 * 60 * 1000 )// PUBLIC GLOBALSHMODULE ghinstDLL;// PROTOTYPES FOR MODULE'S PRIVATE UTILITIESstatic BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lParam);// PUBLIC ROUTINESBOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD dwReason, LPVOID lpvReserved ) { if (dwReason == DLL_PROCESS_ATTACH) { ghinstDLL = hinstDLL; } return TRUE;}BOOL DevQueryPrintEx( PDEVQUERYPRINT_INFO pDQPInfo ) { // DEBUG/FIX -- supposed to check that print is possible given settings return TRUE;}// HERE IS APPARENTLY WHERE WE RESPOND TO INITIALIZATIONBOOL DrvPrinterEvent( LPWSTR lpwstrPrinterName, INT iEvent, DWORD dwFlags, LPARAM lParam ) { BOOL bRetValue = TRUE; switch(iEvent) { case PRINTER_EVENT_INITIALIZE: { int k = 0; ++k; } break; default: break; } return bRetValue;}/*DrvDocumentEvent - printmirror uses this to grap the emf fileDrvDriverEvent */// 6/21 ADDED TO SEE IF THIS WILL CAUSE SPOOLER TO REPLACE// DRIVER DLL'S WHEN NEWER (IN TERMS OF TIMESTAMP) ARE INSTALLEDBOOL DrvDriverEvent( DWORD dwDriverEvent, DWORD dwLevel, LPBYTE pDriverInfo, LPARAM lParam ) { BOOL bRetValue = TRUE; switch(dwDriverEvent) { case DRIVER_EVENT_DELETE: bRetValue = TRUE; break; case DRIVER_EVENT_INITIALIZE: bRetValue = TRUE; break; default: break; } return bRetValue;}INT DrvDocumentEvent( HANDLE hPrinter, HDC hdc, int iEsc, ULONG ulcIn, PULONG pulIn, ULONG ulcOut, PULONG pulOut ) { INT retValue = DOCUMENTEVENT_SUCCESS; switch(iEsc) { case DOCUMENTEVENT_RESETDCPOST: case DOCUMENTEVENT_CREATEDCPOST: { int k = 0; ++k; } break; case DOCUMENTEVENT_RESETDCPRE: { int k = 0; ++k; } break; case DOCUMENTEVENT_CREATEDCPRE: { int k = 0; ++k; } break; case DOCUMENTEVENT_STARTPAGE: { int k = 0; ++k; } break; case DOCUMENTEVENT_ENDPAGE: { int k = 0; ++k; } break; case DOCUMENTEVENT_ENDDOC: { int k = 0; ++k; } break; case DOCUMENTEVENT_DELETEDC: { int k = 0; ++k; } break; case DOCUMENTEVENT_STARTDOC: { int k = 0; ++k; } break; case DOCUMENTEVENT_STARTDOCPOST: { retValue = DOCUMENTEVENT_FAILURE; // DEBUG / FIX static BOOL bBreak = STATICBOOLBREAK; ASSERT(!bBreak); ::PrintProcessorParameter ppp; ::ZeroMemory(&ppp, sizeof(ppp)); LPTSTR lptstrFullAppFileName = ::GetPreviewAppFullNameAndFullTempFileName(hPrinter, ppp.atstrFullTempFileName, ARRCOUNT(ppp.atstrFullTempFileName)); if (lptstrFullAppFileName != NULL) { tstring tstrCommandLine; ::MakeCommandLine(lptstrFullAppFileName, ::PrintPreviewDataSources::ePrintSpoolerDataFile, ppp.atstrFullTempFileName, tstrCommandLine); PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); BOOL bCreated = CreateProcess( lptstrFullAppFileName, const_cast<LPTSTR> (tstrCommandLine.c_str()), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); if (bCreated) { WaitForInputIdle(pi.hProcess, PREVIEWAPP_STARTUPTIME_MAX); EnumThreadWindows(pi.dwThreadId, EnumThreadWndProc, (LPARAM) &ppp.hwndPreviewApp); if (ppp.hwndPreviewApp != NULL) { TCHAR atstrParameter[PRINTPROCESSOR_PARAMTER_MAX_CCH+1]; if (::WritePrintProcessorParameter(atstrParameter, ARRCOUNT(atstrParameter), ppp) != 0) { DWORD dwJobID = (DWORD) ((PLONG) pulIn)[0]; DWORD dwcJobInfo = 0; PJOB_INFO_2 pji = GetJobInfo2(hPrinter, dwJobID, &dwcJobInfo); if (pji != NULL) { size_t szParameter = ::StringBufferSize(atstrParameter); DWORD dwcNewJobInfo = dwcJobInfo + szParameter; PJOB_INFO_2 pjiNew = (PJOB_INFO_2) malloc(dwcNewJobInfo); if (pjiNew != NULL) { CopyMemory(pjiNew, pji, dwcJobInfo); CopyMemory( (LPBYTE) pjiNew + dwcJobInfo, atstrParameter, szParameter ); pjiNew->pParameters = (LPTSTR) ( (LPBYTE) pjiNew + dwcJobInfo ); pjiNew->Position = JOB_POSITION_UNSPECIFIED; if (SetJob(hPrinter, dwJobID, 2, (LPBYTE) pjiNew, 0)) { PEXTDEVMODE pextdm = (PEXTDEVMODE) pjiNew->pDevMode; LPTSTR lptstrPrinterName = ::GetPrinterName(hPrinter); if (lptstrPrinterName != NULL) { if (PRSpoolerDataFile::WriteUserInterfaceData(ppp.atstrFullTempFileName, lptstrPrinterName, pextdm) ) { retValue = DOCUMENTEVENT_SUCCESS; } free(lptstrPrinterName); } } free(pjiNew); } // if (pjiNew != NULL) free(pji); } // if (pji != NULL) } } // DEBUG/FIX - SHOUDL WE SetLastError ?? if (retValue != DOCUMENTEVENT_SUCCESS) { if (ppp.hwndPreviewApp != NULL) { ::PostMessage(ppp.hwndPreviewApp, WM_ABORTPRINTING, 0, 0); } else { ::TerminateProcess(pi.hProcess, 0); } } } // if (bCreated) free(lptstrFullAppFileName); } // if (lptstrFullAppFileName != NULL) } break; case DOCUMENTEVENT_ENDDOCPOST: { int k = 0; ++k; } break; default: { int k = 0; ++k; } break; } // switch(iEsc) return retValue;}// DrvDriverEvent#if 0 DrvDocumentEvent DrvPrinterEvent#endif // *********************************************************** // ** PRIVATE ROUTINES ************************************* // *********************************************************** static BOOL CALLBACK EnumThreadWndProc( HWND hwnd, LPARAM lParam ) { HWND *phwnd = (HWND *) lParam; *phwnd = hwnd; return FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -