プリンタのネットワークローカルを判定          <TOP>


OpenPrinter プリンタオブジェクトをオープン
GetPrinter プリンタの詳細な情報を取得
ClosePrinter プリンタオブジェクトを閉じる
CopyMemory メモリの指定領域をコピー
 

 

'================================================================
'= プリンタのネットワークローカルを判定
'=    (GetPrinter2.bas)
'================================================================
#include "Windows.bi"

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

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

#define STANDARD_RIGHTS_REQUIRED &HF0000 '標準的な権利を要求することを示す定数
#define PRINTER_ACCESS_ADMINISTER &H4    'プリンタアクセス権の管理者権限を示す定数の宣言
#define PRINTER_ACCESS_USE &H8           'プリンタアクセス権のユーザー権限を示す定数の宣言
#define PRINTER_ALL_ACCESS &HF000C       '
#define PRINTER_ATTRIBUTE_NETWORK &H10   'ネットワーク
#define PRINTER_ATTRIBUTE_LOCAL &H40     'ローカル
#define PRINTER_ENUM_NAME &H8            'Nameで指定されたプリンタを列挙
#define MAX_DEVICENAME 64                '

' プリンタオブジェクトをオープン
Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pPrinterName$, phPrinter&, pDefault As Any)

' プリンタの詳細な情報を取得
Declare Function Api_GetPrinter& Lib "winspool.drv" Alias "GetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal cbBuf&, pcbNeeded&)

' プリンタオブジェクトを閉じる
Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&)

' メモリの指定領域をコピー
Declare Sub CopyMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&)

Var Shared Text1 As Object
Var Shared Text2 As Object
Var Shared Button1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Text2.Attach GetDlgItem("Text2") : Text2.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

Var Shared PrinterDevName As String

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    'プリンタ名を指定
    PrinterDevName = "KONICA MINOLTA magicolor 2400W"
    Text1.SetWindowText PrinterDevName
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var pd As PRINTER_DEFAULTS
    Var hPrinter As Long
    Var Level As Long
    Var Needed As Long
    Var pi5 As PRINTER_INFO_5
    Var Ret   As Long

    'プリンタアクセス権を指定
    pd.DesiredAccess = PRINTER_ALL_ACCESS

    'プリンタのオブジェクトハンドルを取得
    Ret = Api_OpenPrinter(PrinterDevName, hPrinter, pd)

    '構造体のレベルを指定
    Level = 5

    'バッファに必要なサイズを取得
    Ret = Api_GetPrinter(hPrinter, Level, ByVal 0, 0, Needed)

    'バッファを確保
    Var Buffer(Needed - 1) As Byte

    '詳細なプリンタ情報を取得
    Ret = Api_GetPrinter(hPrinter, Level, Buffer(0), Needed, Needed)

    '取得した詳細なプリンタ情報を構造体へ移動
    CopyMemory pi5, Buffer(0), Len(pi5)

    'ネットワークの場合
    If pi5.Attributes And PRINTER_ATTRIBUTE_NETWORK Then
        Text2.SetWindowtext "ネットワークです。"

    'ローカルの場合
    Else If pi5.Attributes And PRINTER_ATTRIBUTE_LOCAL Then
        Text2.SetWindowtext "ローカルです。"

    'その他の場合
    Else
        Text2.SetWindowtext "判定できません。"
    End If

    'プリンタオブジェクトをクローズ
    Ret = Api_ClosePrinter(hPrinter)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End