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