웹, HTML

마지막 다큐먼트컴플리트 호출시점 및 invoke 인수 제대로 받기(역순 주의)

디버그정 2009. 7. 5. 01:16
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNo=20&no=605418&ref=605356

마지막 DISPID_DOWNLOADCOMPLETE 호출시점
  | ATL
2006-09-18 오후 3:32:26
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605356  / 읽음:172

ATL을 이용하여 BHO로 작업중입니다.


 DISPID_DOWNLOADCOMPLETE 가 마지막으로 호출되는 시점을 알수 있을까요??


프레임이 여러개인 페이지에서는 이 메세지가 여러번 들어오는걸로 알고 있습니다.

그래서 마지막으로 발생되는 시점을 알고 싶습니다.


이 글에 답변 등록하기
 [답변][참고] 2006-09-18 오후 5:27:50
이광진 (mirjini)  이광진님께 메시지 보내기이광진님을 내 주소록에 추가합니다.이광진님의 개인게시판 가기 번호: 605406  

안녕하세요...


마지막 DownloadComplete 가 호출되는 시점을 알기는 어려운 것으로 생각됩니다. 왜냐하면 이 경우에 알려주는 정보가 없기 때문입니다.

그러나 DocumentComplete 는 쉽게 알 수 있습니다. 다음 코드를 보시면 쉽게 알 수 있습니다.


void CIEAutomation::DocumentComplete(LPDISPATCH lpDispatch, VARIANT *pvtUrl)

{

    USES_CONVERSION;


    if(m_pIExplorer == NULL)

        return;


    IUnknown*  pUnk;

    LPDISPATCH lpWBDisp;

    HRESULT    hr;

   

    pUnk = (IUnknown*)m_pIExplorer;

   

    hr = pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);

   

    if(SUCCEEDED(hr) && lpDispatch == lpWBDisp)

    {

        // 마지막으로 호출된 DocumentComplete ...

    }

...

}


그리고 MSDN 에서 'How To Determine When a Page Is Done Loading in WebBrowser Control' 글을 참고하시기 바랍니다.

이 글에 답변 등록하기
         [답변]흐음... 2006-09-18 오후 5:45:15
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605416  

 항상 좋은답변 감사합니다.


 근데


if(SUCCEEDED(hr) && lpDispatch == lpWBDisp)

    {

        // 마지막으로 호출된 DocumentComplete ...

    }


이렇게 마지막인지 알수 있는데...


저는 Invoke함수에서 dispidMember값을 가지고 DocumentComplete를 검사 합니다.

저같은 경우는 lpDispatch값을 어떻게 구해야 하는건가요??

이 글에 답변 등록하기
                 [답변][답변] 2006-09-18 오후 5:51:37
이광진 (mirjini)  이광진님께 메시지 보내기이광진님을 내 주소록에 추가합니다.이광진님의 개인게시판 가기 번호: 605418  

네.. Invoke 함수는 보통 다음과 같지요...


STDMETHODIMP CIEAutomation::Invoke(DISPID dispidMember, REFIID riid, LCID lcid,

                                   WORD wFlags, DISPPARAMS* pDispParams,

                                   VARIANT* pvarResult, EXCEPINFO* pExcepInfo,

                                   UINT* puArgErr)


여기서 다음과 같이 사용하시면 됩니다. 다른 것들에 대해서도 같이 나열해 보았습니다.


해당 이벤트에 대해서는 MSDN에서 'DWebBrowserEvents2 Interface' 을 보시면 인자들이 어떻게 되는지 알 수 있습니다.


한 가지 주의하실 점은 이벤트 핸들러 함수를 호출할 때 넣어주는 인자는 역순으로 넣어주면 된다는 것입니다.


    switch(dispidMember)

    {

    case DISPID_DOCUMENTCOMPLETE:

        DocumentComplete(pDispParams->rgvarg[1].pdispVal,

                         pDispParams->rgvarg[0].pvarVal);

        break;

    case DISPID_BEFORENAVIGATE2:

        BeforeNavigate(pDispParams->rgvarg[6].pdispVal,

                       pDispParams->rgvarg[5].pvarVal,

                       pDispParams->rgvarg[4].pvarVal,

                       pDispParams->rgvarg[3].pvarVal,

                       pDispParams->rgvarg[2].pvarVal,

                       pDispParams->rgvarg[1].pvarVal,

                       pDispParams->rgvarg[0].pboolVal);

        break;

    case DISPID_NAVIGATECOMPLETE2:

        NavigateComplete(pDispParams->rgvarg[1].pdispVal, pvarResult);

        break;

...

}


이 글에 답변 등록하기
                         [답변]흐음... 2006-09-18 오후 6:10:30
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605424  

 실시간 답변을 달아주시는 같네요...^^ 바쁘신데 감사합니다.


다시 궁금점이 있습니다.


그렇게 해보니 마지막 발생시점을 걸러낼수 있더군요..

하지만, 해당 사이트에서 다른 페이지(가령 자유게시판) 으로 이동할때는

발생을 하지 않더군요...

이동을 했을때도 가장 마지막에 발생할경우도 걸러내고 싶습니다.

즉, 최초 사이트에 진입했을때 뿐 아니라, 다른 페이지로 이동할때도

처리를 해주고 싶습니다.


간단히 코드를 이렇게 넣었습니다.

DocumentComplete 부분에서

if( pDispParams->rgvarg[1].pdispVal == lpWBDisp )

 처리...


어떻게 해줘야 할까요?

이 글에 답변 등록하기
                                 [답변]... 2006-09-18 오후 6:44:08
이광진 (mirjini)  이광진님께 메시지 보내기이광진님을 내 주소록에 추가합니다.이광진님의 개인게시판 가기 번호: 605444  

제가 테스트해 본바로는 제대로 다 찾아집니다만...


뭔가 코드가 중간에 꼬인 것은 아닌지 다시 한번 살펴보시거나 코드를 올려봐 주시면 검토해 보겠습니다.

이 글에 답변 등록하기
                                         [답변]흐음... 2006-09-18 오후 7:54:31
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605462  

 테스트 소스 올려보겠습니다.



이 글에 답변 등록하기
                                                 [답변]... 2006-09-18 오후 11:21:24
이광진 (mirjini)  이광진님께 메시지 보내기이광진님을 내 주소록에 추가합니다.이광진님의 개인게시판 가기 번호: 605494  

 올려주신 소스 제대로 동작합니다만...


어느 사이트에서 안되시나요? 여기 데브피아와 네이버 등에서 다 제대로 동작합니다만...

이 글에 답변 등록하기
                                                         [답변]흐음.. 2006-09-19 오전 9:23:48
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605544  

 네...일부 사이트에서는 제대로 동작을 합니다만...


네이버 카페를 들어가서, 게시판 페이지에서 글쓰기 페이지로 넘어가게 되면

동작을 하질 않습니다.

다음 카페도 그렇구요~~


테스트 사이트 하나 올려볼께요~

http://www.3dstudy.net/

여기 가셔서 게시판 Q/A로 이동하고, 글쓰기로 가보십시요...

아마 제대로 동작을 하지 않는걸 아실겁니다.


혹, 프레임으로 나뉘어져 있어서 그럴까요?

프레임으로 나뉘어져 있을때는 매 프레임을 읽어들일때

해당 메세지가 호출된다고 했는데, 이걸 마지막에만 호출을 처리해서 그러지 않을까도

생각되는데요~~


바쁘시겠지만, 살펴봐주십시요~

이 글에 답변 등록하기
                                                                 [답변][답변] 2006-09-19 오전 9:46:56
이광진 (mirjini)  이광진님께 메시지 보내기이광진님을 내 주소록에 추가합니다.이광진님의 개인게시판 가기 번호: 605549  

처음 알려 드린 방법은 탑레벨 프레임의 변화만을 관찰하기 때문에 말씀하신 사이트 처럼 프레임으로 나뉘어진 경우에는 제대로


적용이 되지 않습니다. 이 경우에는 첨부한 소스처럼 하시면 됩니다. 물론 이 방법은 모든 경우에 사용 가능합니다.


처음 답변에 적어둔 MSDN의 'How To Determine When a Page Is Done Loading in WebBrowser Control' 내용을


읽어보시면 아실 수 있습니다.

이 글에 답변 등록하기
                                                                         [답변]흐음... 2006-09-19 오전 10:52:51
이재환 (kindlion)  이재환님께 메시지 보내기이재환님을 내 주소록에 추가합니다.이재환님의 개인게시판 가기 번호: 605576  

 네..답변감사합니다.


올려주신 소스와 같이 해보았지만, 아직도 한번 이상 발생하는경우가 있습니다.

좀더 살펴봐야겠습니다...


바쁘신데 감사합니다.