プリンタの双方向通信を判定する <TOP>
OpenPrinter
プリンタオブジェクトをオープン
GetPrinter
プリンタの詳細な情報を取得
EnumPrinters
使用可能なプリンタ・プリントサーバーなどを列挙
MoveMemory
メモリの指定領域をコピー
ClosePrinter
プリンタオブジェクトを閉じる
PRINTER_ATTRIBUTE_ENABLE_BIDI(&H800) 双方向通信
'================================================================ '= プリンタの双方向通信を判定する '= (PrinterAttributeEnableBidi.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_ENABLE_BIDI &H800 '双方向通信 #define PRINTER_ENUM_DEFAULT &H1 'デフォルトのプリンタに関する情報を列挙 #define PRINTER_ENUM_LOCAL &H2 'Nameの設定を無視して、ローカルプリンタを列挙 #define PRINTER_ENUM_NAME &H8 'Nameで指定されたプリンタを列挙 #define PRINTER_ENUM_SHARED &H20 '共有属性を持つプリンタを列挙 #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_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeededed&, pcReturned&) ' メモリの指定領域をコピー Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Length&) ' プリンタオブジェクトを閉じる Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&) Var Shared Text1 As Object Var Shared Combo1 As Object Var Shared Button1 As Object Text1.Attach GetDlgItem("Text1") : Text1.SetFontSize 14 Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Var Shared PrinterName As String '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var PrintServer As String Var Needed As Long Var Returned As Long Var Level As Long Var CT As Long Var Ret As Long 'ローカルプリンタから検索 PrintServer = "" 'PRINTER_INFO_5構造体を受け取る Level = 5 'バッファに必要なバイト数を調べる Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Needed, Returned) If Needed = 0 Then End '全プリンタ情報を得る Var Buffer(Needed - 1) As Byte Ret = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Needed, Needed, Returned) '構造体リストの準備 Var pi5(Returned - 1) As PRINTER_INFO_5 For CT = 0 To Returned - 1 'バッファから構造体1つ分を抜き取る MoveMemory pi5(CT), Buffer(CT * Len(pi5(CT))), Len(pi5(CT)) 'プリンタ名を得る PrinterName = String$(MAX_DEVICENAME, Chr$(0)) MoveMemory PrinterName, ByVal pi5(CT).pPrinterName, Len(PrinterName) PrinterName = KLeft$(PrinterName, kInStr(1, PrinterName, Chr$(0)) - 1) Combo1.AddString PrinterName Next End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var pd As PRINTER_DEFAULTS Var pi5 As PRINTER_INFO_5 Var PrinterHandle As Long Var Level As Long Var Needed As Long Var Ret As Long Text1.SetWindowtext "" 'プリンタ名を指定 PrinterName = Combo1.GetWindowText 'プリンタアクセス権を指定 pd.DesiredAccess = PRINTER_ALL_ACCESS 'プリンタのオブジェクトハンドルを取得 Ret = Api_OpenPrinter(PrinterName, PrinterHandle, pd) '構造体のレベルを指定 Level = 5 'バッファに必要なサイズを取得 Ret = Api_GetPrinter(PrinterHandle, Level, ByVal 0, 0, Needed) 'バッファを確保 Var Buffer(Needed - 1) '詳細なプリンタ情報を取得 Ret = Api_GetPrinter(PrinterHandle, Level, Buffer(0), Needed, Needed) '取得した詳細なプリンタ情報を構造体へ移動 MoveMemory pi5, Buffer(0), Len(pi5) '双方向通信を表示 '指定されているとき If pi5.Attributes And PRINTER_ATTRIBUTE_ENABLE_BIDI Then Text1.SetWindowText "指定されています。" '指定されていないとき Else Text1.SetWindowText "指定されていません。" End If 'プリンタオブジェクトをクローズ Ret = Api_ClosePrinter(PrinterHandle) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End