■88878 / inTopicNo.1) |
C++ Navigate2 画面更新後のHTMLDocume |
□投稿者/ びぎなー青ドンちゃん (8回)-(2018/10/09(Tue) 12:30:25)
|
分類:[C/C++]
2018/10/09(Tue) 17:35:41 編集(投稿者) 2018/10/09(Tue) 17:35:30 編集(投稿者)
環境:Windows 10 Visula Studio 2005 C++ Win32
お世話になっております。
前回C#のWebBrrowserを使用して画面監視し submitをする件ではご回答いただきありがとうございました。
今回はVC++で同じことができないか挑戦中です。 表示中画面の最新HTMLの情報を取得したいのですがうまくいきません。
※参考サイト「http://www.nitoyon.com/vc/tips/ie_component.htm」
<やりたいこと> 画面上に作ったボタン「hwndChkButton」を押下し 表示中の画面を数秒おきに更新して 新しいリンク先「a href〜〜」があるかどうかを確認したい。
<うなくいかない点> 同じURLに対して「pWB2->Navigate2」をしても更新されず 前回の情報のまま
以下コードの一部です。 //--------------------------------------------------------------------------
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { static CComQIPtr<IWebBrowser2> pWB2 ; static HWND hwndIE; static HWND hwnChkButton ;
//------------------------------------------ HRESULT hr = ::CoInitialize(NULL); //COMを使うときのお約束 if (FAILED(hr)) { return -1; }
//------------------------------------------ switch (iMsg) { case WM_CREATE : { AtlAxWinInit();
hwndIE = CreateWindow("AtlAxWin80", "Shell.Explorer.2", WS_CHILD|WS_VISIBLE, 10, 10, 500, 300, hwnd, (HMENU)0, GetModuleHandle(NULL), NULL);
hwndChkButton = CreateWindow("button", "BUY", WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON, 0, 0, 0, 0, hwnd, (HMENU)3, GetModuleHandle(NULL), NULL);
// ActiveXコントロールのインターフェースを要求 CComPtr<IUnknown> punkIE; if (AtlAxGetControl(hwndIE, &punkIE) == S_OK) { // IUnknownポインタからIWebBrowser2ポインタへキャスト pWB2 = punkIE; if(pWB2) { // シンクオブジェクトの作成 CComObject<CIESink>* sink; CComObject<CIESink>::CreateInstance(&sink);
// イベントをDispatchするよう、IEコントロールにお願い HRESULT hr = sink->AdviseToIE(punkIE); if(SUCCEEDED(hr)) { // ホームページへ移動 pWB2->GoHome(); return 0; } }
MessageBox(hwnd, "初期化に失敗", "", MB_OK) ; EndDialog(hwnd, 0); }
return 0 ; }
case WM_SIZE :
MoveWindow(hwndChkButton, LOWORD(lParam) - 120, 0, 60, 30, TRUE) ; return 0 ;
case WM_COMMAND:
if((HWND)lParam == hwndChkButton) {
VARIANT_BOOL pOK = VARIANT_FALSE;
do{
strText2="http://〇〇〇/△△△/□□□" CComVariant vempty, vUrlTTEST(strText2); pWB2->Navigate2(&vUrlTTEST, &vempty, &vempty, &vempty, &vempty );
CComPtr<IDispatch> pdisp; CComQIPtr<IHTMLDocument2> pDocW; while(1) { HRESULT hr = pWB2->get_Document(&pdisp); if(SUCCEEDED(hr) && pdisp != NULL) { pDocW = pdisp; if(pDocW != NULL) { break; } } Sleep(100); }
SHDocVw::IWebBrowser2Ptr pIE; pIE = FindIE(hwnd); //WebBrowserを取得する
//HTMLドキュメント取得 MSHTML::IHTMLDocument3Ptr pDoc = pIE->GetDocument();
MSHTML::IHTMLDocument3Ptr pDoc1 = pDoc;
BSTR bstrId = SysAllocString(_TEXT(L"div")); MSHTML::IHTMLElementCollectionPtr elementp; //elementp=doc3p->getElementsByTagName(bstrId); elementp = pDoc1->getElementsByTagName(bstrId);
//----------------------------------------------------------- // //※「a hrefの"http://ddd/eee/fff" を取得」 // //getAref="http://ddd/eee/fff"; // // //-----------------------------------------------------------
//保持していた「tmpAref="http://aaa/bbb/ccc"」と上記で取得したgetArefを比較 if( strcmp( _bstr_t(tmpAref), _bstr_t(getAref) )== 0 ){
pOK == VARIANT_FALSE;
//************************************************************* //************************************************************* //画面を更新し最新のHTMLを取得したい・・・・・が更新前の情報のまま pWB2->Navigate2(&vUrlTTEST, &vempty, &vempty, &vempty, &vempty ); //************************************************************* //*************************************************************
} else{
//submit処理へ //ループを抜ける pOK == VARIANT_TRUE;
}
Sleep(1000);
}while(pOK == VARIANT_FALSE);
}
SHDocVw::IWebBrowser2Ptr FindIE(HWND hwnd) { MSHTML::IHTMLDocumentPtr pDoc = FindHtmlDocument(hwnd); if (pDoc != NULL) { return FindWebBrowser(pDoc); } return NULL; }
他の方のサイトを調べて勉強中ですが行き詰りました。 どのようにすれば画面を更新させることができますでしょうか。
何卒ご協力、ご教示頂きたく宜しくお願い致します。
|
|