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();
VC6 で IEコンポーネント
[ カテゴリ : memo - VC6 で IEコンポーネント ]とりあえず動かすところを。
・MFC AppWizard で、View を CHtmlView にする
・できたソースの CHtmlView の OnInitialUpdate関数の中に、
Navigate2 関数を呼ぶパラメータとして URL が定数であるので、
好きなところに書き換える。
これでとりあえず動く。これだけなら楽勝。
んで help で CHtmlView とか見ていけばいいわけで。
ま、わざわざ自作するからには body を読んだりなんだりしたいわけで、
でも、ヘルプじゃわかんねーので、それはまた別のメモってことで。