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

📄 prinstaller.cpp

📁 虚拟打印机
💻 CPP
📖 第 1 页 / 共 3 页
字号:
					} else {						// ERROR WRITING EMBEDDED RESOURCE FILES TO THE SPOOLER DRIVER DIRECTORY						bError = TRUE;						::SetErrorItem(TEXT("Error extracting driver files and\nwriting them to spooler directory."), pdw, piss);					}				} else {					// OUT OF MEMORY ERROR					bError = TRUE;					::SetErrorCode(TEXT("Error installing driver:  "), pdw, piss);				}				for(uint kBuff = 0; kBuff < ARRCOUNT(alptstrBuff); ++kBuff) {					if (alptstrBuff[kBuff] != NULL) {						if (kBuff != ARRCOUNT(alptstrBuff)-1) {							::DeleteFile(alptstrBuff[kBuff]);						}						free(alptstrBuff[kBuff]);					}				} 				free(lptstrPrinterDriverDirectory);			} else {				// ERROR GETTING PRINTER DRIVER DIRECTORY BUFFER				bError = TRUE;				::SetErrorCode(TEXT("Error installing driver:  "), pdw, piss);			}		} else { // if (pinfoDriversTemp == NULL)			// OUR PRINTER DRIVER IS CURRENTLY INSTALLED			// WE MUST UNINSTALL BEFORE WE CAN REINSTALL			bError = TRUE;			if (pinfoDriversTemp != NULL) {				free(pinfoDriversTemp); 			}			::SetErrorItem(TEXT("Error installing driver: old driver not uninstalled."), pdw, piss);		}	} else {		// UNABLE TO DETERMINE IF OUR DRIVER IS ALREADY INSTALLED		bError = TRUE;		::SetErrorCode(TEXT("Error installing driver:  "), pdw, piss);	}	mt.Wait();	return !bError;}BOOL DoInstallOrFindPort(OUT uint& kIndex, IN const PRDRIVER_FILENAME_ALTERNATES& altPortNames,						 ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) {	BOOL bError = FALSE;	DWORD dwcPrinters;	MyTimer mt(INSTALLUINT_MINTIME_MS, pdw, piss);	::SetWorkInProgress(TEXT("Installing or finding a printer port"), pdw, piss);	::PPRINTER_INFO_2 pinfoPrinters = ::GetInstalledPrintersInfo2(&dwcPrinters);	if (pinfoPrinters != NULL && ! ::CheckUserCanceled(pdw, piss)) {		BOOL bPortInUse = TRUE;		uint kAltPortName;		for(kAltPortName = 0; kAltPortName < ARRCOUNT(altPortNames); ++kAltPortName) {			bPortInUse = FALSE;			for(uint kPrinter = 0; kPrinter < dwcPrinters; ++kPrinter) {				if (::lstrcmpi(pinfoPrinters[kPrinter].pPortName, altPortNames[kAltPortName]) == 0) {					bPortInUse = TRUE;					break;				}			}			if (!bPortInUse) {				break;			}		}		if (! bPortInUse) {			BOOL bDoubleCheck = FALSE;			BOOL bPortInstalled;			if (! ::CheckUserCanceled(pdw, piss) && ::CheckPortInstalled(bPortInstalled, altPortNames[kAltPortName])) {				if (!bPortInstalled) {					if (! ::CheckUserCanceled(pdw, piss) ) {						::MyAddPort(altPortNames[kAltPortName]);					}					bDoubleCheck = TRUE;				}				if (bDoubleCheck) {					if (! ::CheckUserCanceled(pdw, piss) && ::CheckPortInstalled(bPortInstalled, altPortNames[kAltPortName])) {						if (!bPortInstalled || ::CheckUserCanceled(pdw, piss)) {							// COULDN'T INSTALL THE PORT							bError = TRUE;							::SetErrorItem(TEXT("Printer port install failed."), pdw, piss);						} else {							kIndex = kAltPortName;						}					} else {						// CHECK PORT INSTALLED ERROR						bError = TRUE;						::SetErrorCode(TEXT("Error installing printer port:  "), pdw, piss);					}				} else {					kIndex = kAltPortName;				}			} else {				// CHECK PORT INSTALLED ERROR				bError = TRUE;				::SetErrorCode(TEXT("Error installing printer port:  "), pdw, piss);			}		} else {			// ALL PORT NAMES ARE IN USE			bError = TRUE;			tstring tstr = TEXT("All printer ports with the name\n");			tstr += TEXT("\"virtual printer port\" followed by a digit\n");			tstr += TEXT("are in use.");			::SetErrorItem(tstr.c_str(), pdw, piss);		}		free(pinfoPrinters);	} else {		// OUT OF MEMORY		bError = TRUE;		::SetErrorCode(TEXT("Error installing printer port:  "), pdw, piss);	}	mt.Wait();	return !bError;}BOOL CheckUserCanceled(::ProgressDialogWindow *pdw, ::InstallStatusString* piss) {	BOOL b = (pdw != NULL)&& pdw->GetStatusUserCanceled();	if (b && piss != NULL) {		piss->SetUserCanceled();	}	return b;}BOOL DoInstallAdditionalProgramFiles(HINSTANCE hinst, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) {	BOOL bError = FALSE;	LPTSTR *plptstr = ::GetAdditionalProgFileNames();	MyTimer mt(INSTALLUINT_MINTIME_MS, pdw, piss);	::SetWorkInProgress(TEXT("Installing additional program files"), pdw, piss);	if (! CheckUserCanceled(pdw, piss) && plptstr != NULL) {		BOOL bTemp = ::CreateDirectory(plptstr[::AdditionalProgNames::eFolder], NULL);		if (bTemp || ::GetLastError() == ERROR_ALREADY_EXISTS) {			if (bTemp) { 				::SHChangeNotify(SHCNE_MKDIR, SHCNF_PATH | SHCNF_FLUSH, plptstr[::AdditionalProgNames::eFolder], 0);			}			static const ::SYSTEMTIME systimeStamp = PRINTRESIZER_INSTALLED_TIMESTAMP;			if (CheckUserCanceled(pdw, piss) || ! ::MyWriteResourceToFile(hinst, plptstr[::AdditionalProgNames::eUnInstallerStub], 				IDF_PRINTRESIZER_UNINSTALLER_STUB, RC_BINARYTYPE, &systimeStamp)) {				// FAILED TO WRITE THE UNINSTALLER STUB APP				bError = TRUE;				::SetErrorItem(TEXT("Failed to install uninstaller."), pdw, piss, FALSE);			}		} else {			// FAILED TO CREATE DIRECTORY AND IT DIDNT ALREADY EXIST			bError = TRUE;			::SetErrorItem(TEXT("Failed to create additional programs directory."), pdw, piss, FALSE);		}	} else {		// FAILED TO GET ADDITIONAL PROG FILE NAMES		bError = TRUE;		::SetErrorItem(TEXT("Additional program install initialization failed."), pdw, piss, FALSE);	}	if (plptstr != NULL) {		::MyFreeStringPtrs(plptstr);	}	mt.Wait();	return ! bError;}BOOL DoInstallLinks(LPCTSTR lptstrPrinterName, ::ProgressDialogWindow *pdw, ::InstallStatusString *piss) {	LPTSTR lptstrPreviewApp = NULL;	BOOL bError = FALSE;	BOOL bTemp;	MyTimer mt(INSTALLUINT_MINTIME_MS, pdw, piss);	::SetWorkInProgress(TEXT("Installing links"), pdw, piss);	{		HANDLE hPrinter;		::OpenPrinter(const_cast<LPTSTR>(lptstrPrinterName), &hPrinter, NULL);		if (hPrinter != NULL) {			lptstrPreviewApp = ::GetPreviewAppFullFileName(hPrinter);			::ClosePrinter(hPrinter);		} else {			// COULDN'T OPEN PRINTER, INSTALL MUST HAVE FAILED			// THIS IS A TERMINAL ERROR			bError = TRUE;			::SetErrorItem(TEXT("Printer install unexpectedly failed."), pdw, piss, TRUE);		}	}	if (! CheckUserCanceled(pdw, piss) && lptstrPreviewApp != NULL) {		LPTSTR *plptstrLinks = ::GetLinkFileNames();		LPTSTR *plptstrAddProgs = ::GetAdditionalProgFileNames();		if (plptstrLinks != NULL && plptstrAddProgs != NULL) {			bTemp = ::CreateDirectory(plptstrLinks[::LinkFileNames::eFolder], NULL);			if (bTemp || ::GetLastError() == ERROR_ALREADY_EXISTS) {				if (bTemp) { 					::SHChangeNotify(SHCNE_MKDIR, SHCNF_PATH | SHCNF_FLUSH, plptstrLinks[::LinkFileNames::eFolder], 0);				}				bTemp = ::CreateLink(plptstrLinks[::LinkFileNames::ePreviewApp], FALSE, lptstrPreviewApp);				if (!bTemp) {					// FAILED TO CREATE LINK TO THE PREVIEW APP					bError = TRUE;					::SetErrorItem(TEXT("Couldn't create preview app link."), pdw, piss, FALSE);						}				bTemp = ::CreateLink(plptstrLinks[::LinkFileNames::eURLLink], TRUE, PRINTRESIZER_URL);				if (!bTemp) {					// FAILED TO CREATE LINK TO THE URL					bError = TRUE;					::SetErrorItem(TEXT("Couldn't create URL link."), pdw, piss, FALSE);						}				bTemp = ::CreateLink(plptstrLinks[::LinkFileNames::eUnInstallerStubLink], FALSE, 						plptstrAddProgs[::AdditionalProgNames::eUnInstallerStub]);				if (! bTemp) {					// FAILED TO CREATE A LINK TO THE UNINSTALLER STUB					bError = TRUE;					::SetErrorItem(TEXT("Couldn't create uninstaller link."), pdw, piss, FALSE);						}			} else {				// THE LINK FOLDEER DOESN'T EXIST AND WE COULDN'T CREATE IT				bError = TRUE;				::SetErrorItem(TEXT("Couldn't create link folder."), pdw, piss, FALSE);					}		} else {			// ATTEMPT TO GET PATHS FOR LINKS AND ADD. PROGS FAILED			bError = TRUE;			::SetErrorItem(TEXT("Link install initialization failed."), pdw, piss, FALSE);				}		if (plptstrLinks != NULL) 			::MyFreeStringPtrs(plptstrLinks);		if (plptstrAddProgs != NULL)			::MyFreeStringPtrs(plptstrAddProgs);	} else {		// COULDN'T GET NAME OF THE PREVIEW APP		bError = TRUE;		::SetErrorItem(TEXT("Link install initialization failed."), pdw, piss, FALSE);			}	if (lptstrPreviewApp != NULL) {		free(lptstrPreviewApp);	}	mt.Wait();	return !bError;}void DoOpenPrinterFolder(void) {	HRESULT hr;	::LPMALLOC lpMalloc = NULL;	hr = ::SHGetMalloc(&lpMalloc);	if (SUCCEEDED(hr)) {		::LPITEMIDLIST lpidl = NULL;		hr = ::SHGetSpecialFolderLocation(NULL, CSIDL_PRINTERS, &lpidl);		if (SUCCEEDED(hr)) {			::SHELLEXECUTEINFO sei;			::ZeroMemory(&sei, sizeof(sei));			sei.cbSize = sizeof(sei);			sei.fMask = SEE_MASK_IDLIST;			sei.lpVerb = TEXT("open");			sei.nShow = SW_SHOW;			sei.lpIDList = lpidl;			::ShellExecuteEx(&sei);			lpMalloc->Free(lpidl);		}		lpMalloc->Release();	}}BOOL CreateLink(LPCTSTR lptstrLinkName,  BOOL bURL, LPCTSTR lptstrLinkTarget) {	BOOL bRetValue = FALSE;	HRESULT hrTemp;	::IUnknown *punk = NULL;	if (bURL) {		::PIUniformResourceLocator purl = NULL;		hrTemp = ::CoCreateInstance(::CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, ::IID_IUniformResourceLocator, (void **) (&purl));		if (SUCCEEDED(hrTemp)) {			purl->SetURL(lptstrLinkTarget, IURL_SETURL_FL_USE_DEFAULT_PROTOCOL);			punk = (IUnknown*) purl;		}	} else {		IShellLink* psl = NULL;		hrTemp = ::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **) (&psl));		if (SUCCEEDED(hrTemp)) {			psl->SetPath(lptstrLinkTarget);			punk = (IUnknown*) psl;		}	} 	if (punk != NULL) {		::IPersistFile *ppf = NULL;		hrTemp = punk->QueryInterface(IID_IPersistFile,	(void **) (&ppf));		if (SUCCEEDED(hrTemp)) {			hrTemp = ppf->Save(lptstrLinkName, TRUE);			if (SUCCEEDED(hrTemp)) {				bRetValue = TRUE;			}			ppf->Release();		}		punk->Release();	}	return bRetValue;}#if 0static BOOL MyWriteResourceToFile(HINSTANCE hInst, LPCTSTR lptstrFileName, WORD wIDResource, WORD wIDType,						   const ::SYSTEMTIME* psystimeStamp) {	BOOL bRetValue = FALSE;	if ( ::WriteResourceToFile(hInst, lptstrFileName, wIDResource, wIDType) ) {		if (psystimeStamp != NULL) {			if (::StampFileTime(lptstrFileName, *psystimeStamp)) {				bRetValue = TRUE;			} else {				::DeleteFile(lptstrFileName);			}		} else {			bRetValue = TRUE;		}	}	return bRetValue;}#elsestatic BOOL MyWriteResourceToFile(HINSTANCE hInst, LPCTSTR lptstrFileName, WORD wIDResource, WORD wIDType,						   const ::SYSTEMTIME* psystimeStamp) {	BOOL bRetValue = FALSE;	if ( ::WriteCompressedResourceToFile(hInst, lptstrFileName, wIDResource, wIDType) ) {		if (psystimeStamp != NULL) {			if (::StampFileTime(lptstrFileName, *psystimeStamp)) {				bRetValue = TRUE;			} else {				::DeleteFile(lptstrFileName);			}		} else {			bRetValue = TRUE;		}	}	return bRetValue;}#endif

⌨️ 快捷键说明

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