Tipp 5.17 - Standarddrucker ermitteln

Wie kann ich den Standarddrucker betriebssystem-abhängig ermitteln?

Mit dieser Funktion können Sie den Standarddrucker betriebssystem-abhängig ermitteln. Kopieren Sie einfach nachfolgenden Quellcode in die Zwischenablage und fügen Sie anschließend den Inhalt der Zwischenablage in ein neues Modul ein. Die Aufrufparameter finden Sie im Quellcode beschrieben.

Api-AufrufeVerwendete Win32-Api-Aufrufe und Typen: GetProfileString, RegOpenKey, RegQueryValueEx, RegCloseKey, GetDefaultPrinter, GetVersionEx - OSVERSIONINFO

Beispiel:

Option Explicit
 
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 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
 
Public Declare Function RegOpenKey _
    Lib "advapi32.dll" Alias _
    "RegOpenKeyA" _
    (ByVal hKey As Long, _
    ByVal lpSubKey As String, _
    phkResult As Long) As Long
 
Public Declare Function RegQueryValueEx _
    Lib "advapi32.dll" Alias _
    "RegQueryValueExA" _
    (ByVal hKey As Long, _
    ByVal sValue As String, _
    ByVal lReserved As Long, _
    lType As Long, _
    ByVal sData As String, _
    lcbData As Long) As Long
 
Public Declare Function RegCloseKey _
    Lib "advapi32.dll" _
    (ByVal hKey As Long) As Long
 
Public Declare Function GetDefaultPrinter _
    Lib "winspool.drv" Alias _
    "GetDefaultPrinterA" _
    (ByVal pszBuffer As String, _
    pcchBuffer As Long) As Long
 
Public Declare Function GetVersionEx _
    Lib "kernel32" Alias _
    "GetVersionExA" _
    (lpVersionInformation As OSVERSIONINFO) As Long
 
Public Function vbGetDefaultPrinter() As String
  '// -----------------------------------------------------
  '// Methode:   | Standarddrucker betriebssystemabhängig
  '//            | ermitteln; benötigt Hilfsfunktionen
  '//            | ReadWIniSetting und GetSettingString
  '// -----------------------------------------------------
  '// Parameter: | -
  '// -----------------------------------------------------
  '// Rückgabe:  | Standarddrucker
  '// -----------------------------------------------------
  '// Autor:     | Stefan Kulpa
  '//            | EDV Innovation & Consulting - Dormagen
  '// -----------------------------------------------------
  '// Alternativ:| ?Printer.DeviceName (nur in VB)
  '// -----------------------------------------------------
  Const HKEY_CURRENT_CONFIG   As Long = &H80000005
  Dim sSection                As String
  Dim sBuffer                 As String
  Dim sResult                 As String
  Dim sKey                    As String
  Dim lRequired               As Long
  Dim lEntries                As Long
  Dim cbBuffer                As Long
  Dim lHlp                    As Long
 
  If IsWinNT4 Then
    vbGetDefaultPrinter = ReadWIniSetting("windows", _
        "device")
  ElseIf IsWinNT5 Then
    sBuffer = String(1024, 0)
    lHlp = GetDefaultPrinter(sBuffer, Len(sBuffer))
    vbGetDefaultPrinter = VBA.Left(sBuffer, _
        InStr(sBuffer, vbNullChar) - 1)
  Else
    vbGetDefaultPrinter = GetSettingString _
       (HKEY_CURRENT_CONFIG, _
       "System\CurrentControlSet\Control\Print\Printers", _
       "Default")
  End If
 
End Function
 
Public Function ReadWIniSetting(sSection As String, _
                                sKey As String) As String
  Dim sBuffer As String
  sBuffer = VBA.String(1024, 0)
  If GetProfileString(sSection, sKey, _
      vbNullString, sBuffer, Len(sBuffer)) Then
    ReadWIniSetting = VBA.Left(sBuffer, _
        InStr(sBuffer, vbNullChar) - 1)
  End If
 
End Function
 
Public Function GetSettingString( _
                ByVal lKey As Long, _
                sPath As String, _
                sValue As String, _
                Optional sDefault As String = "") _
                As String
 
  Const ERROR_SUCCESS As Long = 0&
  Const REG_DWORD     As Long = 4
  Const REG_SZ        As Long = 1
 
  Dim sBuffer         As String
  Dim lCurKey         As Long
  Dim lValueType      As Long
  Dim lRegResult      As Long
  Dim lDataBufferSize As Long
 
  GetSettingString = sDefault
  lRegResult = RegOpenKey(lKey, sPath, lCurKey)
  lRegResult = RegQueryValueEx(lCurKey, _
      sValue, _
      0&, _
      lValueType, _
      ByVal 0&, _
      lDataBufferSize)
  If lRegResult = ERROR_SUCCESS Then
    If lValueType = REG_SZ Then
      sBuffer = String(lDataBufferSize, 0)
      lRegResult = RegQueryValueEx(lCurKey, _
          sValue, _
          0&, _
          0&, _
          ByVal sBuffer, _
          lDataBufferSize)
      If lRegResult = ERROR_SUCCESS Then
        GetSettingString = _
            VBA.Left(sBuffer, VBA.InStr(sBuffer, _
            vbNullChar) - 1)
      End If
    End If
  End If
  lRegResult = RegCloseKey(lCurKey)
 
End Function
 
Public Property Get IsWinNT5() As Boolean
 
  Const VER_PLATFORM_WIN32_NT As Long = 2
  Dim uOSVer                  As OSVERSIONINFO
  uOSVer.dwOSVersionInfoSize = Len(uOSVer)
  GetVersionEx uOSVer
  IsWinNT5 = (uOSVer.dwPlatformID = _
      VER_PLATFORM_WIN32_NT) And _
      (uOSVer.dwMajorVersion = 5)
 
End Property
 
Public Property Get IsWinNT4() As Boolean
 
  Const VER_PLATFORM_WIN32_NT As Long = 2
  Dim uOSVer                  As OSVERSIONINFO
  uOSVer.dwOSVersionInfoSize = Len(uOSVer)
  GetVersionEx uOSVer
  IsWinNT4 = (uOSVer.dwPlatformID = _
      VER_PLATFORM_WIN32_NT) And _
      (uOSVer.dwMajorVersion = 4)
 
End Property