예제 #1
0
        /// <summary>
        ///      Perform the uninstallation
        /// </summary>
        /// <param name="dlg">The dialog that will display the output</param>
        /// <param name="deploymentDir">Where to deploy the package</param>
        private void Uninstall(ProcessDialog dlg, string deploymentDir)
        {
            // Different folder structure if in the LEADTOOLS root
            bool inLEADOverride = Properties.Settings.Default.InLEADOverride;
            bool inLEAD         = Utils.GetFolders(deploymentDir, out string printerDriverFolder, out string virtualPrinterFolder, inLEADOverride);

            if (inLEAD && !inLEADOverride)
            {
                dlg.Log("Deployment path appears to be in LEADTOOLS installation");
            }

            try
            {
                // Uninstall the printer drivers (only for Vista or later)
                if (Utils.IsVistaOrLater())
                {
                    dlg.Log("Uninstalling printer driver(s)");
                    try
                    {
                        if (File.Exists(Path.Combine(virtualPrinterFolder, @"DriverPackageX64\LeadtoolsVirtualPrinter.INF")))
                        {
                            dlg.Log("Uninstalling 64-bit printer driver...");
                            Utils.UninstallPrinterDriver("Windows x64");
                            dlg.Log("Successfully uninstalled 64-bit printer driver");
                        }
                        if (File.Exists(Path.Combine(virtualPrinterFolder, @"DriverPackageX86\LeadtoolsVirtualPrinter.INF")))
                        {
                            dlg.Log("Uninstalling 32-bit printer driver...");
                            Utils.UninstallPrinterDriver("Windows NT x86");
                            dlg.Log("Successfully uninstalled  32-bit printer driver");
                        }
                    }
                    catch (Win32Exception ex)
                    {
                        if (inLEAD && ex.NativeErrorCode == Utils.ERROR_PRINTER_DRIVER_IN_USE)
                        {
                            throw new Exception("Failed to uninstall driver package, it is currently in use. Please ensure there are no LEADTOOLS printers currently running.");
                        }
                        else
                        {
                            throw ex;
                        }
                    }
                }

                // Stop the spooler service
                dlg.Log("Stopping spooler service...");
                ServiceController spoolerService = new ServiceController("Spooler");
                spoolerService.Stop();
                spoolerService.WaitForStatus(ServiceControllerStatus.Stopped);
                dlg.Log("Spooler service stopped");

                try
                {
                    // Delete 64-bit files from System32
                    string system32X64 = Path.GetFullPath(Environment.GetFolderPath(Environment.SpecialFolder.System));
                    foreach (Tuple <string, bool> pair in filesForSystem32X64)
                    {
                        // Delete from System32
                        DeleteIfPresent(dlg, Path.Combine(system32X64, pair.Item1));

                        if (pair.Item2)
                        {
                            // Delete from System32\spool\drivers\x64
                            DeleteIfPresent(dlg, Path.Combine(system32X64, @"spool\drivers\x64", pair.Item1));

                            // Delete from System32\spool\drivers\x64\3
                            DeleteIfPresent(dlg, Path.Combine(system32X64, @"spool\drivers\x64\3", pair.Item1));
                        }
                    }

                    // Delete 32-bit files from System32
                    string system32Win32 = Path.GetFullPath(Environment.GetFolderPath(Environment.SpecialFolder.SystemX86));
                    foreach (Tuple <string, bool> pair in filesForSystem32Win32)
                    {
                        // Delete from System32
                        DeleteIfPresent(dlg, Path.Combine(system32Win32, pair.Item1));

                        if (pair.Item2)
                        {
                            // Delete from System32\spool\drivers\W32X86
                            DeleteIfPresent(dlg, Path.Combine(system32Win32, @"spool\drivers\W32X86", pair.Item1));

                            // Delete from System32\spool\drivers\W32X86\3
                            DeleteIfPresent(dlg, Path.Combine(system32Win32, @"spool\drivers\W32X86\3", pair.Item1));
                        }
                    }
                }
                catch (Exception ex)
                {
                    dlg.Log("There was a problem...");
                    throw ex;
                }
                finally
                {
                    // Start the spooler service again
                    dlg.Log("Starting spooler service...");
                    spoolerService.Start();
                    spoolerService.WaitForStatus(ServiceControllerStatus.Running);
                    dlg.Log("Spooler service started");
                }

                // Unregister common components
                string[] commonFiles = new string[]
                {
                    "LPCLB06N.dll",
                    "LPCMG06N.exe",
                    "LPWSE06N.exe",
                    "LPCPN06N.dll",
                    "LPPRNCON.dll",
                    "LpPrinterThunk.exe"
                };
                foreach (string file in commonFiles)
                {
                    if (File.Exists(Path.Combine(printerDriverFolder, file)))
                    {
                        Utils.UnregisterComponent(printerDriverFolder, file);
                        dlg.Log(string.Format("Unregistered {0}", file));
                    }
                    else
                    {
                        dlg.Log(string.Format("File not found, skipped unregistering: {0}", file));
                    }
                }

                // Prompt for deletion inside LEADTOOLS installation
                if (inLEAD)
                {
                    // Verify the user wants to delete the files
                    if (MessageBox.Show("Deployment path appears to be inside a LEADTOOLS installation, would you like to delete the files anyway?", "Caution", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                    {
                        // Only delete the PrinterDriver and Virtual Printer folders, not the whole SDK
                        Directory.Delete(printerDriverFolder, true);
                        Directory.Delete(virtualPrinterFolder, true);
                        dlg.Log("PrinterDriver and Virtual Printer directories deleted");
                    }
                    else
                    {
                        dlg.Log("Deployment path inside LEADTOOLS installation, not deleting");
                    }
                }
                else
                {
                    // Delete the entire directory
                    Directory.Delete(deploymentDir, true);
                    dlg.Log("Deployment path deleted");
                }

                // All done
                dlg.Finished("Deployment uninstalled successfully");
            }
            catch (Exception ex)
            {
                dlg.Finished(string.Format("Unable to uninstall:{0}{1}", Environment.NewLine, ex.Message));
            }
        }
예제 #2
0
        /// <summary>
        ///      Perform the installation
        /// </summary>
        /// <param name="dlg">The dialog that will display the output</param>
        /// <param name="tempDir">The temporary directory for extracting the package ZIP</param>
        /// <param name="deploymentDir">Where to deploy the package</param>
        /// <param name="zipFile">Full path to the package ZIP</param>
        /// <param name="target64">If deploying to 64-bit</param>
        /// <param name="dualInstall">If 32-bit drivers should also be installed during a 64-bit installation</param>
        /// <param name="inLEADOverride">If the installation should be treated as being in an SDK installation</param>
        private void Install(ProcessDialog dlg, string tempDir, string deploymentDir, string zipFile, bool target64, bool dualInstall, bool inLEADOverride)
        {
            // Unzip
            try
            {
                ZipFile.ExtractToDirectory(zipFile, tempDir);
                dlg.Log("Unzipped package to temporary directory");
            }
            catch (Exception ex)
            {
                dlg.Finished(string.Format("Unable to extract package to temporary directory:{0}{1}", Environment.NewLine, ex.Message));
                return;
            }

            // Copy files and install
            try
            {
                // Check for what's in the package
                bool hasWin32 = File.Exists(Path.Combine(tempDir, @"DriverPackageX86\LeadtoolsVirtualPrinter.INF"));
                bool hasX64   = File.Exists(Path.Combine(tempDir, @"DriverPackageX64\LeadtoolsVirtualPrinter.INF"));
                if (!hasWin32 && !hasX64)
                {
                    throw new Exception("Missing all required files");
                }

                // Ensure the different installation options are detected
                bool installWin32 = !target64 || dualInstall;
                if (!hasWin32 && installWin32)
                {
                    throw new Exception("Missing 32-bit required files");
                }
                bool installX64 = target64;
                if (!hasX64 && installX64)
                {
                    throw new Exception("Missing 64-bit required files");
                }

                // Different folder structure if in the LEADTOOLS root
                bool inLEAD = Utils.GetFolders(deploymentDir, out string printerDriverFolder, out string virtualPrinterFolder, inLEADOverride);
                if (inLEAD && !inLEADOverride)
                {
                    dlg.Log("Deployment path appears to be in LEADTOOLS installation");
                }

                // Extract package
                ExtractPackage(dlg, tempDir, installWin32, installX64, printerDriverFolder, virtualPrinterFolder);
                dlg.Log("Finished extracting package");

                // Install the printers
                InstallPrinters(dlg, installWin32, installX64, printerDriverFolder, virtualPrinterFolder);
                dlg.Log("Printer drivers installed successfully");

                // Clean up temporary folder
                new DirectoryInfo(tempDir).Attributes &= ~FileAttributes.ReadOnly;
                Directory.Delete(tempDir, true);
                dlg.Log("Deleted temporary directory");

                // All done
                dlg.Finished(string.Format("Deployment package installed successfully{0}Note: A restart may be required before the functionality is available", Environment.NewLine));
            }
            catch (Exception ex)
            {
                dlg.Finished(string.Format("Unable to install deployment package:{0}{1}", Environment.NewLine, ex.Message));
            }
        }