|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Visual Basic System Services AddPrinter: Add/Delete Local/Remote Printers using Existing Drivers |
|
| Posted: | Tuesday June 22, 2004 |
| Updated: | Monday December 26, 2011 |
| Applies to: | VB4-32, VB5, VB6 |
| Developed with: | VB6, Windows XP |
| OS restrictions: | None |
| Author: | VBnet - Randy Birch |
|
Related:
|
AddPort: Adding and Deleting Application-Defined Ports AddPrinter: Add/Delete Local/Remote Printers using Existing Drivers EnumPorts: Identify Windows' Available Ports |
| Prerequisites |
| None. |
|
|
Windows'
AddPrinter, OpenPrinter and DeletePrinter APIs provide for easily adding
new printers using drivers already installed on the target machine. The
code is straightforward and well commented, but some discussion of
installing on remote machines is required.AddPrinter uses a UDT to pass the parameters for the new printer. One of these parameters is the pPrinterName member, which can be thought of as the printer's 'friendly name' ("vbnet test printer" in this demo). AddPrinter's parameter list also sports a server name member which accepts either vbNullString (for installation on the local machine), or a remote machine name in the usual server format "\\servername". In order to delete a printer the printer must first be opened using OpenPrinter. While this API has a printer name parameter, it does not have a server name parameter as AddPrinter does. Therefore, to open a remote printer the format of the printer name parameter is similar to that for a remote file ... "\\servername\printername". In my demo, where the printer name used is "vbnet test printer" and my remote machine is named "laptopxp", OpenPrinter's printer name parameter would be "\\laptopxp\vbnet test printer". Considerable additional work (along with several other API calls) is required to install a printer and printer driver from scratch, and is thus not covered in this demo. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| On a form add two command buttons (Command1, Command2) and a label (Lable1), along with the following code: |
|
|
Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const PRINTER_ATTRIBUTE_SHARED As Long = &H8
Private Const PRINTER_ATTRIBUTE_LOCAL As Long = &H40
Private Const PRINTER_ATTRIBUTE_NETWORK = &H10
Private Const PRINTER_LEVEL2 As Long = &H2
Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const PRINTER_ACCESS_ADMINISTER As Long = &H4
Private Const PRINTER_ACCESS_USE As Long = &H8
Private Const PRINTER_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or _
PRINTER_ACCESS_ADMINISTER Or _
PRINTER_ACCESS_USE)
Private Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long 'DEVMODE
DesiredAccess As Long
End Type
Private Type PRINTER_INFO_2
pServerName As String
pPrinterName As String
pShareName As String
pPortName As String
pDriverName As String
pComment As String
pLocation As String
pDevMode As Long 'DEVMODE
pSepFile As String
pPrintProcessor As String
pDatatype As String
pParameters As String
pSecurityDescriptor As Long 'SECURITY_DESCRIPTOR
Attributes As Long
Priority As Long
DefaultPriority As Long
StartTime As Long
UntilTime As Long
Status As Long
cJobs As Long
AveragePPM As Long
End Type
Private Declare Function AddPrinter Lib "winspool.drv" _
Alias "AddPrinterA" _
(ByVal pServerName As String, _
ByVal Level As Long, _
pPrinter As Any) As Long
Private Declare Function OpenPrinter Lib "winspool.drv" _
Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
pDefault As Any) As Long
Private Declare Function DeletePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
Private Sub Form_Load()
Command1.Caption = "Add Printer"
Command2.Caption = "Delete Printer"
Label1.Caption = ""
End Sub
Private Sub Command1_Click()
Dim hPrinter As Long
Dim sServer As String
Dim pi2 As PRINTER_INFO_2
With pi2
'local machine
.pServerName = vbNullString
'display name for new printer
.pPrinterName = "vbnet test printer"
'name for share - must be upper-case
.pShareName = "HPLJ601"
'printer port (NT or later can
'have multiple separated with
'commas, e.g. "LPT1:,LPT2:")
.pPortName = "LPT1:"
'the name of an existing driver
.pDriverName = "HP LaserJet 5Si MX"
'a comment, if desired
.pComment = "Test printer - can delete"
'the location, if desired
.pLocation = "Bldg 7, Room 1321, NW601"
'the print processor name - manditory
.pPrintProcessor = "WinPrint"
'type of data supported, e.g. RAW or EMF
'this must match type used by the driver
'- manditory
.pDatatype = "RAW"
'flags - local printer, with share created
.Attributes = PRINTER_ATTRIBUTE_LOCAL Or _
PRINTER_ATTRIBUTE_SHARED
End With
'install on the local machine by passing
'vbNullString as the server name. If
'installation on another machine is
'to be made, pass the machine name
'in the usual 'server name format',
'eg: sServer = "\\laptopxp"
sServer = vbNullString
hPrinter = AddPrinter(sServer, PRINTER_LEVEL2, pi2)
Debug.Print hPrinter, Err.LastDllError
If hPrinter <> 0 Then
Label1.Caption = "Printer added successfully"
ClosePrinter hPrinter
End If
End Sub
Private Sub Command2_Click()
Dim hPrinter As Long
Dim sPrinterName As String
Dim pd As PRINTER_DEFAULTS
'we're deleting the just-added local printer,
'so specify the same printer name as used
'for pi2.pPrinterName during AddPrinter
sPrinterName = "vbnet test printer"
'if the printer to be deleted is on another
'machine, the machine and printer are passed
'together as sPrinterName in the format
'\\computername\printername, e.g.
' sPrinterName = sServer & "\" & sPrinterName
'or for our demo,
' sPrinterName = "\\laptopxp\vbnet test printer"
'set up a printer_defaults structure
With pd
'no devmode, so UDT member is
'declared Long and a null is passed
.pDevMode = 0&
'must be datatype of printer driver
'as set in AddPrinter
.pDatatype = "RAW"
'this is the access level for delete
.DesiredAccess = PRINTER_ALL_ACCESS
End With
If OpenPrinter(sPrinterName, hPrinter, pd) <> 0 Then
If hPrinter <> 0 Then
If DeletePrinter(hPrinter) <> 0 Then
Label1.Caption = "Printer deleted"
End If 'DeletePrinter
End If 'hPrinter
ClosePrinter hPrinter
End If 'OpenPrinter
Debug.Print hPrinter, Err.LastDllError
End Sub |
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |