お世話になります。
VB6で作成した印刷処理で、プリンタ名が正常に取得出来ず困っております。
どなたか、ご存じの方がいらっしゃいましたら、ご教授頂ければと思います。
フォームにリストボックスを設置し、画面を開いた際に
PrintersObjectを使用して、Printers.Count分ループさせて
全てのDeviceNameを、リストボックスに追加しており
印刷に使用するプリンタを、リストボックスから選択する
仕組みにしております。
問題の現象としては、コントロールパネルから削除されている
プリンタ名も取得されてしまい、現在のコントロールパネル上の
プリンタ情報と一致出来ないものかと頭を悩ませております。
PrintersObjectの情報というのは、OS上のメモリやレジストリ(?)等に
残ってしまっている情報となるのでしょうか?
可能であればVB6のプログラム上で、PrintersObjectの情報を
現在インストールされているプリンタ情報のみに更新(というのでしょうか?)
する事が出来れば一番良いと思ってはいるのですが。。。
他の方法等も含めご存じの方がおられましたら、ご教授頂けると幸いです。
WinXP(SP3),VB6.0(SP6) の環境で、3パターンほど試しましたが、特に不具合は出ないですね。
OS や VB6 のサービスパックの状態は?
' Index で列挙
Private Sub Command1_Click()
Dim i As Long
With List1
.Clear
For i = 0 To Printers.Count - 1
.AddItem Printers(i).DeviceName
Next
End With
End Sub
' For Each で列挙
Private Sub Command2_Click()
Dim p As Printer
With List1
.Clear
For Each p In Printers
.AddItem p.DeviceName
Next
End With
End Sub
' WMI で列挙
Private Sub Command3_Click()
Dim wmi, svc, ps, p
Set wmi = CreateObject("WbemScripting.SWbemLocator")
Set svc = wmi.ConnectServer
Set ps = svc.ExecQuery("Select * From Win32_Printer")
With List1
.Clear
For Each p In ps
.AddItem p.Caption
Next
End With
End Sub
Koz様
レスありがとうございます。
処理の組み方としては、記載頂いたサンプルの
INDEX列挙の手法で行っております。
利用の環境については、TSWeb環境を使用しており
アプリケーションを利用する際に、端末のプリンタを
リダイレクトしているのですが、以前接続時のリダイレクトプリンタが
「プリンタ名(リダイレクトされた XX)」と残ってしまっており
現状100個近く同名のプリンタが、Printersオブジェクトより
取得されてきてしまっている状態です。
ただ、私の方で類似の検証環境を構築して確認を行っておりますが
WANを挟んでいないからなのか、再現が出来ておらず環境に依存した
現象では無いかと調査を行っております。
参考までに現象の発生している環境構成は以下の通りです。
開発環境:WinXP VB6.0 sp6
利用環境:Win2008Server(TSWeb構成)+端末はWinXP
環境的な要因となると、VB6の問題では無いやもしれませんが
原因の解明が出来ましたら、また報告させて頂きます。
TSWeb・・・ターミナルサービスですネ?
であれば、お使いのプリンターメーカーのドライバーに
不具合があるため、そのような挙動になってしまってい
るものと推測します。
NECやキャノンや・・・いろいろ大トラブルがあり、
私も遭遇したことあります。
サービスパックや最新のドライバーやら、いろいろご確
認下さい。多分、メーカーが対応しない限り無理だと思
います。
※ プリンターのメーカーや型式は?
あと、ただ単にTSWebだけですか?
CITRIXのとか使ってません?
以上。参考まで
こんな記事もありました
http://d.hatena.ne.jp/Tensor/20090829/1251648856
参考までに
以上。
とりあえず、
ttp://support.microsoft.com/kb/2620656/ja
とかはどうでしょう。
ツイート | ![]() |