public void AddDeletePrinterPort(string portName, string monitorName, bool deletePort = false) { IntPtr printerHandle; PrinterDefaults defaults = new PrinterDefaults { DesiredAccess = PrinterAccess.ServerAdmin }; if (!OpenPrinter(",XcvMonitor " + monitorName, out printerHandle, ref defaults)) throw new Exception("Could not open printer for the monitor port " + monitorName + "!"); try { PortData portData = new PortData { sztPortName = portName }; uint size = (uint)Marshal.SizeOf(portData); IntPtr pointer = Marshal.AllocHGlobal((int)size); Marshal.StructureToPtr(portData, pointer, true); IntPtr outputData; UInt32 outputNeeded, status; if (!XcvDataW(printerHandle, deletePort ? "DeletePort" : "AddPort", pointer, size, out outputData, 0, out outputNeeded, out status)) throw new Exception(status.ToString()); } finally { ClosePrinter(printerHandle); } }
private static extern bool OpenPrinter(string printerName, out IntPtr phPrinter, ref PrinterDefaults printerDefaults);
public void RemoveVPrinter(string printerName) { var printerProps = PrinterProps.getProps(printerName); //for removal we try to go ahead even if there are some failures //5 - Configure Virtual Port removeVirtualPort(printerProps._monitorName, printerProps.portName); _logHelper.Log("removeVirtualPort Completed"); //4 - Add Printer try { var printerDefaults = new PrinterDefaults { DesiredAccess = PrinterAccess.PrinterAllAccess, //0x000F000C,//PRINTER_ALL_ACCESS pDataType = IntPtr.Zero, pDevMode = IntPtr.Zero }; IntPtr printerHandle; if (!OpenPrinter(printerName, out printerHandle, ref printerDefaults)) throw new Win32Exception(Marshal.GetLastWin32Error()); _logHelper.Log("OpenPrinter Completed"); try { if (!DeletePrinter(printerHandle)) throw new Win32Exception(Marshal.GetLastWin32Error()); _logHelper.Log("DeletePrinter Completed"); } finally { if (IntPtr.Zero != printerHandle) ClosePrinter(printerHandle); } } catch (Exception ex) { _logHelper.Log("Failed to renove printer : " + ex.Message); } //3 - Add Printer Driver if (DeletePrinterDriver(null, null, printerProps.driverName) == 0) { var ex = new Win32Exception(Marshal.GetLastWin32Error()); _logHelper.Log("ERROR in custom action AddDeletePrinterPort : " + ex.ToString()); // } _logHelper.Log("DeletePrinterDriver Completed"); //2 - Add Printer Port try { AddDeletePrinterPort(printerProps.portName, printerProps._monitorName, true); _logHelper.Log("AddDeletePrinterPort Completed"); } catch (Exception ex) { _logHelper.Log("ERROR in custom action AddDeletePrinterPort : " + ex.ToString()); } //1 - Add Printer Monitor RemovePrinterMonitor(printerProps._monitorName); _logHelper.Log("RemovePrinterMonitor Completed"); //6 - Restart Spool Service _logHelper.Log("Restarting Spool Service"); GenericResult restartSpoolResult = RestartSpoolService(); if (restartSpoolResult.Success == false) throw restartSpoolResult.Exception; }
private static extern bool OpenPrinter( [MarshalAs(UnmanagedType.LPTStr)] string pPrinterName, out IntPtr phPrinter, ref PrinterDefaults pDefaults );
public GenericResult AddPrinterPort(string portName, string portType) { GenericResult retVal = new GenericResult("AddPrinterPort"); IntPtr printerHandle; PrinterDefaults defaults = new PrinterDefaults { DesiredAccess = PrinterAccess.ServerAdmin }; try { if (!OpenPrinter(",XcvMonitor " + portType, out printerHandle, ref defaults)) { throw new Exception("Could not open printer for the monitor port " + portType + "!"); } try { PortData portData = new PortData { sztPortName = portName }; uint size = (uint)Marshal.SizeOf(portData); IntPtr pointer = Marshal.AllocHGlobal((int)size); Marshal.StructureToPtr(portData, pointer, true); IntPtr outputData; UInt32 outputNeeded, status; try { if (!XcvDataW(printerHandle, "AddPort", pointer, size, out outputData, 0, out outputNeeded, out status)) { retVal.Message = status.ToString(); } } catch (Exception ex) { retVal.Exception = ex; retVal.Message = retVal.Exception.Message; } finally { Marshal.FreeHGlobal(pointer); } } catch (Exception ex) { retVal.Exception = ex; retVal.Message = retVal.Exception.Message; } finally { ClosePrinter(printerHandle); } } catch (Exception ex) { retVal.Exception = ex; retVal.Message = retVal.Exception.Message; } if (string.IsNullOrWhiteSpace(retVal.Message)) { retVal.Success = true; } return(retVal); }