2015年10月16日金曜日

IDownloadManager の実装意義

Internet Explorer や WebBrowser コントロールには、ファイルのダウンロードをカスタマイズする機構が備わっているようです。

IDownloadManager interface
https://msdn.microsoft.com/en-us/library/aa753613(v=vs.85).aspx

インターフェイスの定義の方は、次のようになっています。

    MIDL_INTERFACE("988934A4-064B-11D3-BB80-00104B35E7F9")
    IDownloadManager : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Download( 
            /* [in] */ IMoniker *pmk,
            /* [in] */ IBindCtx *pbc,
            /* [in] */ DWORD dwBindVerb,
            /* [in] */ LONG grfBINDF,
            /* [in] */ BINDINFO *pBindInfo,
            /* [in] */ LPCOLESTR pszHeaders,
            /* [in] */ LPCOLESTR pszRedir,
            /* [in] */ UINT uiCP) = 0;
        
    };

要は GET や POST でダウンロードが必要な場合に



確認を求めてくる、あの画面です。

通常 Download が呼び出されますが。横取りされて、Download が履行されないケースも確認しています:

  • PDFファイルが、Adobe Acrobat Reader 等でインライン表示される場合。
  • テキスト形式に見えるファイルが、インライン表示される場合。

Download に渡ってくる引数につきまして:

  • pmk 以外は、ほとんど NULL。当てにできません。
  • POST の場合は、GET と同じ要領で来ます。判別する明確な方法は見つかっていません。


こういう物を見つけました。

IE custom download manager (CSIEDownloadManager)
https://code.msdn.microsoft.com/windowsdesktop/CSIEDownloadManager-8ab5d910

ビルドしたサンプルを参考までにお配りしています。

Setup_CSIEDownloadManager.exe
https://drive.google.com/file/d/0Bygl-em20CSKcEhKZFYxdVZUemM/view?usp=sharing

Windows 8.1 の IE11 でも動きましたので、IDownloadManager は未だ有効のようです。



3 件のコメント:

  1. 大変興味記事を参考にさせていただいています。1点質問をさせていただけないでしょうか。
    当方もCSIEDownloadManagerの挙動を確認したくWindows10(1809)環境とVisualStudio2017(community)でコンパイルしてみましたが、
    IEのダウンロード時に本プログラムのCOMの参照に失敗しているようです。実行ファイルやインストーラ(msi)は問題なく生成できておりました。
    貴殿のインストーラを利用してみると問題なく動きましたが、インストール時の挙動が当方とは異なるものでした。
    当方はMicrosoft Visual Studio Installer Projectsを利用して、生成されたmsiを使ってインストールしておりますが、貴殿はどのようなものを利用されていますか?

    返信削除
    返信
    1. お世話になります。
      御返事が遅くなりました💦

      > 当方はMicrosoft Visual Studio Installer Projectsを利用して、生成されたmsiを使ってインストールしておりますが、貴殿はどのようなものを利用されていますか?

      NSIS を使用しています。
      セットアップを改めて実行しましたが NSIS でした。
      まことに残念ながら、NSIS セットアップを含むソースコードは発見できませんでした。紛失した模様です。

      > IEのダウンロード時に本プログラムのCOMの参照に失敗しているようです。

      DLL はレジストリに登録されていますか?

      regsvr32.exe xxx.dll

      また 32-bit 版と 64-bit 版の違いは大丈夫でしょうか。
      64-bit Windows の iexplore.exe は 64-bit で動作するようです。

      Visual Studio をお使いとのことで…
      oleview.exe を使用すると
      COM オブジェクトの一覧化とインスタンス化ができるので、
      登録有無の調査については役に立つかもしれません。

      削除
    2. お世話になります。

      ソースコード一式を発見しました

      役立ちそうな NSIS のソースコードだけアップしました。

      Setup_CSIEDownloadManager.nsi.txt
      https://drive.google.com/open?id=1gD_xn2Q2v4fNW1_7SZHyIE6qH_AVFKTP

      .NET Framework の regasm.exe で COM コンポーネント登録をしていることがわかりました。

      ExecWait '"$WINDIR\Microsoft.NET\Framework\v4.0.30319\regasm.exe" /codebase "$OUTDIR\CSIEDownloadManager.dll"' $0

      削除