ATLでIEのイベントの取得するには

解決


MOR  2005-10-11 22:09:43  No: 59240

こんにちは、現在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


forty-five  2005-10-14 09:56:03  No: 59241

イベントハンドラが呼ばれない原因は
タイプライブラリを指定していないからだと思います。

掲示されたソースコードはこうなっています。

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>


MOR  2005-10-14 19:13:13  No: 59242

省略した理由は"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>


porin  2005-10-15 05:17:37  No: 59243

とりあえず再描画されない理由は 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 にイベントが移っている気がしますが……


MOR  2005-10-15 06:28:55  No: 59244

ありがとうございます。
描画されました!!
イベントの方は違うイベントなら受信できました^^

変更点
//イベントの受信を登録します
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 ;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加