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