천객만래 [千客萬來] (It has an interminable succession of visitors)

[delphi/web] how to detect when a Document is comp...



2004.01.12


An other example:

This example shows how to detect when a document is completely 
loaded, even if it includes multiple frames. Only the final 
OnDocumentComplete event passes the same Dispatch interface as the 
OnNavigateComplete event handler.

var
  CurDispatch: IDispatch; {save the interface globally }

procedure TForm1.WebBrowser1NavigateComplete2(Sender: TObject; const 
pDisp: IDispatch; var URL: OleVariant);

begin
  if CurDispatch = nil then
    CurDispatch := pDisp; { save for comparison }
end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const 
pDisp: IDispatch; var URL: OleVariant);
begin
  if (pDisp = CurDispatch) then
  begin
    Beep; {the document is loaded, not just a frame }
    CurDispatch := nil; {clear the global variable }
  end;
end;

cu Andries

Posted by SB패밀리

익스플로러에서 새창이 생성될때 그 창의 포인터를 얻는 방법






익스플로러에서 새창이 생성되면 Newwindow2이벤트가 일어납니다. 새로 생성된 익스플로러창의 포인터를 얻는 방법이 있나요? 
제가 만든 브라우저가 포함된 다이얼로그 폼으로 Set하면 됩니다. 그러나 일반적으로 생성되는 새창의 포인터를 얻고 싶습니다. 즉, IWebBrowser2의 포인터를 얻고 싶습니다. 그 이유는 현재창에 이벤트를 sink시키고 새로운 창이 생기면 그 창도 이벤트를 sink시키려고 하는데 새로운 창의 IWebBrowser2포인터를 얻어 올 수가 없어요.. 
그래서, 브라우저 인스턴스를 만들고 그 브라우저의 IWebBrowser2포인터의 Get_Application()함수를 이용하여 ppDisp에 넘겼는데 새로운창도 뜨고, 인스턴스로 생성한 창도 떠서 두개가 뜨게 됩니다. 
다음은 브라우저컨트롤이 포함된 다이얼로그의 예제입니다.

void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel) 

 // TODO: Add your control notification handler code here 
 CMyIETestDlg *m_dlgNewWB = new CMyIETestDlg; 
 m_dlgNewWB->Create(IDD_MYIETEST_DIALOG); 
 *ppDisp = m_dlgNewWB->m_pIE.GetApplication(); 
}

위와 같이 자기가 만든 다이얼로그폼안의 웹브라우저의 포인터를 ppDisp에 넘겨주면 되는데.. 다음과 같이 하면 되지 않아요.. 좋은 방법이 있으면 알려주세요.

void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel) 

 IWebBrowser2 *m_pIE=NULL; 
 HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&m_pIE); 
 m_pIE->get_Application (ppDisp); 
}


void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
 IWebBrowser2 *m_pIE=NULL;
 HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL,
 CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&m_pIE);
 m_pIE->get_Application (ppDisp);
}

여기에서 LPDISPATCH FAR* ppDisp 로 넘어온 포인터가 새로운
웹브라우져의 IDispatch 인터페이스 포인터를 받는 포인터입니다.
즉, 원하시는 포인터가 해당 파라미터로 넘어오고 이때 이벤트를
싱크시키면 됩니다.


출처 : 인터넷

Posted by SB패밀리

IE 의 URL을 구하는 것은 생각보다 쉽습니다.
좋은 예제파일이 함께 있어서 올려봅니다.
따라해 보세요.

실행중인 IE의 URL 구하기
 
// URL을 추출합니다. ASSERT(m_spSHWinds != NULL);
long nCount = m_spSHWinds->GetCount();
IDispatchPtr spDisp;
for (long i = 0; i < nCount; i++)

 _variant_t va(i, VT_I4); 
 spDisp = m_spSHWinds->Item(va); 
 SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
 if (spBrowser != NULL)  
  m_ctrlUrlList.AddString(spBrowser->GetLocationURL());


출처 : 인터넷

Posted by SB패밀리


익스플로러에서 새창이 생성될때 그 창의 포인터를 얻는 방법

익스플로러에서 새창이 생성되면 Newwindow2이벤트가 일어납니다. 새로 생성된 익스플로러창의 포인터를 얻는 방법이 있나요?
제가 만든 브라우저가 포함된 다이얼로그 폼으로 Set하면 됩니다. 그러나 일반적으로 생성되는 새창의 포인터를 얻고 싶습니다. 즉, IWebBrowser2의 포인터를 얻고 싶습니다. 그 이유는 현재창에 이벤트를 sink시키고 새로운 창이 생기면 그 창도 이벤트를 sink시키려고 하는데 새로운 창의 IWebBrowser2포인터를 얻어 올 수가 없어요..
그래서, 브라우저 인스턴스를 만들고 그 브라우저의 IWebBrowser2포인터의 Get_Application()함수를 이용하여 ppDisp에 넘겼는데 새로운창도 뜨고, 인스턴스로 생성한 창도 떠서 두개가 뜨게 됩니다.
다음은 브라우저컨트롤이 포함된 다이얼로그의 예제입니다.

void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
 // TODO: Add your control notification handler code here
 CMyIETestDlg *m_dlgNewWB = new CMyIETestDlg;
 m_dlgNewWB->Create(IDD_MYIETEST_DIALOG);
 *ppDisp = m_dlgNewWB->m_pIE.GetApplication();
}

위와 같이 자기가 만든 다이얼로그폼안의 웹브라우저의 포인터를 ppDisp에 넘겨주면 되는데.. 다음과 같이 하면 되지 않아요.. 좋은 방법이 있으면 알려주세요.

void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
 IWebBrowser2 *m_pIE=NULL;
 HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&m_pIE);
 m_pIE->get_Application (ppDisp);
}


void CMyIETestDlg::OnNewWindow2Explorer(LPDISPATCH FAR* ppDisp, BOOL FAR* Cancel)
{
 IWebBrowser2 *m_pIE=NULL;
 HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL,
 CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&m_pIE);
 m_pIE->get_Application (ppDisp);
}

여기에서 LPDISPATCH FAR* ppDisp 로 넘어온 포인터가 새로운
웹브라우져의 IDispatch 인터페이스 포인터를 받는 포인터입니다.
즉, 원하시는 포인터가 해당 파라미터로 넘어오고 이때 이벤트를
싱크시키면 됩니다.


출처 : 인터넷

Posted by SB패밀리