こんにちは、現在ATLを使用してIEのイベントの取得するプログラムを作っています。
現在このような動作をさせるつもりです。
1.IEを立ち上げる
2.Sinkのインスタンス作成
3.SinkをIEに登録する
4.IEでヤフーを開く
5.閉じる
6.閉じるイベント取得
3をやるとIEが再描画されない?ような状態になってしまいます。
しかも6は実行されません。
3をやらないと普通にヤフーが開きます、
もちろん6は実行されません。
私の書いたソース
1.ヘッダー http://www.geocities.jp/spspspspspsp6/header.txt
2.メイン http://www.geocities.jp/spspspspspsp6/soure.txt
もしよければアドバイスください。
参考にしたHP
http://www.nitoyon.com/vc/tips/ie_component.htm
http://www.s34.co.jp/cpptechdoc/misc/comevent/
http://www.codeproject.com/internet/detecting_the_ie_refresh.asp
イベントハンドラが呼ばれない原因は
タイプライブラリを指定していないからだと思います。
掲示されたソースコードはこうなっています。
public IDispEventImpl<SINKID_COUNTEREVENTS, IEEvents,
&DIID_DWebBrowserEvents2>
S34 のサンプルではこうなっています。
IDispEventImpl<SINKID_COUNTEREVENTS, CounterEvents,
&DIID__ICounterEvents, &LIBID_COUNTERSERVERLib, 1, 0>
もしかしたら理由があって省略したのかもしれませんが
とりあえず下記のようにタイプライブラリを指定して
テストしてみてはいかがでしょうか。
public IDispEventImpl<SINKID_COUNTEREVENTS, IEEvents,
&DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>
省略した理由は"IEコンポーネントの使い方"のページで指定していなかった事と、タイプライブラリ名がわからなかった為です。
アドバイス通りにやってみましたが、症状は変わりませんでした。
その後レジストリを調べてVer1.0からVer1.1にしてみましたが、だめでした。
うーん、難しい T_T
試した内容
public IDispEventImpl<SINKID_COUNTEREVENTS, IEEvents,
&DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 0>
public IDispEventImpl<SINKID_COUNTEREVENTS, IEEvents,
&DIID_DWebBrowserEvents2, &LIBID_SHDocVw, 1, 1>
とりあえず再描画されない理由は Sleep を使用しているためです。
なので↓
for(int j = 0; j <10*6; j++){//しばらく待つ
Sleep(1000);
}
を
READYSTATE state;
while(true){
if(m_pWebBrowser2->get_ReadyState(&state) != S_OK){
std::cout << "read error" << std::endl;
break;
}
if(state == READYSTATE_COMPLETE){
std::cout << "document complete" << std::endl;
break;
}
}
こんな感じで。
イベントが来ない理由はわかりません
なんとなく開かれてアクティブになった IE にイベントが移っている気がしますが……
ありがとうございます。
描画されました!!
イベントの方は違うイベントなら受信できました^^
変更点
//イベントの受信を登録します
BEGIN_SINK_MAP(IEEvents)
SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2)
SINK_ENTRY_EX(SINKID_COUNTEREVENTS, DIID_DWebBrowserEvents2, DISPID_ONQUIT, handle_OnQuit)
END_SINK_MAP()
void _stdcall OnBeforeNavigate2( IDispatch** ppDisp, VARIANT* pvUrl, VARIANT*, VARIANT* pvTarget, VARIANT*,
VARIANT*, VARIANT_BOOL *pbCancel)
{
std::cout << "OnBeforeNavigate2" << std::endl;
return ;
}
void _stdcall handle_OnQuit()
{
std::cout << "OnQuit" << std::endl;
return ;
}
ツイート | ![]() |