jseval by kanegon 1. 概要 JavaScript のインタープリタです。 入力テキストを JavaScript の式として評価し、その結果を表示します。 そのほか、COM 情報を取得するいくつかのサービス関数を提供します。 取得可能な COM 情報にはインタフェース名やメソッド/プロパティ情報があります。 2. 機能 - JavaScript 式評価 - GUI インタフェース - COM 情報表示関数 - コマンドヒストリ - 複数行入力 - 他 詳細はソースを参照してください。 3. インストール/アンインストール 配布のアーカイブファイルを任意のディレクトリに展開してください。 特別な設定は必要ありません。 ツールの起動には展開されたファイル jseval.hta をエクスプローラからダブルクリッ クします。 アンインストールは展開されたファイルをすべて削除するだけです。 このツールはファイルやレジストリへの書き込みを書き込みを一切行いません。 COM 情報取得の機能を使用する場合、別途 ActiveScriptRuby もインストールしておく 必要があります。逆に COM 情報取得のコマンドを使用しないのであれば ActiveScriptRuby は不要です。 インストールの順番は特に気にする必要はなく、jseval.hta の起動時に ActiveScriptRuby が認識されれば、COM 情報取得のコマンドが有効になります。 ActiveScriptRuby のインストールについては ActiveScriptRuby の説明を参照してく ださい。 ActiveScriptRuby は以下からダウンロードできます。 http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/index.html 普通のWindows版 ruby がインストールされていても利用することはできないので注意 してください。 4. JavaScript 式評価 JavaScript の式を評価してその結果を表示します。 以下に例を示します。 > a = 10 10 > b = 20 20 > a * b 200 先頭に '>' のついている行がユーザの入力になります。 入力した行を逐次解釈し、その結果を表示します。 逐次解釈は内部で eval() を呼んでいるだけなので、要するにあまり複雑なことはでき ません。 関数定義は以下のように関数オプジェクトを使用して行います。 > add = new Function("x", "y", "return(x + y)"); function anonymous(x, y) { return(x + y) } 以下のような通常の書式で関数を定義しても正しく認識されません。 > function anonymous(x, y) { return(x + y); } undefined 5. COM 情報取得 COM 情報取得のため、以下のサービス関数が使用可能になっています。 comInfo(obj[, name]) # インタフェース名などの情報 # 名前が指定されている場合はメソッドまたはプロパティの情報 comMethods(obj) # そのオブジェクトが持つメソッド一覧 comProperties(obj) # そのオブジェクトが持つプロパティ一覧 COM 情報の取得は ruby の機能を利用していますので、別途 ruby のインストールが必 要になります。 実際の使い方は以下のようになります。 IE の制御そのものは通常の JavaScript の機能です。 > ie = new ActiveXObject('InternetExplorer.Application') Microsoft Internet Explorer > ie.visible = true true > ie.gohome() undefined > comInfo(ie) [guid({D30C1661-CDAF-11D0-8A3E-00C04FC9E26E}), helpstring("Web Browser Interface for IE4.")] Interface IWebBrowser2 > comInfo(ie.document) [guid({3050F55F-98B5-11CF-BB82-00AA00BDCE0B}), helpstring("")] Dispatch DispHTMLDocument > comMethods(ie) QueryInterface(), AddRef(), Release(), GetTypeInfoCount(), GetTypeInfo(), GetIDsOfNames(), Invoke(), GoBack(), GoForward(), GoHome(), GoSearch(), Navigate(), Refresh(), Refresh2(), Stop(), Quit(), ClientToWindow(), PutProperty(), GetProperty(), Navigate2(), QueryStatusWB(), ExecWB(), ShowBrowserBar(), GetTypeInfoCount(), GetTypeInfo(), GetIDsOfNames(), Invoke() > comProperties(ie) Application, Parent, Container, Document, TopLevelContainer, Type, Left, Left=, Top, Top=, Width, Width=, Height, Height=, LocationName, LocationURL, Busy, Name, HWND, FullName, Path, Visible, Visible=, StatusBar, StatusBar=, StatusText, StatusText=, ToolBar, ToolBar=, MenuBar, MenuBar=, FullScreen, FullScreen=, ReadyState, Offline, Offline=, Silent, Silent=, RegisterAsBrowser, RegisterAsBrowser=, RegisterAsDropTarget, RegisterAsDropTarget=, TheaterMode, TheaterMode=, AddressBar, AddressBar=, Resizable, Resizable= > comInfo(ie, "navigate") [id(0x00000068), method, helpstring("Navigates to a URL or file.")] VOID Navigate( [in] BSTR URL, [in, optional] VARIANT Flags, [in, optional] VARIANT TargetFrameName, [in, optional] VARIANT PostData, [in, optional] VARIANT Headers) 6. 使用上の注意点 実装は本当に単純に eval() してるだけなので、いろいろ問題があります。 特に、システムで使用している変数やプロパティとユーザ定義の変数の区別が ないため、title とか window などの名前を使うとかち合う可能性が高いです。 なるべくユーザ定義の変数とかち合わないように、アプリケーション定義の変数に はすべて '_' をつけていますが、hta でコーディングしているため、window や document のプロパティが見えてしまっています。 このあたり特に頑張るつもりはありません。システム定義の名前とかち合わない ように注意してください。 # ひょっとして ScriptControl を使用して、その環境のなかにすべての文字列を渡し # て eval() させるようにすれば、名前の問題は解決するか? # eval() の評価を行う関数自体を ScriptControl で実体化したインスタンス中に持 # つようにすれば。 # この方向ですこし頑張れば、関数定義もできるようになるのかも。 # 要調査 comInfo(obj, name) でプロパティ情報を取得するとき、PROPERTYPUT の型が表示さ れていません。これは現状の仕様です。(ruby の win32ole を使って PROPERTYPUT の型情報を取得する方法が分からないため) 7. 修正履歴 2003.04.26 ver0.01 新規作成 2003.04.27 ver0.02 showMethods を関数化 2003.05.02 ver0.03 メソッド、プロパティ情報の詳細を表示 2003.09.30 ver0.04 ActiveScriptRuby 1.8 対応