プリンタドライバ環境ファイルパス名を取得          <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