Changing the default printer

Hi,
I'm trying to printer to a printer whitch is not the default one (I don't care makeing it the default one and then print).
I'm trying to use the code givven in the VB help:
"Dim X As Printer
For Each X In Printers
      If X.Orientation = vbPRORPortrait Then
            ' Set printer as system default.
            Set Printer = X
            ' Stop looking for a printer.
            Exit For
      End If
Next"

But it seems to be not working.
Sometimes the printer is neing change and sometimes not.
Is it a bug?
What can I do else?

Thanks,
eyaltilAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

watyCommented:
Give me you e-mail, I will send you the complete sources, it seems that I can't post it, there is a server internal error

waty.thierry@usa.net
0
watyCommented:
' #VBIDEUtils#************************************************************
' * Programmer Name  : Waty Thierry
' * Web Site         : www.geocities.com/ResearchTriangle/6311/
' * E-Mail           : waty.thierry@usa.net
' * Date             : 8/01/99
' * Time             : 11:51
' * Module Name      : Printer_Module
' * Module Filename  : printer.bas
' **********************************************************************
' * Comments         : Set default printer
' *
' *
' **********************************************************************

Option Explicit

Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As String) As Long

Public Const HWND_BROADCAST = HFFFF
Public Const WM_WININICHANGE = H1A

Public Type OSVERSIONINFO
   dwOSVersionInfoSize  As Long
   dwMajorVersion       As Long
   dwMinorVersion       As Long
   dwBuildNumber        As Long
   dwPlatformId         As Long
   szCSDVersion         As String * 128
End Type

Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Public 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
Public 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
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long

' *** constants for DEVMODE structure
Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32

' *** constants for DesiredAccess member of PRINTER_DEFAULTS
Public Const STANDARD_RIGHTS_REQUIRED = HF0000
Public Const PRINTER_ACCESS_ADMINISTER = H4
Public Const PRINTER_ACCESS_USE = H8
Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

' *** constant that goes into PRINTER_INFO_5 Attributes member to set it as default
Public Const PRINTER_ATTRIBUTE_DEFAULT = 4

Public Type DEVMODE
   dmDeviceName         As String * CCHDEVICENAME
   dmSpecVersion        As Integer
   dmDriverVersion      As Integer
   dmSize               As Integer
   dmDriverExtra        As Integer
   dmFields             As Long
   dmOrientation        As Integer
   dmPaperSize          As Integer
   dmPaperLength        As Integer
   dmPaperWidth         As Integer
   dmScale              As Integer
   dmCopies             As Integer
   dmDefaultSource      As Integer
   dmPrintQuality       As Integer
   dmColor              As Integer
   dmDuplex             As Integer
   dmYResolution        As Integer
   dmTToption           As Integer
   dmCollate            As Integer
   dmFormName           As String * CCHFORMNAME
   dmLogPixels          As Integer
   dmBitsPerPel         As Long
   dmPelsWidth          As Long
   dmPelsHeight         As Long
   dmDisplayFlags       As Long
   dmDisplayFrequency   As Long
   dmICMMethod          As Long        ' // Windows 95 only
   dmICMIntent          As Long        ' // Windows 95 only
   dmMediaType          As Long        ' // Windows 95 only
   dmDitherType         As Long        ' // Windows 95 only
   dmReserved1          As Long        ' // Windows 95 only
   dmReserved2          As Long        ' // Windows 95 only
End Type

Public Type PRINTER_INFO_5
   pPrinterName               As String
   pPortName                  As String
   Attributes                 As Long
   DeviceNotSelectedTimeout   As Long
   TransmissionRetryTimeout   As Long
End Type

Public Type PRINTER_DEFAULTS
   pDatatype            As Long
   pDevMode             As DEVMODE
   DesiredAccess        As Long
End Type

Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

Private Function PtrCtoVbString(Add As Long) As String
   
   Dim sTemp As String * 512, X As Long
   
   X = lstrcpy(sTemp, Add)
   If (InStr(1, sTemp, Chr(0)) = 0) Then
      PtrCtoVbString = ""
   Else
      PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
   End If

End Function

Public Sub SetDefaultPrinter(ByVal PrinterName As String, ByVal DriverName As String, ByVal PrinterPort As String)
   
   Dim DeviceLine As String
   Dim r As Long
   Dim l As Long
   DeviceLine = PrinterName  ","  DriverName  ","  PrinterPort
   ' *** Store the new printer information in the [WINDOWS] section of
   ' *** the WIN.INI file for the DEVICE= item
   r = WriteProfileString("windows", "Device", DeviceLine)
   
   ' *** Cause all applications to reload the INI file:
   l = SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows")

End Sub
0
setiawanCommented:
0
Big Business Goals? Which KPIs Will Help You

The most successful MSPs rely on metrics – known as key performance indicators (KPIs) – for making informed decisions that help their businesses thrive, rather than just survive. This eBook provides an overview of the most important KPIs used by top MSPs.

caraf_gCommented:
waty:

"server internal error "

Try using oldlook.experts-exchange.com
0
watyCommented:
Thanks caraf_g, I didn't though to that :)

' #VBIDEUtils#************************************************************
' * Programmer Name  : Waty Thierry
' * Web Site         : www.geocities.com/ResearchTriangle/6311/
' * E-Mail           : waty.thierry@usa.net
' * Date             : 8/01/99
' * Time             : 11:51
' * Module Name      : Printer_Module
' * Module Filename  : printer.bas
' **********************************************************************
' * Comments         : Set default printer
' *
' *
' **********************************************************************

Option Explicit

Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Declare Function WriteProfileString Lib "kernel32" Alias "WriteProfileStringA" (ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Long
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As String) As Long

Public Const HWND_BROADCAST = &HFFFF
Public Const WM_WININICHANGE = &H1A

Public Type OSVERSIONINFO
   dwOSVersionInfoSize  As Long
   dwMajorVersion       As Long
   dwMinorVersion       As Long
   dwBuildNumber        As Long
   dwPlatformId         As Long
   szCSDVersion         As String * 128
End Type

Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer
Public Declare Function OpenPrinter Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName As String, phPrinter As Long, pDefault As PRINTER_DEFAULTS) As Long
Public 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
Public 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
Public Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Any) As Long
Public Declare Function ClosePrinter Lib "winspool.drv" (ByVal hPrinter As Long) As Long
Public Declare Function GetLastError Lib "kernel32" () As Long

' *** constants for DEVMODE structure
Public Const CCHDEVICENAME = 32
Public Const CCHFORMNAME = 32

' *** constants for DesiredAccess member of PRINTER_DEFAULTS
Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const PRINTER_ACCESS_ADMINISTER = &H4
Public Const PRINTER_ACCESS_USE = &H8
Public Const PRINTER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or PRINTER_ACCESS_ADMINISTER Or PRINTER_ACCESS_USE)

' *** constant that goes into PRINTER_INFO_5 Attributes member to set it as default
Public Const PRINTER_ATTRIBUTE_DEFAULT = 4

Public Type DEVMODE
   dmDeviceName         As String * CCHDEVICENAME
   dmSpecVersion        As Integer
   dmDriverVersion      As Integer
   dmSize               As Integer
   dmDriverExtra        As Integer
   dmFields             As Long
   dmOrientation        As Integer
   dmPaperSize          As Integer
   dmPaperLength        As Integer
   dmPaperWidth         As Integer
   dmScale              As Integer
   dmCopies             As Integer
   dmDefaultSource      As Integer
   dmPrintQuality       As Integer
   dmColor              As Integer
   dmDuplex             As Integer
   dmYResolution        As Integer
   dmTToption           As Integer
   dmCollate            As Integer
   dmFormName           As String * CCHFORMNAME
   dmLogPixels          As Integer
   dmBitsPerPel         As Long
   dmPelsWidth          As Long
   dmPelsHeight         As Long
   dmDisplayFlags       As Long
   dmDisplayFrequency   As Long
   dmICMMethod          As Long        ' // Windows 95 only
   dmICMIntent          As Long        ' // Windows 95 only
   dmMediaType          As Long        ' // Windows 95 only
   dmDitherType         As Long        ' // Windows 95 only
   dmReserved1          As Long        ' // Windows 95 only
   dmReserved2          As Long        ' // Windows 95 only
End Type

Public Type PRINTER_INFO_5
   pPrinterName               As String
   pPortName                  As String
   Attributes                 As Long
   DeviceNotSelectedTimeout   As Long
   TransmissionRetryTimeout   As Long
End Type

Public Type PRINTER_DEFAULTS
   pDatatype            As Long
   pDevMode             As DEVMODE
   DesiredAccess        As Long
End Type

Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long

Private Function PtrCtoVbString(Add As Long) As String
   
   Dim sTemp As String * 512, X As Long
   
   X = lstrcpy(sTemp, Add)
   If (InStr(1, sTemp, Chr(0)) = 0) Then
      PtrCtoVbString = ""
   Else
      PtrCtoVbString = Left(sTemp, InStr(1, sTemp, Chr(0)) - 1)
   End If

End Function

Public Sub SetDefaultPrinter(ByVal PrinterName As String, ByVal DriverName As String, ByVal PrinterPort As String)
   
   Dim DeviceLine As String
   Dim r As Long
   Dim l As Long
   DeviceLine = PrinterName & "," & DriverName & "," & PrinterPort
   ' *** Store the new printer information in the [WINDOWS] section of
   ' *** the WIN.INI file for the DEVICE= item
   r = WriteProfileString("windows", "Device", DeviceLine)
   
   ' *** Cause all applications to reload the INI file:
   l = SendMessage(HWND_BROADCAST, WM_WININICHANGE, 0, "windows")

End Sub

Public Sub Win95SetDefaultPrinter(sPrinter As String)
   
   Dim Handle           As Long              ' handle to printer
   Dim PrinterName      As String
   Dim pd               As PRINTER_DEFAULTS
   Dim X                As Long
   Dim need             As Long             ' bytes needed
   Dim pi5              As PRINTER_INFO_5   ' your PRINTER_INFO structure
   Dim LastError        As Long
   
   ' determine which printer was selected
   PrinterName = sPrinter
   
   ' none - exit
   If PrinterName = "" Then Exit Sub
   
   ' set the PRINTER_DEFAULTS members
   pd.pDatatype = 0&
   pd.DesiredAccess = PRINTER_ALL_ACCESS
   
   ' Get a handle to the printer
   X = OpenPrinter(PrinterName, Handle, pd)
   
   ' failed the open
   If X = False Then Exit Sub
     
   ' Make an initial call to GetPrinter, requesting Level 5  (PRINTER_INFO_5)
   ' information, to determine how many bytes  you need
   X = GetPrinter(Handle, 5, ByVal 0&, 0, need)
   
   ' don 't want to check GetLastError here - it's supposed to fail
   ' with a 122 - ERROR_INSUFFICIENT_BUFFER
   ' redim t as large as you need
   
   ReDim t((need \ 4)) As Long
   
   ' and call GetPrinter for keepers this time
   X = GetPrinter(Handle, 5, t(0), need, need)
   
   ' failed the GetPrinter
   If X = False Then Exit Sub
     
   ' set the members of the pi5 structure for use with SetPrinter.
   ' PtrCtoVbString copies the memory pointed at by the two    string
   ' pointers contained in the t() array into a Visual Basic string.
   ' The other three elements are just DWORDS (long integers) and
   ' don 't require any conversion
   pi5.pPrinterName = PtrCtoVbString(t(0))
   pi5.pPortName = PtrCtoVbString(t(1))
   pi5.Attributes = t(2)
   pi5.DeviceNotSelectedTimeout = t(3)
   pi5.TransmissionRetryTimeout = t(4)
   
   ' this is the critical flag that makes it the default printer
   pi5.Attributes = PRINTER_ATTRIBUTE_DEFAULT
   
   ' call SetPrinter to set it
   X = SetPrinter(Handle, 5, pi5, 0)
   
   ' failed the SetPrinter
   If X = False Then Exit Sub
   
   ' and close the handle
   ClosePrinter (Handle)
   
End Sub

Public Sub GetDriverAndPort(ByVal Buffer As String, DriverName As String, PrinterPort As String)
   
   Dim iDriver       As Integer
   Dim iPort         As Integer
   
   DriverName = ""
   PrinterPort = ""
   
   ' The driver name is first in the string terminated by a comma
   iDriver = InStr(Buffer, ",")
   
   If iDriver > 0 Then
      ' Strip out the driver name
      DriverName = Left(Buffer, iDriver - 1)
   
      ' The port name is the second entry after the driver name separated by commas.
      iPort = InStr(iDriver + 1, Buffer, ",")
      If iPort > 0 Then
         ' Strip out the port name
         PrinterPort = Mid(Buffer, iDriver + 1, _
         iPort - iDriver - 1)
      End If
   End If

End Sub

Public Sub ParseList(lstCtl As Control, ByVal Buffer As String)
   
   Dim i As Integer
   
   lstCtl.Clear
   
   Do
      i = InStr(Buffer, Chr(0))
      If i > 0 Then
         If (Trim(Left(Buffer, i - 1)) <> "") Then lstCtl.AddItem Left(Buffer, i - 1)
         Buffer = Mid(Buffer, i + 1)
      Else
         If (Trim(Buffer) <> "") Then lstCtl.AddItem Buffer
         Buffer = ""
      End If
   Loop While i > 0

End Sub

Public Sub WinNTSetDefaultPrinter(sPrinter As String)
   
   Dim Buffer        As String
   Dim DeviceName    As String
   Dim DriverName    As String
   Dim PrinterPort   As String
   Dim PrinterName   As String
   Dim r             As Long
   
   Buffer = Space(1024)
   PrinterName = sPrinter
   r = GetProfileString("PrinterPorts", PrinterName, "", Buffer, Len(Buffer))
   
   ' Parse the driver name and port name out of the buffer
   GetDriverAndPort Buffer, DriverName, PrinterPort
   If DriverName <> "" And PrinterPort <> "" Then
      SetDefaultPrinter sPrinter, DriverName, PrinterPort
   End If

End Sub

0
eyaltilAuthor Commented:
What?!
How do I use this code?
0
watyCommented:
Depending if you are under Win95/98 or under Windows NT :

call Win95SetDefaultPrinter("YourPrinterToPrint")

or

WinNTSetDefaultPrinter(Printers(2).Devicename)

It works very well, I use it, I use it in several applications
0
Erick37Commented:
Why shouldn't the Printer object work?  Your code looks ok, but perhaps you need to search for the device name of the printer as well.  This code always works on my machine (and the Linotronic printer is not the default):

Private Sub Command1_Click()
    Dim p As Printer
    For Each p In Printers
        If (p.Orientation = vbPRORPortrait) And _
            (p.DeviceName Like "*Linotronic*") Then
            Set Printer = p
            Exit For
        End If
    Next
    MsgBox p.DeviceName & vbCrLf & p.Orientation
    Form1.PrintForm
    Printer.EndDoc
End Sub
0
eyaltilAuthor Commented:
It seemes that the default printer is being change (I can see that when I'm debuging the code) but when I rich the first command of the printer (like printer.enddoc, printer.print ...) the default printer is beeing changed to the first one.
0
Erick37Commented:
Try setting the Printer.TrackDefault property False.
0
eyaltilAuthor Commented:
Waty, please answer the question so I whould be able to give you the points
0
watyCommented:
Thanks
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic Classic

From novice to tech pro — start learning today.