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 込みで使うノウハウはまだもってないので,暇ができたらやってみたい。