AddPrinter (winspool)
Last changed: Yazeed Hamdan-188.247.76.78

.
Summary
Add a printer to the local (or remote) print system

C# Signature:

[DllImport("winspool.drv", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall,  SetLastError = true)]
static extern int AddPrinter(string pName, uint Level, [In] ref PRINTER_INFO_2 pPrinter);

VB Signature:

Declare Function AddPrinter Lib "Winspool.dll" (TODO) As TODO

User-Defined Types:

None.

Alternative Managed API:

Do you know one? Please contribute it!

Notes:

Sample code is done as a console application with hardcoded parameters to make the example simple

Tips & Tricks:

Please add some!

Sample Code:

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Runtime.InteropServices;

  namespace AddPrinter
  {
    class Program
    {
      [DllImport("winspool.drv", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall,     SetLastError = true)]
      static extern int AddPrinter(string pName, uint Level, [In] ref PRINTER_INFO_2 pPrinter);

      [DllImport("winspool.drv")]
      static extern int ClosePrinter(int hPrinter);
      static void Main(string[] args)
      {
    PRINTER_INFO_2 pInfo = new PRINTER_INFO_2();
    int hPrt;
    int iError;
    pInfo.pPrinterName = "Test";
    pInfo.pPortName = "IP_10.63.185.199";
    pInfo.pDriverName = "HP LaserJet 4 Plus";
    pInfo.pPrintProcessor = "WinPrint";
    hPrt = AddPrinter("", 2, ref pInfo);
    if (hPrt == 0)
    {
      iError = Marshal.GetLastWin32Error();
      switch (iError)
      {
        case 1796: Console.WriteLine("The specified port is unknown"); break;
        case 1797: Console.WriteLine("Printer driver is unknown or not loaded"); break;
        case 1798: Console.WriteLine("The print processor is unknown"); break;
        case 1801: Console.WriteLine("Printer name is invalid"); break;
        case 1802: Console.WriteLine("Printer name already exists"); break;
        default: Console.WriteLine("An error occured. Errorcode: " + iError); break;
      }
    }
    else
    {
      Console.WriteLine("Printer was created successfully"); }
      ClosePrinter(hPrt);
      Console.WriteLine("Press any key to exit!");
      Console.ReadKey();
    }
      }

      [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
      struct PRINTER_INFO_2
      {
    public string pServerName;
    public string pPrinterName;
    public string pShareName;
    public string pPortName;
    public string pDriverName;
    public string pComment;
    public string pLocation;
    public IntPtr pDevMode;
    public string pSepFile;
    public string pPrintProcessor;
    public string pDatatype;
    public string pParameters;
    public IntPtr pSecurityDescriptor;
    public uint Attributes;
    public uint Priority;
    public uint DefaultPriority;
    public uint StartTime;
    public uint UntilTime;
    public uint Status;
    public uint cJobs;
    public uint AveragePPM;
     }
  }

Documentation
AddPrinter on MSDN