プリンタの共有を設定・解除 <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