インストールレスプログラミング( ´ー`)

VBA , JavaScript , HTAなど 365アプリはインストール必要ですが、仕事に無いケースはほぼないから(・_・;)

HTA 自己書き込み型のスクリプト(失敗)

すっかりHTAにしか興味がないので,ここに書くのも憚られるんですが,自分用メモとしてなら名前詐欺もいいかなと思いそのまま書きます。
HTAネタです。

やったことは,自己書き込み型のスクリプト
テキストボックスを一個もっていて,そこに打ち込んだものが自分自身に書き込まれるというもの。

条件によっては成功と言えるものができました。まずスクリプトを載せます。
vscodeの自動整形で検索部分がずれてて動かなくなってたので訂正しました。(-_-;)

<!doctype html>
<html>

<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" charset="utf-8">
    <title>Write Me</title>
    <style type="text/css">
        #log {}
    </style>
</head>

<body>
    <div id="targetDiv"></div>
    <div id="log"></div>
    <script>
        var targetDiv = document.getElementById("targetDiv")
        var DataCount, ForReading = 1, ForWriting = 2, ForAppending = 8
        var User = new ActiveXObject("WScript.Network").UserName;
        var fso = new ActiveXObject("Scripting.FileSystemObject");
        var fileName = location.pathname.slice(1)
        targetDiv.innerHTML = "<form name='form'>" +
            "<input type='text' name='text' maxlength='30' onFocus='func()'>" +
            "<input type='button' href='#' value='送信' onclick='writeMe()'></form>"
        const timerID = setTimeout(func2, 3000)
        //end of
        function func() { clearTimeout(timerID) }
        function func2() { location.reload() }
        function writeMe() {
            var res = document.form.text.value
            //定数宣言
            var adTypeText = 2
            var overWrite = 2
            var oldData = ""
            var ado = new ActiveXObject("ADODB.Stream")
            ado.Type = adTypeText
            ado.Charset = "utf-8"
            ado.Open()
            ado.LoadFromFile(fileName)
            var ado2 = new ActiveXObject("ADODB.Stream")
            ado2.Type = adTypeText
            ado2.Charset = "utf-8"
            ado2.Open()
            var line = ""
            while (!ado.EOS) {
                line = ado.ReadText(-2)
                if (line == "    <p id='data' hidden>") {
                    ado2.WriteText(line, 1)
                    ado2.WriteText(User + "," + res + "," + Date() + "<br>", 1)
                } else {
                    ado2.WriteText(line, 1)
                }
            }
            ado.Close()
            ado2.SaveToFile(fileName, overWrite)
            ado2.Close()
            location.reload()
        }
    </script>
    <p id='data' hidden>
    </p>
    <script>
        var logdiv = document.getElementById("log")
        var logdata = document.getElementById("data").innerText
        logdata = logdata.split("\n")
        var htm = ""
        for (var i = 0; i < logdata.length; i++) {
            htm = htm + logdata[i].split(",")[1] + "<br>"
        }
        if (logdata == "") { logdiv.innerHTML = "" } else { logdiv.innerHTML = htm }
    </script>
</body>

</html>

メモ帳にでも張り付けて,UTF-8形式で保存,拡張子をHTAにすればたぶん動くものです。

テキストボックスが一つだけあり,そこに打ち込んで送信を押すと,すぐ下にログがでてきます。エンター対策はしていません。

同じパソコン上でいくつも同時起動してやってみると,面白い感じです。3秒ごとに自動更新しているので,それなりに同期されると思います。

そう,自分の環境では動くんです。

失敗の部分は,ネットワーク上のフォルダに入れたときに動かないってこと。致命的な部分です。

エラーメッセージを家では確認できないんですが,少し調べたところ,ADODB.Streamは,InternetExplorerと同じレベルのセキュリティ制限を受けるようで,書き込みを阻害されます。

なので,自分のデスクトップとかでは普通に動くけど,ネットワーク上の場所に置くと使えない。

私には意味がないものになってしまいました。(;´∀`)

でも,自分自身を書き換えるというのはやってて面白かったので,とりあえず載せます。データは

<p id='data' hidden>
    </p>

の間にどんどん書き込まれていくことになっています。

救いなのは,FileSystemObjectのほうは,同様の制限を受けないこと。なので,外部テキストファイルを作っての掲示板は十分動くようでした。

FileSystemObjectがUTF-8の書き込みができるなら,わたしの望みは果たせたのですが,それはできません。なので,FileSystemObjectで同じ処理をすると,がっつり文字化けしてどうにもならない。

同じことで悩まないように,失敗例としての記事でした。

それにしてもHTAは面白く,VBAで仕事もしているんですが,そちらには最低限しか興味が行っていません。

Javascriptがすごい。CSSがすごい。 HTML5がすごい。 なので,それらを扱えるHTAはものすごい(;´∀`)

EdgeがChromium版を出してきましたね。実際私はそれを使っているんですが,これが主流になってきたら,もし望む方向に進めばさらにHTAはすごくなる・・かも。

そんな甘いことはないだろうなぁとは思いつつ,やっていくんですが,現状だけでも十分HTAの恩恵は受けています。

HTA自身が使えなくなっても Javascript,CSS,HTMLが書ければWebアプリでも生きていけますし,無駄にはならない・・はずかな。