📄 prinstaller.cpp
字号:
/* * * 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 + -