SHDocVw で表示中のページをファイルに保存

せめて月イチくらいでは何かかきたいので書く。

んで,ブラウザコンポーネント(SHDocVw)で,表示中のページをファイルに保存する方法。ただし画像等のリソースファイルの保存(Web ページ、完全)や Web アーカイブとしての保存はできない。「Web ページ、HTML のみ」のイメージ。リソース込みで保存したい場合の方策はあるのかな。

ほぼ how to save html file in VC++ で引用されているサンプルのまま。

ほんとはフォームの pas ファイルからの切り出しなので FWebBrowser が外在化してたりおかしいけど,サンプルなので。

uses
  OleCtrls, ActiveX, SHDocVw;

var
  FWebBrowser: TWebBrowser;

procedure SaveWebPage(AFileName: string);
var
  PFile: IPersistentFile;
  WFileName: PWideChar;
begin
  PFile := FWebBrowser.Document as IPersistFile;

  WFileName := StringToOleStr(AFileName);

  try
    PFile.Save(WFileName, False);
  finally
    SysFreeString(WFileName);
  end;
end;

独立したプロシジャになってるけど,ほんとは NavigateComplete2 イベントが発火したあとに実行するなど,いろいろ考えなくてはいけない。

メリット
  • Cookie 等について考える必要がない
デメリット
  • エンコードミスマッチで文字化けしていた場合はどうなる?
  • Excel や Word などが内部で開かれた場合はどうなる?
  • エラー(5xx や 4xx 系)がおきた場合のハンドリングがめんどう(イベントドリブンなので)

つまり。
すでに SHDocVw コンポーネントを(オートパイロット的に)使っている場合には使ってもいい(価値がある)。そうでなくて wget 的ことがしたいときにわざわざ SHDocVw を使うのは意味がない。そのような場合たとえば WinInet などを使えばよい(.Net だと webClient を使うほうがお気楽かな)。WinInet で Cookie 込みで使うノウハウはまだもってないので,暇ができたらやってみたい。