プリンタの共有を設定・解除          <TOP>


指定したプリンタの共有を設定します。

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

例では、「指定しない」で実行をクリックした場合、「共有←→共有しない」を繰り返します。

 

'================================================================
'= プリンタの共有を設定
'=    (PrinterShared.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 (&HF0000 or &H4 or &H8) '
#define PRINTER_ATTRIBUTE_SHARED &H8    '共有

' プリンタオブジェクトをオープン
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 Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal length&)

' プリンタの詳細な情報を設定
Declare Function Api_SetPrinter& Lib "winspool.drv" Alias "SetPrinterA" (ByVal hPrinter&, ByVal Level&, pPrinter As Any, ByVal Command&)

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

Var Shared Text1 As Object
Var Shared Edit1 As Object
Var Shared Combo1 As Object
Var Shared Button1 As Object

Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14
Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14
Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Combo1.AddString "指定しない"
    Combo1.AddString "指定する"
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var PrinterDeviceName As String
    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

    'プリンタ名を指定
    PrinterDeviceName = Edit1.GetWindowtext

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

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

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

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

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

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

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

    '共有を指定しない
    If Combo1.GetCursel = 0 Then

        '属性との排他的論理和を指定
        pi5.Attributes = pi5.Attributes Xor PRINTER_ATTRIBUTE_SHARED

    '共有を指定する
    Else

        '属性との論理和を指定
        pi5.Attributes = pi5.Attributes Or PRINTER_ATTRIBUTE_SHARED
    End If

    '詳細なプリンタ情報を設定
    Ret = Api_SetPrinter(hPrinter, Level, pi5, 0)

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

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