2005年03月25日

IEコンポーネントで表示している文書のBODY内HTMLを得る

[ カテゴリ : memo - VC6 で IEコンポーネント ]

前のメモで作った最小限の奴を編集して、BODY 内容(HTML)を CString に格納したりファイルに保存したり。

もちろん、見るだけじゃなくてBODY 加工(特定ワードを強調表示する 差し込んだり)のための情報収集をしたいわけだが、、、、

問題点は、ここで得られる HTML はタグとか確かにあるものの、いわゆるソースとは違うという点。タグが大文字になっていたり \n の場所が違ったりなんだり。
あと、ヘッダ情報はどーもソースで得るのは大変らしい。
いずれにせよ、本文のタグを変更するなどしていじりたい場合は、ここで得られる内容がどうなるか把握しておかないとならない。


なので、サンプルのようにファイルに保存して、内容みてみることが必要だったので、そこまでをメモに。
(HTML 書き換えについては別途メモを書く予定。カテゴリアーカイブで見てね)

1. CHtmlView 派生クラスの cpp にて、
#include <mshtml.h>
#include <atlbase.h>

する。

2. ClassWizard かなんかで、仮想関数 OnDocumentComplete を実装する。
なお、OnBeforeNavigate2 とか OnNavigateComplete ではダメ。
後述の get_body が失敗する。(IHTMLDocument2 取得くらいはいけたり)

3.CHtmlView の OnDocumentComlete イベント発生時(またはその後)に
・GetHtmlDocument() で LPDISPATCH を 得る
・QueryInterface で IHTMLDocument2* を得る
・get_body で IHTMLElement* を得る
・QueryInterface で IHTMLTxtRange* を得る
・get_htmlText で BSTR* を得る(=BSTR型の文字列として BODY 内 HTML を得る)
・BSTR は CString に代入できる。

まぁ、ソース見た方が早いね。



IHTMLDocument2 *lpHtmlDocument = NULL;
LPDISPATCH lpDispatch = NULL;
IHTMLElement *lpBodyElm;
IHTMLBodyElement *lpBody;
IHTMLTxtRange *lpTxtRange;

lpDispatch = this->GetHtmlDocument();
if ( !lpDispatch ) return;

lpDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&lpHtmlDocument);
lpDispatch->Release();
if ( !lpHtmlDocument ) return;

lpHtmlDocument->get_body(&lpBodyElm);
lpHtmlDocument->Release();
if ( !lpBodyElm ) return;

lpBodyElm->QueryInterface(IID_IHTMLBodyElement,(void**)&lpBody);
lpBodyElm->Release();
if ( !lpBody ) return;

lpBody->createTextRange(&lpTxtRange);
lpBody->Release();
if (!lpTxtRange) return;

CString str;
BSTR* p = new BSTR;
lpTxtRange->get_htmlText( p );
str = *p;
delete p;

CFile file;
file.Open("c:\\out.txt", CFile::modeCreate|CFile::modeWrite,NULL );
file.Write( (LPCTSTR)str, str.GetLength() );
file.Close();

投稿者 JK : 11:53 | トラックバック

VC6 で IEコンポーネント

[ カテゴリ : memo - VC6 で IEコンポーネント ]

とりあえず動かすところを。

・MFC AppWizard で、View を CHtmlView にする
・できたソースの CHtmlView の OnInitialUpdate関数の中に、
 Navigate2 関数を呼ぶパラメータとして URL が定数であるので、
 好きなところに書き換える。

これでとりあえず動く。これだけなら楽勝。

んで help で CHtmlView とか見ていけばいいわけで。
ま、わざわざ自作するからには body を読んだりなんだりしたいわけで、
でも、ヘルプじゃわかんねーので、それはまた別のメモってことで。

投稿者 JK : 11:04 | トラックバック