|
|
![]() |
|
||
|
|
|||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||
| Visual Basic System Services SetPrinter: Rename Local and Remote Printers /2 |
||
| Posted: | Saturday August 06, 2005 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | See Prerequisites | |
| Author: | VBnet - Randy Birch | |
|
Related: |
AddPrinter: Add/Delete Local/Remote Printers using Existing Drivers EnumPrinters: Enumerating Local and Network Printers EnumPrinterDrivers: Enumerate Print Drivers on Specific Printer Server SetDefaultPrinter: Changing Windows' Default Printer SetPrinter: Rename Local and Remote Printers WriteProfileString: Changing Windows' Default Printer |
|
| Prerequisites |
| For this demo as coded, Windows NT/2000/XP or later. Earlier Windows versions must use a PRINTER_INFO_2 structure where the string members are defined as strings. Application of this structure would be similar to that shown below for the PRINTER_INFO_4 structure. |
|
|
This
code duplicates the functionality shown in
SetPrinter: Rename Local and Remote Printers,
but utilizes a different definition for the PRINTER_INFO_4 structure
(and therefore a different set of preparation steps) to rename a local
or remote printer.
Rather than repeat info here, please see SetPrinter: Rename Local and Remote Printers for the full description. |
| BAS Module Code |
| None. |
|
|
| Form Code |
|
|
| Add two command buttons (Command1, Command2) to a form 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 SW_SHOWNORMAL As Long = 1
Private Const PRINTER_LEVEL4 As Long = &H4
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 Type PRINTER_DEFAULTS
pDatatype As String
pDevMode As Long
DesiredAccess As Long
End Type
Private Type PRINTER_INFO_4
pPrinterName As String
pServerName As String
Attributes As Long
End Type
Private Declare Function OpenPrinter Lib "winspool.drv" _
Alias "OpenPrinterA" _
(ByVal pPrinterName As String, _
phPrinter As Long, _
pDefault As Any) As Long
Private Declare Function ClosePrinter Lib "winspool.drv" _
(ByVal hPrinter As Long) As Long
Private Declare Function GetPrinter Lib "winspool.drv" _
Alias "GetPrinterA" _
(ByVal hPrinter As Long, _
ByVal Level As Long, _
pPrinter As Any, _
ByVal cbBuf As Long, _
pcbNeeded As Long) As Long
Private Declare Function SetPrinter Lib "winspool.drv" _
Alias "SetPrinterA" _
(ByVal hPrinter As Long, _
ByVal Level As Long, _
pPrinter As Any, _
ByVal Command As Long) As Long
Private Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Declare Function lstrlen Lib "kernel32" _
Alias "lstrlenA" _
(ByVal lpString As Any) As Long
Private Declare Function lstrcpy Lib "kernel32" _
Alias "lstrcpyA" _
(ByVal lpString1 As Any, _
ByVal lpString2 As Any) As Long
Private Sub Form_Load()
Command1.Caption = "Rename Printer"
Command2.Caption = "Open Printers Folder"
End Sub
Private Sub Command1_Click()
Debug.Print RenamePrinter("Lexmark Z42 Color Jetprinter", "LMColourZ42")
'Debug.Print RenamePrinter("LMColourZ42", "Lexmark Z42 Color Jetprinter")
End Sub
Private Sub Command2_Click()
'just opens the printers folder
Dim sParams As String
Dim sDirectory As String
sParams = vbNullString
sDirectory = vbNullString
sParams = "/e,::{2227A280-3AEA-1069-A2DE-08002B30309D}"
Call ShellExecute(0&, "Open", "explorer.exe", sParams, sDirectory, SW_SHOWNORMAL)
End Sub
Private Function RenamePrinter(sCurrentPrinterName As String, sNewPrinterName As String) As Boolean
Dim hPrinter As Long
Dim cbRequired As Long
Dim cbBuffer As Long
Dim pi4 As PRINTER_INFO_4
Dim pd As PRINTER_DEFAULTS
Dim buff() As Long
pd.DesiredAccess = PRINTER_ACCESS_USE Or PRINTER_ACCESS_ADMINISTER
If OpenPrinter(sCurrentPrinterName, hPrinter, pd) <> 0 Then
If GetPrinter(hPrinter, PRINTER_LEVEL4, 0&, 0&, cbRequired) = 0 Then
If cbRequired <> 0 Then
ReDim buff(cbRequired \ 4) As Long
cbBuffer = cbRequired
If GetPrinter(hPrinter, PRINTER_LEVEL4, buff(0), cbBuffer, cbRequired) <> 0 Then
'assign to a PRINTER_INFO_4 structure
pi4.pPrinterName = sNewPrinterName
pi4.pServerName = GetStrFromPtrA(buff(1))
pi4.Attributes = buff(2)
'and rename
RenamePrinter = SetPrinter(hPrinter, PRINTER_LEVEL4, pi4, 0&) <> 0
End If 'GetPrinter
End If 'cbRequired
End If 'GetPrinter
ClosePrinter hPrinter
End If 'OpenPrinter
End Function
Private Function GetStrFromPtrA(ByVal lpszA As Long) As String
GetStrFromPtrA = String$(lstrlen(ByVal lpszA), 0)
Call lstrcpy(ByVal GetStrFromPtrA, ByVal lpszA)
End Function
|
| Comments |
|
|
|
|
|
|||||
|
|||||
|
|
|||||
|
Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. |
![]() |