スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
 

続・64ビット環境でスクリプトを実行する

前回の記事を書いた後、思った事、それは

無いなら作れ!

マイクロソフトが作らないなら勝手に作ればいい

…という訳で、64ビットで動作するMicrosoft Script Control(msscript.ocx)互換のTablacus Script Control 64を作ってみました。

このソフトはMicrosoft Script ControlとクラスIDやDISPIDを合わせているので、インストールすれば、32ビットで動作していたスクリプトそのままで、64ビット環境でほぼ動作します。

また、あふw作者のAKTさんにあふwの64ビット版の&SCRIPTの無効化を外してテストしてもらいました。感謝!
AKTさんの協力もあり、DelphiのTScript.Create()でも動作します。
Delphiから動作するようにするには、IScriptControl 以外に IOleObject, IPersistStreamInit, IOleControlを実装する必要がありました。

タイプライブラリはまだ作成していないのですが、Microsoft Script Controlに合わせて作成しているので、参照から作成する必要がある場合は代わりにmsscript.ocxを参照できれば上手く動くかも…

64ビット スクリプト コントロール Tablacus Script Control 64
プログラムのコードに付いてはTablacus Script Control 64のソースをご覧ください。
 
スポンサーサイト

64ビット環境でスクリプトを実行する

64ビットネイティブ環境ではScriptControlが使用できません。代わりに以下の方法があります。

1.IEコンポーネントを使用

htmlを表示するIEコンポーネントのスクリプトタグを使用すれば、スクリプトが実行できます。
メリットはIEの機能(alertやprompt等)が使用できます。また、IE9以降の場合はChakraという高速なスクリプトエンジンを使用できます。
デメリットはIEコンポーネントの分だけ重くなります。

2.htmlfile (CLSID_HTMLDocument)を使用

上記のIEコンポーネントのhtml解析の部分を取り出した感じです。これもIE9以降の場合はChakraという高速なスクリプトエンジンを使用できます。
IE11からは標準化の流れでwindow.execScriptが廃止されているので注意。

3.IActiveScriptを使用

ScriptControlの内部で使っていると思われるIAcriveScriptで直接実行させることもできます。この方法は上記の2つの方法より細かい指定ができます。

ScriptControl.LanguageはCLSIDFromProgIDで言語名からCLSIDを作成し、CoCreateInstanceでIActiveScriptを作成します。Chakraという高速なスクリプトエンジンを使用する場合はCLSIDFromProgIDで無くChakraのCLSIDを用意する必要があります。

ScriptControl.AddCodeはIAcriveScriptSite::GetItemInfoをpstrNameに追加するオブジェクト名が来た際にppiunkItemにオブジェクトを返すように実装し、IActiveScript->AddNamedItemでオブジェクト名を通知します。

ScriptControl.AddCodeはIActiveScriptParseをIActiveScriptからQueryInterfaceして、ParseScriptTextします。

詳しくはTablacus Exploerのソースをご覧ください。

2番目のCLSID_HTMLDocumentはコメントになっていますが、3つの方法ともあります。
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。