前に作ったCOMポート一覧取得が、com0comの仮想シリアルポートに無反応なので修正した。
- 内蔵シリアルポート
- Win32_SerialPort、Win32_PnPEntity の両方で見れる
- USB増設シリアルポート
- Win32_PnPEntity にしかいない
- 仮想シリアルポート
- Win32_SerialPort でしかデバイス名を知る手段が無い
com0comで増設した仮想シリアルポートは、デフォルトではCOM*という名前になっていない(CNCA1とかいう名前になる)ので、これも一覧取得できるようにした。
comlist.hta
拡張子 hta で保存する。ダブルクリックすると起動する。 超便利。
<HTML><HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=shift_jis"> <HTA: Application ApplicationName="COMLIST-HTA" > <STYLE> * {margin:1;padding:0;border:0 solid black;} </STYLE> <TITLE>COMポート一覧</TITLE> <SCRIPT LANGUAGE="JSCRIPT"> window.resizeTo(312, 202); // 連想配列をキーでソートして返す関数 function hashsort(obj) { // 連想配列をキーとバリューに分解して、連想配列の配列にする var arr = new Array(); for( var k in obj ){ arr.push( {key:k, value:obj[k]} ); } // キーでソート arr = arr.sort( function(a,b){return a.key > b.key ? 1 : -1;} ); // 元の形の連想配列に戻す var ret = new Object(); for( var i=0; i<arr.length; i++ ){ ret[ arr[i].key ] = arr[i].value; } return ret; } // 内蔵シリアルポートの一覧を連想配列で返す関数 function getcomlist() { var slist = new Object(); // WMI準備 var sw = new ActiveXObject("WbemScripting.SWbemLocator"); var cs = sw.ConnectServer(); // 内蔵シリアルポート一覧取得 for( var e = new Enumerator(cs.ExecQuery("Select * from Win32_SerialPort")); !e.atEnd(); e.moveNext() ){ var a = e.item(); slist[a.DeviceID] = a.Name; } // PnPシリアルポート一覧取得 for( var e = new Enumerator(cs.ExecQuery("Select * from Win32_PnPEntity")); !e.atEnd(); e.moveNext() ){ var a = e.item(); if( a.Name.match(/\((COM\d+)\)/) ) slist[RegExp.$1] = a.Name; } return slist } // 一覧を取得して表示する function main(){ FORM1.TEXTAREA1.value = "取得中・・・"; setTimeout( function(){ var message = ""; var slist = hashsort(getcomlist()); for( var k in slist ){ message += k +":"+ slist[k] + "\n"; } FORM1.TEXTAREA1.value = message; }, 1); } </SCRIPT> </HEAD><BODY SCROLL=no ONLOAD="main();"> <FORM NAME="FORM1" ONSUBMIT="main(); return false;"> <TEXTAREA NAME="TEXTAREA1" COLS=40 ROWS=10 readonly></TEXTAREA><BR> <INPUT TYPE=SUBMIT VALUE="再取得"> </FORM> </BODY> </HTML>