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

📄 prinstaller.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * * prinstaller.cpp * * */#include "prinstaller.h"#include "installfiles_rc.h"#include "resource.h"#include "..\lib\debug.h"#include "..\lib\dependentfilesparam.h"#include "..\lib\dialogwindow.h"#include "..\lib\extDevMode.h"#include "..\lib\mathutils.h"#include "..\lib\myaddport.h"#include "..\lib\prinstallroutines.h"#include "..\lib\printResizerCommon.h"#include "..\lib\progressdialog.h"#include "..\lib\prreadgpldialog.h"#include "..\lib\prutils.h"#include "..\lib\spoolutils.h"#include "..\lib\utils.h"#include "..\lib\workerthread.h"#include "..\lib\window.h"#include <windows.h>#include <tchar.h>#include <strsafe.h>#include <commctrl.h>#include <process.h>#include <shlobj.h>#include <shellapi.h>// ******//#include "C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\intshcut.h"#define   IURL_SETURL_FL_USE_DEFAULT_PROTOCOL   0x0002typedef struct urlinvokecommandinfoW{   DWORD   dwcbSize;   DWORD   dwFlags;    HWND    hwndParent;   LPCWSTR pcszVerb;  }URLINVOKECOMMANDINFOW;typedef URLINVOKECOMMANDINFOW *PURLINVOKECOMMANDINFOW;DECLARE_INTERFACE_(IUniformResourceLocatorW, IUnknown){   STDMETHOD(QueryInterface)(THIS_                             REFIID riid,                             PVOID *ppvObject) PURE;   STDMETHOD_(ULONG, AddRef)(THIS) PURE;   STDMETHOD_(ULONG, Release)(THIS) PURE;   STDMETHOD(SetURL)(THIS_                     LPCWSTR pcszURL,                     DWORD dwInFlags) PURE;   STDMETHOD(GetURL)(THIS_                     LPWSTR *ppszURL) PURE;   STDMETHOD(InvokeCommand)(THIS_                            PURLINVOKECOMMANDINFOW purlici) PURE;};#define IUniformResourceLocator         IUniformResourceLocatorWtypedef IUniformResourceLocator *PIUniformResourceLocator;// ******#include <stdlib.h>#define WAIT_TIMESLICE_MS					50// *********************************************************************************************// **  MODULE PRIVATE TYPES  ******************************************************************// *********************************************************************************************class InstallWorkerThread : public WorkerThread {public:	InstallWorkerThread(HINSTANCE hinst, ::ProgressDialogWindow *pdw, LPCTSTR lptstrPrinterName);	virtual ~InstallWorkerThread();	BOOL Failed(void) const { return m_bFailed; }protected:	virtual void DoWork(void);private:	HINSTANCE m_hinst;	::ProgressDialogWindow *m_pdw;	tstring m_tstrPrinterName;	BOOL m_bFailed;};class MyTimer {public:	MyTimer(DWORD dwElapseMS, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;	void Wait(void);private:	DWORD m_dwElapseMS;	DWORD m_dwStartMS;	::ProgressDialogWindow *m_pdw;	::InstallStatusString *m_piss;};// *********************************************************************************************// **  MODULE PRIVATE ROUTINE PROTOTYPES  *****************************************************// *********************************************************************************************BOOL DoAllInstall(HINSTANCE hinst, LPCTSTR lptstrPrinterName, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL DoInstallOrFindPort(OUT uint& kIndex, IN const PRDRIVER_FILENAME_ALTERNATES& altPortNames,						 ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL DoInstallPrinter(IN LPCTSTR lptstrPrinterName, IN LPCTSTR lptstrPortName, 					  ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL DoInstallPrintProcessor(::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL DoInstallDriver(HINSTANCE hinst, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL CheckUserCanceled(::ProgressDialogWindow *pdw, ::InstallStatusString* piss) ;BOOL CreateLink(LPCTSTR lptstrLinkName, BOOL bURL, LPCTSTR lptstrLinkTarget) ;BOOL DoInstallLinks(LPCTSTR lptstrPrinterName, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;BOOL DoInstallAdditionalProgramFiles(HINSTANCE hinst, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) ;void DoOpenPrinterFolder(void) ;BOOL MyWriteResourceToFile(HINSTANCE hInst, LPCTSTR lptstrFileName, WORD wIDResource, WORD wIDType,						   const ::SYSTEMTIME* psystimeStamp) ;void __cdecl OnInstallThreadProc(void *pv) ;// *********************************************************************************************// **  class InstallerDialogWindow  ************************************************************// *********************************************************************************************InstallerDialogWindow::InstallerDialogWindow(HINSTANCE hinst) : DialogWindow(hinst, IDD_DIALOG_INSTALL){}InstallerDialogWindow::~InstallerDialogWindow() {	// NOTHING TO DELETE}BOOL InstallerDialogWindow::InitMsg(WPARAM wParam, LPARAM lParam) {	DialogWindow::InitMsg(wParam, lParam);	HICON hIcon = ::LoadIcon(this->hinst(), MAKEINTRESOURCE(IDI_ICON_INSTALL));	this->SendMessage(WM_SETICON, ICON_BIG, (LPARAM) hIcon);	this->SendMessage(WM_SETICON, ICON_SMALL, (LPARAM) hIcon);	this->CenterWindowAboveParent();	tstring tstrTitle;	::ComposeDialogTitle(PrintResizerComponents::eInstaller, tstrTitle, TEXT("Setup"));	this->SetWindowText(tstrTitle.c_str());	this->EnableDlgItem(IDC_RADIO_IAGREE, FALSE);	this->EnableDlgItem(IDC_RADIO_IDONOTAGREE, FALSE);	this->EnableDlgItem(IDC_BUTTON_INSTALL, FALSE);	this->CheckDlgButton(IDC_RADIO_IDONOTAGREE, TRUE);	HWND hwndList = this->GetDlgItem(IDC_LIST_INSTALLEDPRINTERS);	::FillListWithInstalledPrinters(hwndList, FALSE);	this->SetDlgItemText(IDC_EDIT_PRINTERNAME, PRINTRESIZER_DEFAULT_PRINTERNAME);	::SetFocus(this->GetDlgItem(IDC_BUTTON_READ));	return TRUE;}BOOL InstallerDialogWindow::CommandMsg(WPARAM wParam, LPARAM lParam) {	WORD wID = LOWORD(wParam);	switch(wID) {	case IDC_BUTTON_INSTALL: {		BOOL bPrinterNameValid = FALSE;		HWND hwndEdit = this->GetDlgItem(IDC_EDIT_PRINTERNAME);		LPTSTR lptstrPrinterName = ::MyGetWindowText(hwndEdit);		if (lptstrPrinterName != NULL) {			if ( ::lstrlen(lptstrPrinterName) > 0 ) {				if (::IsPrinterInstalled(lptstrPrinterName)) {					BOOL bIsPrintResizer;					if ( ::CheckIsPrintResizer(bIsPrintResizer, lptstrPrinterName)) {						// IF THE PRINTER IS INSTALLED, IT HAS TO BE ONE OF OURS TO USE THIS NAME						// BECAUSE WE WILL DELETE ALL OF OUR PRINTERS BEFORE DOING THE INSTALL						bPrinterNameValid = bIsPrintResizer;						if (! bPrinterNameValid) {							::ErrorMessage(::PrintResizerComponents::eInstaller, this->hdlg(), 								TEXT("Printer name is already in use.  Please enter a new printer name."));							::SetFocus(this->GetDlgItem(IDC_EDIT_PRINTERNAME));						}					} else {						::ErrorExit(::PrintResizerComponents::eInstaller, this->hdlg(), ::GetLastError());					}				} else {					bPrinterNameValid = TRUE;				}			} else {				::ErrorMessage(::PrintResizerComponents::eInstaller, this->hdlg(), 					TEXT("You must enter a name for the printer."));				::SetFocus(this->GetDlgItem(IDC_EDIT_PRINTERNAME));			}			if (bPrinterNameValid) {				uint kDriver;				::PDRIVER_INFO_3 pinfoDrivers = NULL;				if (CheckPrinterDriverInstalled(pinfoDrivers, kDriver, PRINTRESIZER_DRIVERNAME)) {					BOOL bProceed = TRUE;					if (pinfoDrivers != NULL) {								tstring tstrMessage = PRINTRESIZER_PACKAGE_NAME;						tstrMessage += TEXT(" drivers are already installed on your system. Press \"No\" to keep your current drivers.");						tstrMessage += TEXT("\n\nTo upgrade, close all applications using ");						tstrMessage += PRINTRESIZER_PACKAGE_NAME;						tstrMessage += TEXT(" drivers and components, and then press \"Yes\".");						BOOL bYes = ::ConfirmationMessage(PrintResizerComponents::eInstaller, this->hdlg(), tstrMessage.c_str());						if (!bYes) {							bProceed = FALSE;						}						free(pinfoDrivers);					}					if (bProceed) {						tstring tstrProgressDialogTitle;						::ComposeDialogTitle(PrintResizerComponents::eInstaller, tstrProgressDialogTitle, TEXT("Progress"));						::InstallProgressDialog progDW(this->hinst(), tstrProgressDialogTitle, TEXT("Installing ..."));						::InstallWorkerThread iwt(this->hinst(), &progDW, lptstrPrinterName);						if (iwt.StartNewDoWorkThread()) {							progDW.SetInstallThread(& iwt);							progDW.DoModalDialog(this->hdlg());							if (iwt.Failed()) {								tstring tstrMessage = TEXT("The install failed.  You can try restarting your system and then immediately attempt to install.\n\nTo report a bug, visit the web site:\n\n");								tstrMessage += PRINTRESIZER_URL;								::NotificationMessage( ::PrintResizerComponents::eInstaller, this->hdlg(), tstrMessage.c_str());							}						} else {							::ErrorExit(PrintResizerComponents::eInstaller, this->hdlg(),  TEXT("Error initializing install process."));						}					}				} else {					::ErrorExit(PrintResizerComponents::eInstaller, this->hdlg(),  TEXT("Error initializing install process."));				}				this->DestroyWindow();			} 				free(lptstrPrinterName);		} else {			::ErrorExit(::PrintResizerComponents::eInstaller, this->hdlg(), ::GetLastError());		}	} break;	case IDC_BUTTON_CANCEL:		this->DestroyWindow();		break;	case IDC_BUTTON_READ: {		BOOL bDialogShown = FALSE;		///HINSTANCE hInst = this->hinst();		//HRSRC hResInfo = ::FindResource(hInst, MAKEINTRESOURCE(IDF_PRINTRESIZER_DATAFILE), MAKEINTRESOURCE(RC_BINARYTYPE));		//if (hResInfo != NULL) {			//HGLOBAL hgRes = ::LoadResource(hInst, hResInfo);			//if (hgRes != NULL) {			//	void *pvRes = ::LockResource(hgRes);			//	if (pvRes != NULL) {		DWORD dwCb = 0;		PVOID pvRes = NULL;		if (::DecompressResource(this->hinst(), IDF_PRINTRESIZER_DATAFILE, RC_BINARYTYPE, pvRes, dwCb)) {					ReadGPLDialog *prgd = new ReadGPLDialog(this->hinst(), (LPTSTR) pvRes, TRUE);					INT_PTR resultCode = prgd->DoModalDialog(this->hdlg());					bDialogShown = TRUE;					switch(resultCode) {					case ReadGPLDialog::eUserOK:						this->EnableDlgItem(IDC_RADIO_IAGREE, TRUE);						this->EnableDlgItem(IDC_RADIO_IDONOTAGREE, TRUE);						::SetFocus(this->GetDlgItem(IDC_RADIO_IAGREE));						break;					case ReadGPLDialog::eUserCancelInstallation:						this->DestroyWindow();						break;					case -1:						::ErrorExit(PrintResizerComponents::eInstaller, this->hdlg(), 							TEXT("Install failure.  Error raising license dialog."));						break;					default:						ASSERTFAIL();						break;					}			free(pvRes);		}			//		UnlockResource(hgRes);			//	} // if (pvRes != NULL) 			//	::FreeResource(hgRes);			//} // if (hgRes != NULL) 		//} // if (hResInfo != NULL) 		if (!bDialogShown) {			::ErrorExit(::PrintResizerComponents::eInstaller, this->hdlg(), TEXT("Error loading license text."));		}	} break; // case IDC_BUTTON_READ	case IDC_RADIO_IDONOTAGREE:		if (this->IsDlgButtonChecked(IDC_RADIO_IDONOTAGREE)) {			this->EnableDlgItem(IDC_BUTTON_INSTALL, FALSE);		}		break;	case IDC_RADIO_IAGREE:		if (this->IsDlgButtonChecked(IDC_RADIO_IAGREE)) {			this->EnableDlgItem(IDC_BUTTON_INSTALL, TRUE);		}		break;	default:		break;	}	return TRUE;}BOOL InstallerDialogWindow::NotificationMsg(UINT msg, WPARAM wParam, LPARAM lParam) {	switch(msg) {		case WM_CLOSE:			this->PostMessage(WM_COMMAND, (WPARAM) IDC_BUTTON_CANCEL, 0);			break;		case WM_NCDESTROY:			::PostQuitMessage(0);			break;		default:			break;	}	return FALSE;}// *************************************************************************************************// **  MODULDE PRIVATE class InstallWorkerThread  **************************************************// *************************************************************************************************InstallWorkerThread::InstallWorkerThread(HINSTANCE hinst, ::ProgressDialogWindow *pdw, LPCTSTR lptstrPrinterName) {	m_hinst = hinst;	m_pdw = pdw;	m_tstrPrinterName = lptstrPrinterName;	m_bFailed = FALSE;}InstallWorkerThread::~InstallWorkerThread() {	this->PeekMessagesUntilTerminate();}void InstallWorkerThread::DoWork(void) {	::InstallStatusString iss;	::CoInitialize(0);	::SetWorkInProgress(TEXT("Uninstalling any previous versions"), m_pdw, &iss);	::DoAllUnInstall(m_pdw, &iss);	::DoAllInstall(m_hinst, m_tstrPrinterName.c_str(), m_pdw, &iss);	if (::CheckUserCanceled(m_pdw, &iss) || iss.GetTerminalError()) {		//tstring tstr;		//if (m_CheckUserCanceled(pdw, piss)) {		//	tstr = TEXT("USER CANCELED.  ");		//} else if (iss.GetTerminalError()) {

⌨️ 快捷键说明

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