利用できるプリンタ名を取得する - API

印刷時に利用できるプリンタ名を取得し、イミディエイトウィンドウに表示します。

' フラッグの定数
Public Enum PRINTER_ENUM
  PRINTER_ENUM_DEFAULT = &H1
  PRINTER_ENUM_LOCAL = &H2
  PRINTER_ENUM_REMOTE = &H10
  PRINTER_ENUM_SHARED = &H20
  PRINTER_ENUM_NETWORK = &H40
End Enum

' 利用可能なプリンタ名を列挙する関数の宣言
Public Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" _
        (ByVal flags As PRINTER_ENUM, _
         ByVal lpName As String, _
         ByVal Level As Long, _
         pPrinterEnum As Any, _
         ByVal cdBuf As Long, _
         pcbNeeded As Long, _
         pcReturned As Long) As Long

' 指定された文字列の長さを取得する関数の宣言
Public Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" _
        (ByVal lpString As Long) As Long

' ある位置から別の位置にメモリブロックを移動する関数の宣言
Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" _
        (Destination As Any, Source As Any, ByVal Length As Long)

' プリンタ名の識別を定義する構造体
Public Type PRINTER_INFO_1
        flags As Long
        pDescription As Long
        pName As Long
        pComment As Long
End Type

Sub 利用できるプリンタ名を取得する()
    Dim lngPrnLevel As Long
    Dim bytNull As Byte
    Dim bytPrnBuffer() As Byte
    Dim lngPrnNeeded As Long
    Dim lngPrnReturned As Long
    Dim udtInfo1() As PRINTER_INFO_1
    Dim lngPrnCounter As Long
    Dim lngRtnCode As Long
    Dim lngLength As Long
    Dim lngCount As Long
    Dim Printer_Flag As Long
    Dim strPrnName As String
    
' デフォルトプリンター名
' Printer_Flag = PRINTER_ENUM_DEFAULT
' ローカルプリンタ名
    Printer_Flag = PRINTER_ENUM_LOCAL
' レベルを設定 1 = PRINTER_INFO_1
    lngPrnLevel = 1
' バッファのサイズを取得
    lngRtnCode = EnumPrinters(Printer_Flag, _
                              vbNullString, _
                              lngPrnLevel, _
                              ByVal vbNullString, _
                              0, _
                              lngPrnNeeded, _
                              lngPrnReturned)

' バッファを確保
    Const SIZEOF_PI1 = 16
    ReDim udtInfo1(lngPrnNeeded \ SIZEOF_PI1)
    
' ローカルの利用可能なプリンタ名の取得
    lngRtnCode = EnumPrinters(Printer_Flag, _
                              vbNullString, _
                              lngPrnLevel, _
                              udtInfo1(0), _
                              lngPrnNeeded, _
                              lngPrnNeeded, _
                              lngPrnReturned)
    
    If lngRtnCode = 0 Then MsgBox "Err": End
    
    lngCount = lngPrnReturned
' バッファに返された構造体を確保
    
    For lngPrnCounter = 0 To lngCount - 1
' 取得したプリンター名の長さの取得
        lngLength = lstrlen(udtInfo1(lngPrnCounter).pName)
' 文字列型変数の確保
        strPrnName = String(lngLength, vbNullChar)
' プリンタ名を文字列型変数にコピー
        MoveMemory ByVal strPrnName, _
                   ByVal udtInfo1(lngPrnCounter).pName, _
                   lngLength
'プリンター名を表示
        Debug.Print strPrnName
    Next lngPrnCounter
End Sub

APIに関してはさほど詳しくありませんので、説明は省略させていただきます。