自分もこの方面には詳しくないですが……。
>>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やちょくとのページを見てください。