印刷テンプレートからのDLL呼び出し

Internet Explorerの印刷テンプレートはJavaScriptで書かれている。(正確にはJScriptか。VBScriptでもいいのかもしれない。)


JavaScriptでもたいていのことはできるが、ネイティブのDLLにアクセスすることも可能である。
といっても直接DLLを呼び出せるわけではなくて、BHOやActiveX経由になる。要するにIDocHostUIHandlerにアクセスする権限があればOK。


具体的には、

  • BHOやActiveXでIDocHostUIHandler::GetExternal()によってDOM拡張を行う。(window.externalを拡張する)
  • 印刷テンプレートのスクリプト内から、拡張されたDOM経由でネイティブコードにアクセスする

という手順になる。


注意しなければならないのは、印刷テンプレート実行時のwindowオブジェクトは元のコンテンツのコンテナであるwindowオブジェクトとは別の、独立したwindowオブジェクトであること。そして印刷テンプレートでのwindowオブジェクトは、IDocHostUIHandler::GetExternal()でのDOM拡張の影響を受けない(DOM拡張機能にアクセスできない)。これは印刷テンプレート専用の独立したDOM空間として実装されているのだろう。
つまり、こういう書き方はスクリプトエラーになってしまう。

window.external.extendedMethod();

では印刷テンプレートからどうやってDOM拡張にアクセスするのか?
印刷テンプレートではdialogArguments.__IE_BrowseDocumentによって元のコンテンツのdocumentオブジェクトにアクセスすることができる。このdocumentオブジェクトから辿ることでDOM拡張(window.externalオブジェクト)にアクセスできる。

dialogArguments.__IE_BrowseDocument.parentWindow.external.extendedMethod();

ちょっと長ったらしいけどこれで印刷テンプレートのスクリプト内からDOM拡張にアクセスできる。