特定のプリンタにPrinterオブジェクトを割り当てるには?


字音  2003-02-26 23:09:47  No: 77246

お世話になっております。

VBから特定のプリンタで印刷するプログラムを作成しているのですが、
プリンタ名はユーザによって変更可能なため
プリンタドライバ名を検索してあるプリンタドライバ名のプリンタに
Printerオブジェクトを設定しています。
現在は、Microsoft WMI Scripting V1.1 Libraryを使用して
以下のような関数でコーディングしています。
プログラムの起動時に以下の関数を呼び出していますが、
若干起動に時間がかかってしまうため、他の方法を模索しています。
Win32 API のEnumPrintersとか使えそうなのですが、
いまいち使い方がわからずうまくいきません。
良い方法ございましたら、御教授ください。

'引数で指定されたプリンタドライバ名のプリンタにPrinterオブジェクトを設定
Public Function setPrinter(ByVal pstrDriverName As String) As Boolean

    Dim objWMIPrtSet As SWbemObjectSet
    Dim objWMIPrt As SWbemObject
    Dim objPrinter As Printer
    
    Set objWMIPrtSet = GetObject("winmgmts:").InstancesOf("Win32_Printer")
    For Each objWMIPrt In objWMIPrtSet
        If objWMIPrt.Properties_("DriverName") = pstrDriverName Then
            For Each objPrinter In Printers
                If objWMIPrt.Properties_("Caption") = objPrinter.DeviceName Then
                    Set Printer = objPrinter
                    Set objWMIPrtSet = Nothing
                    Set objWMIPrt = Nothing
                    Set objPrinter = Nothing
                    setPrinter = True
                    Exit Function
                End If
            Next
        End If
    Next

    Set objWMIPrtSet = Nothing
    Set objWMIPrt = Nothing
    Set objPrinter = Nothing

    setPrinter = False

End Function


とおりすがり  2003-02-27 00:44:30  No: 77247

現在作成中のサイトですが、参考にできると思われるサンプルコードを用意しました。
http://www.takonet.co.jp/~pegasus/  …  非公開です。
でプリンタ関連クラスをダウンロードしてみてください。


字音  2003-02-27 23:36:50  No: 77248

とおりすがりさんレスありがとうございます。

サンプルコードいただきましたありがとうございました。
しかし、今回の問題点としましては、
DriverNameで取得される値は"winspool"という値でプリンタを
特定する情報ではありません。
そのため、Microsoft WMI Scripting V1.1 Library を使用して
プリンタのプロパティにある詳細設定タブの中のドライバで
表示されている値を取得して特定のプリンタがセットアップされて
いるかを確認しています。

しかし、このWMI Scriptingを使うと実行速度が低下したため
Win32 API等使用しパフォーマンスを上げる方法を模索しています。

EnumPrintersとかを使えばできそうな気がするのですが、
使用されたことがある方等いましたら御教授願います。


字音  2003-02-27 23:48:38  No: 77249

先程の追記です。
頂いたクラスのメソッドsetPrintにはプリンタ名で渡すということですが、
これだとプリンタ名はユーザによって変更可能なため、
特定できません。
ということでプリンタドライバ名での指定方法としているのですが、
何か良い方法はないのでしょうか?


とおりすがり  2003-02-28 01:11:29  No: 77250

一度、マシンにインストールしているプリンタを列挙し、配列に格納しています。
また、setPrintは配列番号でもプリンタを変更する事が出来ます。
その上、ユーザーがプリンタ名を変更しても、プログラム実行中にプリンタ名を変更しない限り、プリンタを特定する事は可能です。


とおりすがり  2003-02-28 01:24:23  No: 77251

ちなみに、このクラスを作成した理由は、ドットプリンタを使用する時にたいていのマシンでは、レーザーかインクジェットが規定プリンタになっているはずなので、プログラム起動の時にはドットプリンタを使えるように設定し、プログラム終了の時には起動前の状態に戻せる様にする機能が欲しかったので作成しました。

以前はその機能を使う為に「Microsoft WMI Scripting V1.1 Library」を使っていました…


字音  2003-02-28 04:59:16  No: 77252

すみません、説明不足ですかね。

例えば"Acrobat Distiller"のような仮想プリンタドライバをインストール
すると、デフォルトのプリンタ名は"Acrobat Distiller"になります。
しかし、このプリンタ名はコンパネから変更可能なためプログラム実行時に
"Acrobat Distiller"というプリンタを検索したのでは
プリンタが正しくセットアップされている確証にはならないわけです。
頂いたサンプルコードでは、クラスの初期化処理でプリンタ情報を取得されて
いますが、これはプリンタ名(変更可能)を取得されているため、
プログラム実行時に"Acrobat Distiller"でsetPrinterを実行しても
セットされない可能性があります。
プログラム側で正しく"Acrobat Distiller"がセットアップされているか
確認するには、変更不可能なプリンタドライバ名(レジストリ等いじれば変更可)
でチェックしてやるのが良いのではないかと思います。
そのため、「Microsoft WMI Scripting V1.1 Library」を使用して
固定のプリンタドライバ名を使用するプリンタをPrinterオブジェクトにセット
するというのが、最初に記述した関数の目的です。
しかしこの方法では、「Microsoft WMI Scripting V1.1 Library」を使うこと
により起動時に多少時間がかかってしまうためAPI等使用して解決しようと考えました。
そういったことは可能でしょうか?


とおりすがり  2003-02-28 18:39:44  No: 77253

とりあえず、仕事の合間に改造を試みてみます。
ちなみに「EnumPrinters」については、超〜〜〜有名なサイトに載っています。
http://www.kumei.ne.jp/c_lang/sdk/sdk_79.htm


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加