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

📄 prinstallroutines.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * * prinstallroutines.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 */#include "prinstallroutines.h"#include "debug.h"#include "myfilemap.h"#include "printResizerCommon.h"#include "prutils.h"#include "spoolutils.h"#include "utils.h"#include "workerthread.h"#include <windows.h>//#include "C:\Program Files\Microsoft Platform SDK\Include\lzexpand.h"extern "C" {INTAPIENTRYLZOpenFileW(	LPWSTR,	LPOFSTRUCT,	WORD	);#define LZOpenFile  LZOpenFileWLONGAPIENTRYLZSeek(	INT,	LONG,	INT	);INTAPIENTRYLZRead(	INT,	LPSTR,	INT	);VOIDAPIENTRYLZClose(	INT	);}#include <tchar.h>#include <strsafe.h>#include <shlobj.h>#include <shellapi.h>// ***********************************************************************************************// **  MODULE PRIVATE PROTOTYPES  ****************************************************************// ***********************************************************************************************LPTSTR GetInstallFolderPath(const int clsidFolderParent, LPCTSTR lptstrFolderName) ;// A NULL TERMINATED LIST WITH DIRECTORY NAME FIRSTBOOL DoUninstallFileList(LPTSTR *plist) ;BOOL DoUninstallAlternateFileList(LPCTSTR lptstr) ;// *************************************************************************************************// **  class InstallProgressDialog  ****************************************************************// *************************************************************************************************InstallProgressDialog::InstallProgressDialog(HINSTANCE hinst, const tstring& tstrTitle, const tstring& tstrJob, IN BOOL bHideCancel): ProgressDialogWindow(hinst, tstrTitle, tstrJob, bHideCancel) {	m_pwt = NULL;}InstallProgressDialog::~InstallProgressDialog() {	// NOTHING TO DO}void InstallProgressDialog::SetInstallThread(WorkerThread* pwt) {	m_pwt = pwt;}// protected:  class InstallProgressDialog  BOOL InstallProgressDialog::EndDialog(INT_PTR nResult) {	if (m_pwt != NULL) {		m_pwt->PeekMessagesUntilTerminate(::WorkerThread::eDefaultTimeSliceMS, INFINITE);	}	return ProgressDialogWindow::EndDialog(nResult);}// *************************************************************************************************// **  class InstallStatusString   *****************************************************************// *************************************************************************************************InstallStatusString::InstallStatusString(void) {	m_bTerminalError = FALSE;	m_bUserCanceled = FALSE;	m_bAllDone = FALSE;}InstallStatusString::~InstallStatusString() {	// NOTHING TO DELETE}void InstallStatusString::SetWorkInProgress(IN LPCTSTR lptstrWorkInProgress) {	m_tstrWorkInProgress = lptstrWorkInProgress;}void InstallStatusString::SetAllDone(void) {	m_bAllDone = TRUE;}void InstallStatusString::SetErrorItem(IN LPCTSTR lptstrErrorItem, IN BOOL bTerminal) {	m_bTerminalError = m_bTerminalError || bTerminal;	if (m_tstrErrorItems.length() == 0) {		m_tstrErrorItems = lptstrErrorItem;	} else {		m_tstrErrorItems += TEXT(";  ");		m_tstrErrorItems += lptstrErrorItem;	}}void InstallStatusString::SetUserCanceled(void) {	m_bUserCanceled = TRUE;}const tstring& InstallStatusString::GetStatusString(void) {	if (m_bUserCanceled) {		m_tstrStatusString = TEXT("USER CANCELED.  Aborting.\n");		m_tstrStatusString += m_tstrWorkInProgress;	} else {		m_tstrStatusString = m_tstrWorkInProgress;		if (m_tstrErrorItems.length() != 0) {			m_tstrStatusString += TEXT("\nThere have been errors:\n");			m_tstrStatusString += m_tstrErrorItems;			if ( m_bTerminalError ) {				m_tstrStatusString += TEXT("\n\nAborting.");			} else {				m_tstrStatusString += TEXT("\n\nAttempting to continue."); 			}		}	} 	return m_tstrStatusString;	//if (m_bUserCanceled) {	//	m_tstrStatusString = TEXT("USER CANCELED.  Aborting.");	//} else {	//	m_tstrStatusString = m_tstrWorkInProgress;	//	if (m_tstrErrorItems.length() != 0) {	//		m_tstrStatusString += TEXT("\n\n");	//		if ( m_bTerminalError ) {	//			m_tstrStatusString += TEXT("Aborting.");	//		} else {	//			m_tstrStatusString += TEXT("Attempting to continuing."); 	//		}	//		m_tstrStatusString += TEXT("  There have been errors:\n");	//		m_tstrStatusString += m_tstrErrorItems;	//	} else if (m_bAllDone) {	//		// DEBUG - FIX -- THE PROGRESS DIALOG APPENDS "DONE" CURRENTLY	//		// DEBUG - FIX -- MAKE THE STATUS WINDOW BIGGER	//		m_tstrStatusString = TEXT(".");	//	}	//}	//return m_tstrStatusString;}// ***********************************************************************************************// **  MODULE PUBLIC ROUTINES  *******************************************************************// ***********************************************************************************************BOOL DoAllUnInstall(ProgressDialogWindow *pdw, InstallStatusString *piss) {	BOOL bError = FALSE;	// NOTE WE SHOULD LOOP THRU THE VARIOUS OS TYPES, NOT JUST THE LOCAL MACHINE	// IN CASE THE DRIVERS WERE INSTALLED FOR ADDITIONAL OS'S	// FOR THOSE OTHER OS'S WE SHOULDN'T NEED TO CHECK FOR PRINTERS THAT USE THEM ... UNLESS THERE ARE	// SERVER COMPLICATIONS	DWORD dwcPrinterDrivers;	::PDRIVER_INFO_3 pinfoDrivers = ::GetInstalledPrinterDrivers(dwcPrinterDrivers);	if (pinfoDrivers != NULL) {		for(uint kDriver = 0; kDriver < dwcPrinterDrivers; ++kDriver) {		   // IS THIS DRIVER OURS?		   if ( ::lstrcmp( pinfoDrivers[kDriver].pName, PRINTRESIZER_DRIVERNAME) == 0 ) {				DWORD dwcPrinter;				::PPRINTER_INFO_2 pinfoPrinters = ::GetInstalledPrintersInfo2(&dwcPrinter);				if (pinfoPrinters != NULL) {					// FIND ALL PRINTERS THAT USE THIS DRIVER					for(uint kPrinter = 0; kPrinter < dwcPrinter; ++kPrinter) {						if ( ::lstrcmp(pinfoPrinters[kPrinter].pDriverName, pinfoDrivers[kDriver].pName) == 0) {							// DELETE THIS PRINTER							HANDLE hPrinter = NULL;							// IF WE'RE INSIDE DRIVER CODE, MAYBE WE SHOULD USE REVERTTOSELF							::PRINTER_DEFAULTS pd = { NULL, NULL, PRINTER_ALL_ACCESS };							::OpenPrinter(pinfoPrinters[kPrinter].pPrinterName, &hPrinter, &pd);							if (hPrinter != NULL) {								// DELETE FIRST ANY JOBS IT HAS PENDING								if (pinfoPrinters[kPrinter].cJobs > 0) {									DWORD dwcJobs;									::PJOB_INFO_1 pinfoJobs = ::GetPrintersJobs(hPrinter, pinfoPrinters[kPrinter].cJobs, dwcJobs);									if (pinfoJobs != NULL) {										for(uint kJob = 0; kJob < dwcJobs; ++kJob) {											DWORD dwDeleteCommand = ::GetPrinterJobDeletionCommand();											if (! ::SetJob(hPrinter, pinfoJobs[kJob].JobId, 1, (LPBYTE) & pinfoJobs[kJob], dwDeleteCommand) ) {												bError = TRUE;											}										} // for(uint kJob = 0; kJob < dwcJobs; ++kJob) 										free(pinfoJobs);									} else { // if (pinfoJobs != NULL) 										bError = TRUE;									}								} // if (pinfoPrinters[k].cJobs > 0) 								// NOW WE SHOULD BE ABLE TO DELETE THE PRINTER								if (! ::DeletePrinter(hPrinter)) {									bError = TRUE;								}								::ClosePrinter(hPrinter);							} else { // if (hPrinter != NULL)								bError = TRUE;							}						} // if ( ::lstrcmp(pinfoPrinters[kPrinter].pDriverName, pinfoDrivers[kDriver].pName) )					} // for(uint kPrinter = 0; kPrinter < dwcPrinter; ++kPrinter)					free(pinfoPrinters);				} else { // if (pinfoPrinters != NULL)					bError = TRUE;				}			} // if ( ::lstrcmp( pinfoDrivers[kDriver].pName, PRINTRESIZER_DRIVERNAME) == 0 ) 		} // for(uint kDriver = 0; kDriver < dwcPrinterDrivers; ++k) 		// ALL PRINTERS THAT USE THIS DRIVER SHOULD NOW BE DELETED		for(uint kDriver = 0; kDriver < dwcPrinterDrivers; ++kDriver) {			// IS THIS DRIVER OURS?			if ( ::lstrcmp( pinfoDrivers[kDriver].pName, PRINTRESIZER_DRIVERNAME) == 0 ) {				if (! ::DeletePrinterDriver(NULL, NULL, pinfoDrivers[kDriver].pName)) {					bError = TRUE;				}				if (!::MyDeleteFile(pinfoDrivers[kDriver].pConfigFile )) {					bError = TRUE;				}				if (!::MyDeleteFile(pinfoDrivers[kDriver].pDataFile )) {					bError = TRUE;				}				if (!::MyDeleteFile(pinfoDrivers[kDriver].pDriverPath)) {					bError = TRUE;				}				if (!::MyDeleteFile(pinfoDrivers[kDriver].pHelpFile)) {					bError = TRUE;				}				// DELETE ALL THE DRIVERS DEPENDENT FILES				// ACCORDING TO DOCS THIS SHOULD INCLUDE THE ABOVE, BUT EXAMINATION OF				// ACTUAL DATA SETS SHOWS THEY ARE DISTINCT				LPTSTR lptstrDependentFile = pinfoDrivers[kDriver].pDependentFiles;				if (lptstrDependentFile != NULL) {					DWORD dwcLen = 0;					while ( (dwcLen = ::lstrlen(lptstrDependentFile)) != 0 ) {						if (!::MyDeleteFile(lptstrDependentFile)) {							bError = TRUE;						}						lptstrDependentFile += dwcLen + 1;					}				}			} // if ( ::lstrcmp( pinfoDrivers[kDriver].pName, PRINTRESIZER_DRIVERNAME) == 0 ) 		} // for(uint kDriver = 0; kDriver < dwcPrinterDrivers; ++k) 		free(pinfoDrivers);	} else { // if (pinfoDrivers != NULL) 		bError = TRUE;	}	// NOW DELETE OUR PRINTPROCESSORS	::DeletePrintProcessor(NULL, NULL, PRINTRESIZER_PRINTPROCESSOR_NAME);	LPTSTR lptstrPrintProcessorDirectory = MyGetPrintProcessorDirectory();	if (lptstrPrintProcessorDirectory != NULL) {		LPTSTR lptstr = ::MakeFullFileName(lptstrPrintProcessorDirectory, PRINTRESIZER_PRINTPROCESSOR_FILENAME);		if (lptstr != NULL) {			if (! ::DeleteFile(lptstr)) {				bError = TRUE;			}			free(lptstr);		} else {			// OUT OF MEMORY ERROR			bError = TRUE;		}		free(lptstrPrintProcessorDirectory);	} else { 		// ERROR GETTING PRINTPROCESSOR DIRECTORY		bError = TRUE;	}	::DoLinksFolderCommand(TEXT("close"));	LPTSTR *plptstrLinks = ::GetLinkFileNames();	if (plptstrLinks != NULL) {		if (! ::DoUninstallFileList(plptstrLinks)) {			// THERE WAS AN ERROR DELETING THE LINKS AND FOLDER			bError = TRUE;		}		::MyFreeStringPtrs(plptstrLinks);	} else {		// ERROR GETTING NAMES OF LINKS DIRECTORY AND LINK NAMES		bError = TRUE;	}	LPTSTR *plptstrAddProgs = ::GetAdditionalProgFileNames();	if (plptstrAddProgs != NULL) {		if (! ::DoUninstallFileList(plptstrAddProgs)) {			// THERE WAS AN ERROR DELETING THE ADITIOANL PROGRAMS AND FOLDER			bError = TRUE;		}		::MyFreeStringPtrs(plptstrAddProgs);	} else {		// ERROR GETTING NAMES OF ADDITIONAL PROGRAMS DIRECTORY AND FILE NAMES		bError = TRUE;	}	return !bError;} // BOOL DoAllUnInstall(void) #if 0LPTSTR MyGetPrinterDriverDirectory(void) {	LPTSTR lptstrRetValue = NULL;	DWORD dwCbNeeded;	::GetPrinterDriverDirectory(NULL, NULL, 1, 0, 0, &dwCbNeeded);	if (::GetLastError() == ERROR_INSUFFICIENT_BUFFER) {		lptstrRetValue = (LPTSTR) malloc(dwCbNeeded);		if (lptstrRetValue != NULL) {			if ( ! ::GetPrinterDriverDirectory(NULL, NULL, 1, (LPBYTE) lptstrRetValue, dwCbNeeded, &dwCbNeeded)) {				free(lptstrRetValue);				lptstrRetValue = NULL;			}		}	} 	return lptstrRetValue;}#endif//BOOL GetReosourceSize(IN HINSTANCE hinst, IN WORD wID, IN WORD wIDType, OUT DWORD& dwCb) {//	BOOL bRetValue = FALSE;//	HRSRC hResInfo = ::FindResource(hInst, MAKEINTRESOURCE(wIDResource), MAKEINTRESOURCE(wIDType));//	if (hResInfo != NULL) {//		dwCb = ::SizeofResource(hInst, hResInfo);//		bRetValue = TRUE;//	}//	return bRetValue;//}BOOL WriteResourceToFile(HINSTANCE hInst, LPCTSTR lptstrFileName, WORD wIDResource, WORD wIDType/*, const ::SYSTEMTIME* psystimeStamp*/) {	BOOL bRetValue = FALSE;	HRSRC hResInfo = ::FindResource(hInst, MAKEINTRESOURCE(wIDResource), MAKEINTRESOURCE(wIDType));	if (hResInfo != NULL) {		HGLOBAL hgRes = ::LoadResource(hInst, hResInfo);		if (hgRes != NULL) {			void *pvRes = ::LockResource(hgRes);			if (pvRes != NULL) {				DWORD dwcRes = ::SizeofResource(hInst, hResInfo);				try {					::MyFileReadWriteMap mfm;					if (mfm.Create(lptstrFileName, dwcRes)) {						::CopyMemory( mfm.GetBasePtr(), pvRes, dwcRes );						bRetValue = TRUE;					}				} catch( ... ) {					bRetValue = FALSE;				}				//HANDLE hFile = ::CreateFile(lptstrFileName, 				//	GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);				//if (hFile != INVALID_HANDLE_VALUE) {				//	try {				//		DWORD dwcWritten;				//		if ( ::WriteFile(hFile, pvRes, dwcRes, &dwcWritten, 0)) {				//			if (dwcWritten == dwcRes) {				//				bRetValue = TRUE;				//			} 				//		}				//		//if (bRetValue) {				//		//	if (psystimeStamp != NULL) {				//		//		::FILETIME ft;				//		//		if (::SystemTimeToFileTime(psystimeStamp, &ft)) {				//		//			if (! ::SetFileTime(hFile, &ft, NULL, &ft)) {				//		//				bRetValue = FALSE;				//		//			}				//		//		} else {				//		//			bRetValue = FALSE;				//		//		}				//		//	}				//		//}				//		CloseHandle(hFile);				//	} catch( ...) {				//		CloseHandle(hFile);				//	}				//}				UnlockResource(hgRes);			}			::FreeResource(hgRes);		}	}	if (!bRetValue) {		try { ::DeleteFile(lptstrFileName); } catch (...) {}	}	return bRetValue;}BOOL StampFileTime(LPCTSTR lptstrFileName, const ::SYSTEMTIME& st) {	BOOL bRetValue = FALSE;	//HANDLE hFile = CreateFile(	//	lptstrFileName,	//	FILE_APPEND_DATA,   	//	FILE_SHARE_READ,    	//	NULL,               	//	OPEN_EXISTING,        	//	FILE_ATTRIBUTE_NORMAL, 	//	NULL	//	);             	HANDLE hFile = ::CreateFile(		lptstrFileName, 		GENERIC_WRITE, 		0, 		0, 		OPEN_EXISTING, 		FILE_ATTRIBUTE_NORMAL, 		0		);	if (hFile != INVALID_HANDLE_VALUE) {		try {			::FILETIME ft;			if (::SystemTimeToFileTime(&st, &ft)) {				if (::SetFileTime(hFile, &ft, NULL, &ft)) {					bRetValue = TRUE;				}			} 			::CloseHandle(hFile);		} catch( ... ) {			::CloseHandle(hFile);		}	}	return bRetValue;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -