揮発性のメモ2

http://d.hatena.ne.jp/iww/

COMポート一覧取得

前に作った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>

htaが実行できないとき

DOS窓とかで次を実行する

mshta.exe /register