プリンタドライバ環境ファイルパス名を取得 <TOP>
OpenPrinter プリンタオブジェクトをオープン EnumPrinters 使用可能なプリンタ・プリントサーバーなどを列挙 SHInvokePrinterCommand プリンタのプロパティ取得等のコマンドを実行 DeviceCapabilities プリンタデバイスドライバの能力を取得 GetPrinterDriver プリンタのドライバ情報を取得 MoveMemory メモリの指定領域をコピー lstrcpy 文字列をコピー ClosePrinter プリンタオブジェクトを閉じる
'================================================================ '= プリンタドライバ環境ファイルパス名を取得 '= (PrtDriverConfigFile.bas) '================================================================ #include "Windows.bi" Type PRINTER_DEFAULTS pDatatype As Long pDevMode As Long DesiredAccess As Long End Type Type DRIVER_INFO_2 cVersion As Long pName As Long pEnvironment As Long pDriverPath As Long pDataFile As Long pConfigFile As Long End Type Type PRINTER_INFO_5 pDeviceName As Long pPortName As Long Attributes As Long DeviceNotSelectedTimeOut As Long TransmissionColorDeviceryTimeOut 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_ENUM_DEFAULT &H1 'デフォルトのプリンタに関する情報を列挙 #define PRINTER_ENUM_LOCAL &H2 'Nameの設定を無視して、ローカルプリンタを列挙 #define PRINTER_ENUM_NAME &H8 'Nameで指定されたプリンタを列挙 #define PRINTER_ENUM_SHARED &H20 '共有属性を持つプリンタを列挙 #define MAX_DEVICENAME 64 #define DC_COLORDEVICE 32 ' プリンタオブジェクトをオープン Declare Function Api_OpenPrinter& Lib "winspool.drv" Alias "OpenPrinterA" (ByVal pDeviceName$, phPrinter&, pDefault As Any) ' 使用可能なプリンタ・プリントサーバーなどを列挙する Declare Function Api_EnumPrinters& Lib "winspool.drv" Alias "EnumPrintersA" (ByVal Flags&, ByVal Name$, ByVal Level&, pPrinterEnum As Any, ByVal cbBuf&, pcbNeeded&, pcReturned&) ' プリンタのプロパティ取得等のコマンドを実行 Declare Function Api_SHInvokePrinterCommand& Lib "Shell32" Alias "SHInvokePrinterCommandA" (ByVal hWnd&, ByVal uAction&, ByVal lpBuf1$, ByVal lpBuf2$, ByVal fModal&) ' プリンタデバイスドライバの能力を取得 Declare Function Api_DeviceCapabilities& Lib "winspool.drv" Alias "DeviceCapabilitiesA" (ByVal lpDeviceName$, ByVal lpPort$, ByVal iIndex&, lpOutput As Any, lpDevMode As Any) ' プリンタのドライバ情報を取得 Declare Function Api_GetPrinterDriver& Lib "winspool.drv" Alias "GetPrinterDriverA" (ByVal hPrinter&, ByVal pEnvironment$, ByVal Level&, pDriverInfo As Any, ByVal cdBuf&, pcbNeeded&) ' メモリの指定領域をコピー Declare Sub MoveMemory Lib "Kernel32" Alias "RtlMoveMemory" (Dest As Any, Source As Any, ByVal Length&) ' 文字列をコピーする Declare Function Api_lstrcpy& Lib "Kernel32" Alias "lstrcpy" (lpszString1 As Any, lpszString2 As Any) ' プリンタオブジェクトを閉じる Declare Function Api_ClosePrinter& Lib "winspool.drv" Alias "ClosePrinter" (ByVal hPrinter&) Var Shared Text(2) As Object Var Shared Combo1 As Object Var Shared Edit1 As Object Var Shared Button1 As Object For i = 0 To 1 Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) Text(i).SetFontSize 14 Next Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 12 Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14 Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 Var Shared DeviceName 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 ColorDevice As Long 'ローカルプリンタから検索 PrintServer = "" 'PRINTER_INFO_5構造体を受け取る Level = 5 'バッファに必要なバイト数を調べる ColorDevice = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Chr$(0), 0, Needed, Returned) If Needed = 0 Then End '全プリンタ情報を得る Var Buffer(Needed - 1) As byte ColorDevice = Api_EnumPrinters(PRINTER_ENUM_NAME, PrintServer, Level, Buffer(0), Needed, Needed, Returned) '構造体リストの準備 Var PI_5(Returned - 1) As PRINTER_INFO_5 For CT = 0 To Returned - 1 'バッファから構造体1つ分を抜き取る MoveMemory PI_5(CT), Buffer(CT * Len(PI_5(CT))), Len(PI_5(CT)) 'プリンタ名を得る DeviceName = String$(MAX_DEVICENAME, Chr$(0)) MoveMemory DeviceName, ByVal PI_5(CT).pDeviceName, Len(DeviceName) DeviceName = KLeft$(DeviceName, KInStr(1, DeviceName, Chr$(0)) - 1) Combo1.AddString DeviceName Next 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 di2 As DRIVER_INFO_2 Var ConfigFile As String * 516 Var Ret As Long DeviceName = Combo1.GetWindowText If DeviceName = "" Then A% = MessageBox(GetWindowtext, "プリンタ名を指定してください!", 0, 2) Exit Sub End If 'プリンタアクセス権を指定 pd.DesiredAccess = PRINTER_ALL_ACCESS 'プリンタのオブジェクトハンドルを取得 Ret = Api_OpenPrinter(DeviceName, hPrinter, pd) '構造体のレベルを指定 Level = 2 'バッファに必要なサイズを取得 Ret = Api_GetPrinterDriver(hPrinter, ByVal 0, Level, ByVal 0, 0, Needed) 'バッファを確保 Var Buffer(Needed - 1) 'プリンタのドライバ情報を取得 Ret = Api_GetPrinterDriver(hPrinter, ByVal 0, Level, Buffer(0), Needed, Needed) '取得したプリンタのドライバ情報を構造体へ移動 MoveMemory di2, Buffer(0), Len(di2) 'ドライバ環境ファイルパス名を表示 'ドライバ環境ファイルパス名を複写 Ret = Api_lstrcpy(ConfigFile, ByVal di2.pConfigFile) 'ドライバ環境ファイルパス名を切り出し Edit1.SetWindowText Left$(ConfigFile, InStr(ConfigFile, Chr$(0)) - 1) 'プリンタオブジェクトをクローズ Ret = Api_ClosePrinter(hPrinter) End Sub '================================================================ '= '================================================================ Declare Sub Combo1_Click edecl () Sub Combo1_Click() Edit1.SetWindowText "" End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End