How to work HTA (mshta.exe) in Wine on Linux
HTML Application (HTA)をWineを使いLinux上で実行する方法を記す。
Introduction
ここ数年になって,NW.jsやElectronのように,HTML+CSS+JavaScriptによりデスクトップアプリの開発環境が発展してきた。しかし,15年以上前の1999年から既に似たようなことは可能だった。それがHTAだ。
HTAはMicrosoft Windowsで導入された仕組みである。Internet Explorerを使うことでHTMLをプログラムとして実行することができる。Internet Explorerと一緒にインストールされるmshta.exeがエンジンとなって,HTAは実行される。
HTAには以下の2点の利点があり,非常に魅力的な技術だと感じていた。
- Windows標準で使える
- HTAで使えるJScriptやVBScriptが高機能
ただ,一つ残念ところがあった。それはWindowsでしか使えないことだ。せっかくWebの標準技術が使えても,Windowsでしか使えないのはもったいない。
OS標準の開発環境が最も貧弱なのはWindowsであり,このWindowsで使えるHTAが他のLinuxなどのOSでも使えるのなら,HTAは非常に汎用的なプログラムになる。
なんとかして,HTAをLinuxでも実行できるようにしたいと考えていた。幸いなことに,Windows向けのアプリケーションをネイティブ動作させるためのWineというソフトがあり,このソフトでHTAを実行できた。
WineとHTAに関する情報は少ないので,手順を記す。Ubuntu 16.04で動作を確認した。
Method
標準のAPTなどのパッケージマネージャーでインストールしたwine 1.6.2とwineのパッケージマネージャーであるwinetricks 1.8ではバージョンが古いようで,起動しても以下のメッセージが出てしまいHTAを実行できなかった。
wine mshta.exe test.hta
mshta.exe is a stub!
以下のバグレポートで解決策が記載されていたのでこの方法をもとに行う。
まず,パッケージマネージャー(APT)でインストールしたwinetricks
を一旦アンインストールして,最新のwinetricksをインストールする。
sudo apt remove -y winetricks
cd ~/.local/bin
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks
chmod +x winetricks
事前に~/.local/bin
にPATHを通しておく。winetricksがインストールできたので,mshta.exe
の実行元であるInternet Explorerをインストールする。winetricksでインストールできる最新バージョンはIE8である。
winetricks -q ie8
既にIE8がインストールされている場合は,以下のコマンドで強制的にインストールしてもよいかもしれない。
winetrickes --force -q ie8
最後に,以下のコマンドでmshta.exe
をレジストリーを登録する。
wine reg.exe ADD HKCU\\Software\\Wine\\DllOverrides /v "mshta.exe" /t REG_SZ /d "native,builtin"
これで動くようになった。この最後のレジストリーの設定が大事なようだ。
試しに以下の内容のtest.htaを作ってみる。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<title>HTAのサンプル</title>
<script>
alert("これはHTAであってHTMLではありません");
</script>
</head>
<body>
<a href="http://myfuturesightforpast.blogspot.jp/">My Future Sight for Past</a>
</body>
</html>
test.htaをダブルクリックするか,[右クリック]→[Open With Microsoft (R) HTML Application]により,起動できた。その他,以下のコマンドでも起動できた。
wine start test.hta
起動すると以下の画面が表示される。
なお,以下のコマンドでは起動できなかった。
wine mshta test.hta
しかし,以下のようなメッセージがでて動いているような印象だ。
fixme:thread:InitializeSRWLock (0x5de6b680): stub fixme:thread:InitializeSRWLock (0x5de6cfe4): stub fixme:thread:AcquireSRWLockShared (0x5de6b680): stub
Conclusion
LinuxのWine上でHTAを動かす方法について解説した。
実際のところ,Wine上のHTAでどこまでできるかはまだよくわからない。しかし,HTAは有望な技術だと感じている。
Windows 10でbashが使えるようになったからといっても,まだまだWindows 7は現役だ。標準でシェルスクリプトが使えるようになるには,Windows 8のサポートが切れる2023-01-10まで,少なくともあと6年はかかるだろう。
また,シェルスクリプトだと業務で頻繁に使われるExcelファイルの処理は複雑だ。HTAからJScriptなどでVBAのAPIを操作したほうが簡単だ。
それに,HTAを使えばPOSIX原理主義に基づいて交換可能性を担保したGUIを作れる可能性がある。既存のシェルスクリプトのGUIを作ることもできるかもしれない。
HTAのベースはWeb標準技術だ。学んで無駄になることはない。今後もHTAやWSHなどについて調べてみたい。