2011年09月07日 備忘録
当方は一切保障は致しません。責任も負いません。
ご利用は自己責任でお願いいたします。
勝手な思い込みによる誤記もあるかと思いますがその点はご容赦ください。
東芝(TOSHIBA)ラベルプリンタ TEC B-EV4-T ステータス取得
まずプリンタプロパティを確認します。


ポートは双方向サポートを有効にする



【ツール】【動作】【プリンタコマンド送信】



【プリンタコマンド送信】【{WS|}】【クエリ】



クエリに対するプリンタからの応答


ここまでがドライバ経由のステータス取得です。


いろいろ実験してみました。
Com(RS232c) 通信設定(Com)(b-ev4SettingTool_v017.exe)
設定画面
オープン
コマンド送信({WS|})
受信
クローズ
Lan(Winsok) 通信設定(Lan)(b-ev4SettingTool_v017.exe)
設定画面
接続先ホスト名(IPアドレス)
接続先ポート番号(8000)
メッセージ({WS|})
タイマー(100msec)
受信バイト数(13)
受信データ
上記2点は私が通常USBポートにプリンタが接続してあるので、
別通信手段によるステータス取得です。
しかしマルチポートのプリンタですがコマンドを
受信したポートにアンサーがあるようです。
以下がUSBポートからのステータス取得トライです。
APIによるOpenPrinter
【失敗例】
@r1=OpenPrinter("TEC B-EV4-T",hPrinter,0&)'プリンタのハンドル
    '"USB002"も試しましたが失敗
Ar2=StartDocPrinter(hPrinter,1,MyDocInfo)'印刷スプーラに通知
Br3=WritePrinter(hPrinter, Wbuf(0),UBound(Wbuf)+1,pcWritten)
    'プリンタにデータを書き込むよう印刷スプーラに通知
    'スプーラにたまったのを確認
B_1'r4=EndPagePrinter(hPrinter)
B_2'r5=EndDocPrinter(hPrinter)'スプールが消える
Cr6 = ReadPrinter(hPrinter, VarPtr(Rbuf(0)), 255, pNoBytesRead)
    'プリンタからデータを取得
    'ReadPrinter 関数は、プリンタが双方向でないときはエラーが返る。
    'B_1とB_2を追加するとCでエクセルが強制終了する??
Dr7 = ClosePrinter(hPrinter)
スプーラー経由ではコマンドを送信して
ステータスが取得できないということが分かりました。
的外れな発送でした・・・
レジストリから
ポート名を抽出して
CreateFile
WriteFile
ReadFile
CloseHandle
【検証中 ! 】

印刷中や
スプール中の
確認はしていません。
CreateFileに渡すポート名が"COM1:"や"LPT1:"のように
"TEC B-EV4-T"や"USB002"でオープンできるかと思いきや全く反応せず・・・
そこで Excel HID USB PICのデバイスオープン手続きを見ましたら
\\?\hid#vid_04d8&pid_003c#8&be438f4&0&0000#{4d1e55b2-f16f-11cf-88cb-001111000030}
ずいぶん長い名前ということに気がつきAPIを探しましたが
HHidD_GetHidGuidのように使えそうなgetusbguid的APIが見つかりませんでした。
(HIDの時は簡単に見つかりましたが、今回は検索努力が足りないかも・・・)
(getusbguidをググっていたら英語サイトにはあったようだけどAPIではなさそう?)
そこでレジストリの中を検索していたら##?#hid#vid_04d8&pid_003c・・・を見つけました。
##?#を\\?\に変換してやればよさそうです。
当方動作環境WinXp_SP3 Execel2002_SP3 Win7検証はこちら
参考ソフト009.lzh(20.1 KB)

レジストリ検索.batは
reg queryを使ってaaa.txtへリダイレクトするバッチファイルです。
デバイスマネージャー/USB 印刷サポート/デバイス インスタンス ID


私の環境の場合USBデバイスはVID=08A6(TEC) PID=0051(B-EV4-T)がUSB002のようです。 (補足:参照)
aaa.txtの中身をエディタで USB\VID_08A6&PID_0051\000001を検索してみると
@HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {28d78fad-5a12-11d1-ae5b-0000f803a8c2}\ ##?#USB#Vid_08a6&Pid_0051#000001#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\000001
AHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {a5dcbf10-6530-11d2-901f-00c04fb951ed}\ ##?#USB#Vid_08a6&Pid_0051#000001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\000001
二つ検索できました。

USB\VID_08A6&PID_0051\000001をレジストリ検索するのがプリンタステータス.xlsです。

大文字、小文字対策と
##?#を\\?\に変換しています。
私の環境の場合ポート名が二つ検出できています。
どちらもステータス取得ができています。
理由は良く分かりません。
ご教示願える方よろしくお願いいたします。
レジストリから探すよりもっと良い方法があるかも知れません。
(RegOpenKeyEx RegQueryValueExstr RegCloseKeyは後日の宿題とします。)
またバグ情報や動作レポートなども歓迎です。
hide.oguraあnifty.com
追記:
バッチファイルをVBAのシェルなどを使って埋め込むことも可能と思いますが
中間にテキストファイルがあるとエディターでレジストリ構造を見るのも楽しいです。
(reg queryは読み出しだけだと思うので変更トラブルは無いと思います。)
また埋め込み労力を掛ける必要性も感じていません。
どんなときにレジストリが書き換わりポート名が変わるかどうかで
必要性が変わってくると思います。
補足:
プリンタと FAXのプロパティーからポート名を見つける手順でチョッと補足
ポート(USB002)★をメモしておく。
デバイス マネージャから
USB 印刷サポート


USB 印刷サポート/詳細/バス関係

USBPRINT\TECB-EV4-T\7&2faebd88&1&USB002
これにより目的ポート(★印)であることを確認する。
デバイスマネージャー/USB 印刷サポート/デバイス インスタンス ID
を上記の検索ツールに利用します。
チョッとめんどうな作業がいりますね
これを現在のプリンタから自動で検索するには
エクセルVBAでがんばりましょう!
またUSBデバイス以外にもレジストリには情報がいっぱい詰まっていると思います。
レジストリは便利ですが利用法を間違うとリスクもありますので、
くれぐれも自己責任でご利用ください。

Win7にて検証:2011.09.09
やはり二つのポート名でステータスを取得できました。
その後WinXPに戻したら「新しいハードウェアの検出ウィザード」が発生
今までも良くあることでデバイスドライバーを再インストール
TECさんの説明によればF/Wバージョン(1.0C)が古いので(1.0C)

ファームウェアをバージョンアップすれば解決するそうです。
このお蔭でデバイスマネージャー/USB 印刷サポート/デバイス インスタンス ID
が変わったのでレジストリのポート名も書き換わっていました。

相変わらず二つのポート名でステータスを取得できました。
@AがゴミになってBCが新ポート名のようです。
@HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {28d78fad-5a12-11d1-ae5b-0000f803a8c2}\ ##?#USB#Vid_08a6&Pid_0051#000001#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\000001
AHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {a5dcbf10-6530-11d2-901f-00c04fb951ed}\ ##?#USB#Vid_08a6&Pid_0051#000001#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\000001
BHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {28d78fad-5a12-11d1-ae5b-0000f803a8c2}\ ##?#USB#Vid_08a6&Pid_0051#7&25940551&0&2#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\7&25940551&0&2
CHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\DeviceClasses\ {a5dcbf10-6530-11d2-901f-00c04fb951ed}\ ##?#USB#Vid_08a6&Pid_0051#7&25940551&0&2#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
 DeviceInstance REG_SZ USB\Vid_08a6&Pid_0051\7&25940551&0&2


2011.09.13記
{a5dcbf10-6530-11d2-901f-00c04fb951ed}がUSB印刷サポートのGUIDらしいです。
どうしてレジストリ内にGUIDが2個あるのが分からないです。
2個ともCreateFile関数でオープンして通信しているということは
あまり気にしないことかな・・・
でも{28d78fad-5a12-11d1-ae5b-0000f803a8c2}は気になるな