Archive for 5月 15th, 2012

  1. Hello, COM(JScript) World!

    Posted on 5月 15th, 2012 by cx20

    COM(JScript)

    COM(Component Object Model)はマイクロソフトの提唱するプログラム部品の仕様である。
    COM を用いて開発された部品であれば言語を問わず利用することができる。
    以下は JScript による COM クライアント(実行時バインディング)の例となっている。

    ソースコード

    var ssfWINDOWS = 36
     
    main();
     
    function main() {
        var shell = new ActiveXObject("Shell.Application");
        var folder = shell.BrowseForFolder( 0, "Hello, COM(JScript) World!", 0, ssfWINDOWS );
    }

    VBScript であれば Nothing を代入した時点でメモリが解放されるが、JScript では null を代入してもメモリは解放されず(厳密には、Nothing 値と null 値は別物である)、ガベージコレクションが行われたタイミングで解放される。
    以下は、上記の違いを表にまとめたものである。

    JScript VBScript VarType VarType値 内容
    undefined Empty vbEmpty 0 Empty 値 (未初期化)
    null Null vbNull 1 Null 値 (無効な値)
    Nothing vbObject 9 オートメーション オブジェクト

    WSH をホストとする JScript の実行であれば、プロセス終了時にメモリ解放されるが、HTA や IE をホストとした場合、メモリが解放されず問題になることがある。
    この場合、CollectGarbage メソッドを呼び出すことで強制的にガベージ コレクションを行うことは可能であるが、このメソッドは非公開メソッド(ヘルプに記載されていない)であり、利用は推奨されていない。
    別の回避方法としては、Nothing でメモリが解放できる VBScript を使用することが推奨されている。

    実行方法

    C:¥> CScript hello.js

    実行結果

    +----------------------------------------+
    |Browse For Folder                    [X]|
    +----------------------------------------+
    | Hello, COM(JScript) Wolrd!             |
    |                                        |
    | +------------------------------------+ |
    | |[Windows]                           | |
    | | +[addins]                          | |
    | | +[AppCompat]                       | |
    | | +[AppPatch]                        | |
    | | +[assembly]                        | |
    | |     :                              | |
    | |     :                              | |
    | |     :                              | |
    | +------------------------------------+ |
    | [Make New Folder]    [  OK  ] [Cancel] |
    +----------------------------------------+