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拡張にアクセスできる。