HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0531
DoubleQuoteデバイスマネージャの項目をHSPで取得したい11解決


DoubleQuote

リンク

2008/5/31(Sat) 00:59:23|NO.16329

RS-232CでDVDデッキを制御したい
http://hsp.tv/play/pforum.php?mode=all&num=15980
プロジェクタをRS-232Cで動作させたい
http://hsp.tv/play/pforum.php?mode=all&num=16130

↑こちらにおいて質問させて頂いたDoubleQuoteと申します。
質問した際に、たくさんの役立つ助言、ありがとうございました。

最後の問題として、ポート番号の取得なのですが、
私は今、I-OdataのUSB-RSAQ2を使っており、これをポートに接続すると
マイコンピュータのプロパティ、デバイスマネージャからポート(COM と LPT)の中の
通信ポート(COM*)部分に先ほどの型番であるUSB-RSAQ2が表示されます。
ここの項目の通信ポート(COM*)部分の項目をHSPで取得する方法はありますか?
もしあればご教授願います。よろしくお願いします。



この記事に返信する


GENKI

リンク

2008/5/31(Sat) 02:07:51|NO.16330

眠いので今はひとまず関係ありそうなサイトだけメモ代わりに…。
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=444653&SiteID=7
http://okwave.jp/qa1555000.html



inovia

リンク

2008/5/31(Sat) 06:58:05|NO.16332

レジストリの
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
にデバイス名が列挙されていますね〜。
これを取得するのもありかと。



GENKI

リンク

2008/5/31(Sat) 13:01:19|NO.16333

すみませんpowercfgを使った方法はUSB-RSAQ2が何番のCOMポートになっているかわからないですね。
APIのGetCommProperties関数を使えばよさそうなのですが、チャレンジしてみましたが勉強不足でよくわかりませんでした。orz
あとはinoviaさんが言っているレジストリからUSB-RSAQ2探して何番になっているか取得する方法でしょうか。しかし私はレジストリ方面はさっぱりなのでお手上げです。
お役に立てずすいません。



DoubleQuote

リンク

2008/6/6(Fri) 02:28:46|NO.16449

GENKIさん、色々と調べてもらっているようで、いつもありがとうございます。

http://okwave.jp/qa1555000.html
こちらに書いてある

powercfg /devicequery all_devices

こちらのコマンド、これの実行結果に欲しい情報が表示されていますね。
この実行結果をhspから取得する方法はありますか?
こちらでももう少し調べてみたいと思います。

>GetCommProperties関数を使えばよさそうなのですが、・・・
この関数を使えるようになると、どのような情報が取得できるようになるのですか?


inoviaさん、ありがとうございます。
>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum
確かにこちらにデバイスが書いてありますね。ですが、COMポート関係の情報、ポート番号が
この中のどこに書いてあるのかわかりませんでした。
この中のどこにあるのでしょうか?



flory

リンク

2008/6/6(Fri) 18:27:45|NO.16460

自分もこの方面には詳しくないですが……。

>>GetCommProperties関数を使えばよさそうなのですが、・・・
>この関数を使えるようになると、どのような情報が取得できるようになるのですか?
この関数はポートハンドルからデバイスの情報を取得します。
最大送信/受信バッファサイズ、最大通信速度、通信方式などがわかります。
しかし、ポートハンドルはポート番号から取得するので、
このような情報はCOMポート番号が分かって初めて取得できるわけです。
ポート番号を取得するには本末転倒かと。
どのみち、GetCommProperties関数ではデバイス名は取得できませんし。


>COMポート関係の情報、ポート番号がこの中のどこに書いてあるのかわかりませんでした。
>この中のどこにあるのでしょうか?
COMポート番号が列挙されているのは
HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM

というキーの中です。 とりあえず、このキーの値を取得するスクリプトを置いておきますね。
#uselib	"advapi32.dll"
#func	RegOpenKeyEx	"RegOpenKeyExA"		int, sptr, nullptr, int, int
#func	RegQueryInfoKey	"RegQueryInfoKeyA"	int, int, int, nullptr, int, int, int, int, int, int, int, int
#func	RegEnumValue	"RegEnumValueA"		int, int, int, int, nullptr, int, int, int
#func	RegCloseKey		"RegCloseKey"		int

#define HKEY_LOCAL_MACHINE	$80000002	; 定義済みキー
#define KEY_QUERY_VALUE		$00000001	; KEY_QUERY_VALUEアクセス権
#define ERROR_NO_MORE_ITEMS	$00000103	; ERROR_NO_MORE_ITEMSエラー


	RegOpenKeyEx HKEY_LOCAL_MACHINE, "HARDWARE\\DEVICEMAP\\SERIALCOMM", KEY_QUERY_VALUE, varptr(hKey)
	if stat : mes "レジストリキーのオープンに失敗しました" : stop

	dim cValues				; レジストリエントリの値の数
	dim cMaxValueNameLen	; レジストリエントリの名前の最大長
	dim cMaxValueLen		; レジストリエントリの値の最大サイズ
	RegQueryInfoKey hKey, 0, 0, 0, 0, 0, varptr(cValues), varptr(cMaxValueNameLen), varptr(cMaxValueLen), 0, 0
	if stat : mes "レジストリキー情報の取得に失敗しました" : goto *onCloseKey

	sdim ValueName, cMaxValueNameLen + 1	; レジストリエントリの名前を格納する変数を確保
	sdim Value, cMaxValueLen + 1	; レジストリエントリの値を格納する変数を確保
	repeat
	ValueNameLen = cMaxValueNameLen + 1
	ValueLen = cMaxValueLen + 1
	RegEnumValue hKey, cnt, varptr(ValueName), varptr(ValueNameLen), 0, varptr(Value), varptr(ValueLen)	; レジストリエントリを列挙
	if stat = ERROR_NO_MORE_ITEMS : break	; 戻り値がERROR_NO_MORE_ITEMSならすべて列挙し終わったことを意味する
	if stat : mes "レジストリの値の読み込みに失敗しました" : goto *onCloseKey
	mes ValueName + "(" + Value + ")"	; 変数ValueNameにデバイス名の略記が、変数ValueにCOMポート番号が格納されている
	wait 1
	loop

	mes "終了"

*onCloseKey
	RegCloseKey hKey	; キーハンドルをオープンしたら、最後にクローズする
	stop

正確なデバイス名を取得できないのが心苦しいですが……。すいません。

APIの詳しい仕様などはMSDNやちょくとのページを見てください。



flory

リンク

2008/6/6(Fri) 18:36:33|NO.16462

連投失礼します。

上のスクリプトの変数cValuesは結局使ってませんね。。。
dim cValues と varptr(cValues) は消してください。



GENKI

リンク

2008/6/6(Fri) 20:28:36|NO.16464

> この実行結果をhspから取得する方法はありますか?

いろいろ考えなくていい方法をひとつ。コマンドプロンプトで、

powercfg /devicequery all_devices > output.txt
と入力してください。カレントディレクトリにoutput.txtというテキストファイルが出力されます。
実行結果はこのoutput.txtに出力されます。
あとはメモリノートパッド命令を使ってください。

このほかの方法としては、さくらさんのところにコマンドプロンプトでの実行結果を取得するようなモジュールがあったと思います。



> どのみち、GetCommProperties関数ではデバイス名は取得できませんし。

むう。そうなのですか。
すみません余計な事言って混乱させてしまいました。



DoubleQuote

リンク

2008/6/8(Sun) 21:34:22|NO.16583

返信が遅くなり、申し訳ありません。

floryさん、GENKIさん。ありがとうございます。


floryさん
サンプル提供ありがとうございます。
今現在、実行する環境に居ないので明日移行実験してみたいと思います。
僕が使っているUSB-RSAQ2というIO-dataから発売されていた変換コネクターを使うと
デバイスマネージャに表示されます。その文字列があるということを判断に使おうと
思っています。この"USB-RSAQ2"がこのスクリプトで取得できるのかやってみたいと
思います。

もし、不可能でしたらGENKIさんが教えてくれたコマンドプロンプトからの取得で
行きたいと思います。

GENKIさんの情報を元に作ってみたモノ。


#include "hspext.as" #define COMPORTNAME "(USBtoRS232C)" // あいまいなので確認が必要 *getportnumber randomize sdim fname : fname = "devicelist"+rnd(256)+".txt" sdim cmddata : cmddata = "powercfg /devicequery all_devices > " + fname notesel cmddata notesave "getdevice.bat" wait 10 repeat if ( cnt >= 10000000 ) : dialog "ERROR(1).もう一度起動しなおしてください。" : end exist "getdevice.bat" if ( strsize > 0 ) : break await loop exec "getdevice.bat" wait 10 repeat ,4 if ( cnt >= 10000000 ) : dialog "ERROR(2).もう一度起動しなおしてください。" : end exist fname if ( strsize > 0 ) : break await loop sdim devicedata noteunsel notesel devicedata noteload fname wait 10 : delete fname wait 10 : delete "getdevice.bat" getstr a,devicedata,instr(devicedata,0,COMPORTNAME) if ( strsize == 0 ) : dialog "RS-232CコネクタがPCに接続されていません。接続を確認して再度起動してください。\n終了します。" : end // a = "aaaazzzzzzzz(COM689)" comport = int(strmid(a,instr(a,0,"COM")+3,instr(a,instr(a,0,"COM")+1,")")-2)) noteunsel comopen comport,"baud=9600 parity=N data=8 stop=1" comclose
確認し次第返答いたします。



DoubleQuote

リンク

2008/6/15(Sun) 02:16:26|NO.16736

かなり遅くなってしまいましたが報告させて頂きます。

flory様が提供して頂いた、レジストリから取得する方法ですが、
肝心のデバイス名が取得する事が出来なかったので、
GENKI様が提供して頂いたpowercfgを用いる方を採用させて頂きました。


しかしながら、なぜか導入先のPCがpowercfg.exeが存在せず、コマンドラインなどから
実行しても何も結果が出ませんでした。
なので他機のパソコンよりコピーして導入しました。

このようにpowercfg.exeが存在しないような事はあるのでしょうか?
もしあるのであれば同梱も考えているのですが・・・



GENKI

リンク

2008/6/15(Sun) 21:26:45|NO.16761

Powercfg.exeはXPsp2以降かServer2003以降にしか入っていないようですね。
2000でも動くこともあるようですが入っていないようです。
http://support.microsoft.com/kb/888742/ja

同胞する場合はライセンスに問題がないか注意する必要があります。



DoubleQuote

リンク

2008/6/16(Mon) 00:15:28|NO.16765

なるほど、わかりました!!


長い間本当にありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.