|
印刷時に利用できるプリンタ名を取得し、イミディエイトウィンドウに表示します。
' フラッグの定数
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に関してはさほど詳しくありませんので、説明は省略させていただきます。 |