覚書:CDOSYSのCreateMHTMLBodyがエラーを吐く

CDOSYSを使ってMHTML形式(Multipart HTML。よーするにメールのMultipart MIMEと同じ)で単一のファイルとして保存しておく、つーのはけっこう使っている人も多いようで。
いちいちIEで「名前をつけて保存」つーのは芸が無いので、一気にやりたい、というのは天然自然の要求であろう。

 俺も今(笑)、複数のページを保存しときたいという要求があったんで、これで保存しときゃいいかと、ちょっとスクリプトを書いてみた。
URL = "http://www.google.com/"
DiskFile = "test.mht"

Set CDO = CreateObject("CDO.Message")

CDO.CreateMHTMLBody URL, 0,"",""
CDO.GetStream.SaveToFile DiskFile, 2

Set CDO = Nothing
いや、実際はもうちょっと綺麗に(定数のハードコードなんかさすがにやらないよ)書いてるが、概略こんな感じで。

 CDOのCreateMHTMLBodyで取得してそのままSaveToFile…という方法なのだが、簡単に終わってしめしめ…と思ったら落とし穴があった。

 接続先URLによってエラーが出るのである。
CDO.Message.1: インターフェイスが登録されていません
www.msn.comは取れるけどwww.google.comは取れないとか、ヘンなエラーの出方だ。

?と思ってちょっとググって見たら、回答を見つけているひとがいた。JasonJoh's [MSFT] WebLog
なるほど、煎じ詰めるとCDOが下請けに使ってるURLMON.DLLとの関係がアレなんで、http1.1の圧縮使っているページではエラーが出ると。
単純にはIEの設定でhttp1.1を切れ、と。

 う~ん。CDO Configのパラメータを見ると、プロトコルバージョンを明示できるようなパラメータはないようなので、スクリプトからだと簡単には操作できそうも無いなぁ。

 俺はとりあえずIEの設定を変えちゃって用は済ませたが、マジメに実装するのならJasonJoh氏がおっしゃっているようにInternetSetOptionを上書きするような何かを用意する必要がありそうだ。

ちなみにWinXP SP2で、CDOSYS.DLLが6.2.4.0,URLMON.DLLが6.0.2900.3268という環境。
[PR]
by SIGNAL-9 | 2008-02-19 13:02 | TIPSとかKludgeとか
<< アキバを襲った大災害(2) 大... やっぱり顔は重要か。 >>