お世話になっております。
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
現在作成中のサイトですが、参考にできると思われるサンプルコードを用意しました。
http://www.takonet.co.jp/~pegasus/ … 非公開です。
でプリンタ関連クラスをダウンロードしてみてください。
とおりすがりさんレスありがとうございます。
サンプルコードいただきましたありがとうございました。
しかし、今回の問題点としましては、
DriverNameで取得される値は"winspool"という値でプリンタを
特定する情報ではありません。
そのため、Microsoft WMI Scripting V1.1 Library を使用して
プリンタのプロパティにある詳細設定タブの中のドライバで
表示されている値を取得して特定のプリンタがセットアップされて
いるかを確認しています。
しかし、このWMI Scriptingを使うと実行速度が低下したため
Win32 API等使用しパフォーマンスを上げる方法を模索しています。
EnumPrintersとかを使えばできそうな気がするのですが、
使用されたことがある方等いましたら御教授願います。
先程の追記です。
頂いたクラスのメソッドsetPrintにはプリンタ名で渡すということですが、
これだとプリンタ名はユーザによって変更可能なため、
特定できません。
ということでプリンタドライバ名での指定方法としているのですが、
何か良い方法はないのでしょうか?
一度、マシンにインストールしているプリンタを列挙し、配列に格納しています。
また、setPrintは配列番号でもプリンタを変更する事が出来ます。
その上、ユーザーがプリンタ名を変更しても、プログラム実行中にプリンタ名を変更しない限り、プリンタを特定する事は可能です。
ちなみに、このクラスを作成した理由は、ドットプリンタを使用する時にたいていのマシンでは、レーザーかインクジェットが規定プリンタになっているはずなので、プログラム起動の時にはドットプリンタを使えるように設定し、プログラム終了の時には起動前の状態に戻せる様にする機能が欲しかったので作成しました。
以前はその機能を使う為に「Microsoft WMI Scripting V1.1 Library」を使っていました…
すみません、説明不足ですかね。
例えば"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等使用して解決しようと考えました。
そういったことは可能でしょうか?
とりあえず、仕事の合間に改造を試みてみます。
ちなみに「EnumPrinters」については、超〜〜〜有名なサイトに載っています。
http://www.kumei.ne.jp/c_lang/sdk/sdk_79.htm
ツイート | ![]() |