Level Extreme platform
Subscription
Corporate profile
Products & Services
Support
Legal
Français
Changing printer in browser control
Message
General information
Forum:
Visual FoxPro
Category:
Internet applications
Environment versions
Visual FoxPro:
VFP 6
OS:
Windows XP
Miscellaneous
Thread ID:
01378577
Message ID:
01378615
Views:
17
>Not that I'm aware of. It's my experience that already running applications ignore changes of default Windows printer. IOW, only applications started after default Windows printer has been changed may use it.
>
>>After changing the default Windows printer, the new default setting is not respected by new IE browser objects (created in VFP code after the code for changing the default printer). They still have the old default printer selected!
>>
>>Is there a way to force the new setting to be respected?

I found a complete example of what you have to do to change the system-wide default printer so that when you call:

Explorer.ExecWB OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, "", "" 'Print, and don't prompt user

it will call the correct default printer... I would appreciate a translation into VFP code of how to call the SendMessage() function from FoxPro (SendMessage() cause all applications to reload the WIN.INI file):

"In a new project, add a listbox and a commandbutton to the form, then add a new module to the form.

In the module, add the following code:
      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 

      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 

      ' 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 Long 
              DesiredAccess As Long 
      End Type
In the form's declaration section, add this code:
      Option Explicit 

      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 

      Private 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 

      Private Sub Win95SetDefaultPrinter() 
          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 = List1.List(List1.ListIndex) 
          ' none - exit 
          If PrinterName = "" Then 
              Exit Sub 
          End If 

          ' set the PRINTER_DEFAULTS members 
          pd.pDatatype = 0& 
          pd.DesiredAccess = PRINTER_ALL_ACCESS Or pd.DesiredAccess 

          ' Get a handle to the printer 
          x = OpenPrinter(PrinterName, Handle, pd) 
          ' failed the open 
          If x = False Then 
              'error handler code goes here 
              Exit Sub 
          End If 

          ' 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 Err.LastDllError 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 
              'error handler code goes here 
              Exit Sub 
          End If 

          ' 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 
              MsgBox "SetPrinterFailed. Error code: " & Err.LastDllError 
              Exit Sub 
          End If 

          ' and close the handle 
          ClosePrinter (Handle) 

      End Sub 

      Private 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 

      Private Sub ParseList(lstCtl As Control, ByVal Buffer As String) 
          Dim i As Integer 

          Dim s As String 

          Do 
              i = InStr(Buffer, Chr(0)) 
              If i > 0 Then 
                  s = Left(Buffer, i - 1) 
                  If Len(Trim(s)) Then lstCtl.AddItem s 
                  Buffer = Mid(Buffer, i + 1) 
              Else 
                  If Len(Trim(Buffer)) Then lstCtl.AddItem Buffer 
                  Buffer = "" 
              End If 
          Loop While i > 0 
      End Sub 

      Private Sub WinNTSetDefaultPrinter() 
          Dim Buffer As String 
          Dim DeviceName As String 
          Dim DriverName As String 
          Dim PrinterPort As String 
          Dim PrinterName As String 
          Dim r As Long 
          If List1.ListIndex > -1 Then 
              'Get the printer information for the currently selected 
              'printer in the list. The information is taken from the 
              'WIN.INI file. 
              Buffer = Space(1024) 
              PrinterName = List1.Text 
              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 List1.Text, DriverName, PrinterPort 
              End If 
          End If 
      End Sub 

      Private Sub Command1_Click() 
          Dim osinfo As OSVERSIONINFO 
          Dim retvalue As Integer 

          osinfo.dwOSVersionInfoSize = 148 
          osinfo.szCSDVersion = Space$(128) 
          retvalue = GetVersionExA(osinfo) 

      If osinfo.dwMajorVersion = 3 And osinfo.dwMinorVersion = 51 And _ 
          osinfo.dwBuildNumber = 1057 And osinfo.dwPlatformId = 2 Then 
              Call WinNTSetDefaultPrinter 
          ElseIf osinfo.dwMajorVersion = 4 And osinfo.dwMinorVersion = 0 _ 
          And osinfo.dwBuildNumber = 67109814 And osinfo.dwPlatformId = 1 _ 
          Then 
              Call Win95SetDefaultPrinter 
          ElseIf osinfo.dwMajorVersion = 4 And osinfo.dwMinorVersion = 0 _ 
          And osinfo.dwBuildNumber = 1381 And osinfo.dwPlatformId = 2 Then 
              Call WinNTSetDefaultPrinter 
          End If 
      End Sub 

      Private Sub Form_Load() 
          Dim r As Long 
          Dim Buffer As String 

          'Get the list of available printers from WIN.INI 
          Buffer = Space(8192) 
          r = GetProfileString("PrinterPorts", vbNullString, "", _ 
             Buffer, Len(Buffer)) 

          'Display the list of printer in the list box List1 
          ParseList List1, Buffer 
      End Sub
When you run the program, you can select a printer from the listbox... When you click the commandbutton, the selected printer will become the default printer for all applications."
Vidar Johannessen
Previous
Next
Reply
Map
View

Click here to load this message in the networking platform