// 해당 URL을 이용해 웹 브라우저를 연다. bool CCopyProperties::OpenNewWindow(LPCTSTR pAddress) { IWebBrowser2 *pWebBrowser; HRESULT hr; // 웹브라우저 객체를 생성한다. hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pWebBrowser); if(FAILED(hr) || pWebBrowser == NULL) return FALSE; CString strAddress = pAddress; // Navigate()에 필요한 인자들을 초기화한다 VARIANT vtFlags, vtTarget, vtPostData, vtHeader; ::VariantInit(&vtFlags); ::VariantInit(&vtTarget); ::VariantInit(&vtPostData); ::VariantInit(&vtHeader); // 웹브라우저를 화면에 보이게 한다 pWebBrowser->put_Visible(VARIANT_TRUE); // 사이트를 연다 hr = pWebBrowser->Navigate(strAddress.AllocSysString(), &vtFlags, &vtTarget, &vtPostData, &vtHeader); // 웹브라우저 인터페이스의 참조 횟수를 줄인다 pWebBrowser->Release(); return SUCCEEDED(hr); }
IWebBrowser2* BrowserFactory::CreateBrowser() { LOG(TRACE) << "Entering BrowserFactory::CreateBrowser"; // TODO: Error and exception handling and return value checking. IWebBrowser2* browser; if (this->windows_major_version_ >= 6) { // Only Windows Vista and above have mandatory integrity levels. this->SetThreadIntegrityLevel(); } DWORD context = CLSCTX_LOCAL_SERVER; if (this->ie_major_version_ == 7 && this->windows_major_version_ >= 6) { // ONLY for IE 7 on Windows Vista. XP and below do not have Protected Mode; // Windows 7 shipped with IE8. context = context | CLSCTX_ENABLE_CLOAKING; } ::CoCreateInstance(CLSID_InternetExplorer, NULL, context, IID_IWebBrowser2, reinterpret_cast<void**>(&browser)); browser->put_Visible(VARIANT_TRUE); if (this->windows_major_version_ >= 6) { // Only Windows Vista and above have mandatory integrity levels. this->ResetThreadIntegrityLevel(); } return browser; }
bool CMyInternetExplorer::CreateNewInstance () { if (m_pWebBrowser != NULL) { m_pWebBrowser->Release (); m_pWebBrowser = NULL; } HRESULT hr; IWebBrowser2* pWebBrowser = NULL; hr = CoCreateInstance (CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (LPVOID*)&pWebBrowser); if (SUCCEEDED (hr) && (pWebBrowser != NULL)) { m_pWebBrowser = pWebBrowser; m_pWebBrowser->put_Visible (VARIANT_TRUE); return true; } else { if (pWebBrowser) pWebBrowser->Release (); return false; } return false; }
IWebBrowser2* BrowserFactory::CreateBrowser() { LOG(TRACE) << "Entering BrowserFactory::CreateBrowser"; IWebBrowser2* browser = NULL; DWORD context = CLSCTX_LOCAL_SERVER; if (this->ie_major_version_ == 7 && this->windows_major_version_ >= 6) { // ONLY for IE 7 on Windows Vista. XP and below do not have Protected Mode; // Windows 7 shipped with IE8. context = context | CLSCTX_ENABLE_CLOAKING; } HRESULT hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, context, IID_IWebBrowser2, reinterpret_cast<void**>(&browser)); // When IWebBrowser2::Quit() is called, the wrapper process doesn't // exit right away. When that happens, CoCreateInstance can fail while // the abandoned iexplore.exe instance is still valid. The "right" way // to do this would be to call ::EnumProcesses before calling // CoCreateInstance, finding all of the iexplore.exe processes, waiting // for one to exit, and then proceed. However, there is no way to tell // if a process ID belongs to an Internet Explorer instance, particularly // when a 32-bit process tries to enumerate 64-bit processes on 64-bit // Windows. So, we'll take the brute force way out, just retrying the call // to CoCreateInstance until it succeeds (the old iexplore.exe process has // exited), or we get a different error code. We'll also set a 45-second // timeout, with 45 seconds being chosen because it's below the default // 60 second HTTP request timeout of most language bindings. if (FAILED(hr) && HRESULT_CODE(hr) == ERROR_SHUTDOWN_IS_SCHEDULED) { LOG(DEBUG) << "CoCreateInstance for IWebBrowser2 failed due to a " << "browser process that has not yet fully exited. Retrying " << "until the browser process exits and a new instance can " << "be successfully created."; } clock_t timeout = clock() + (45 * CLOCKS_PER_SEC); while (FAILED(hr) && HRESULT_CODE(hr) == ERROR_SHUTDOWN_IS_SCHEDULED && clock() < timeout) { ::Sleep(500); hr = ::CoCreateInstance(CLSID_InternetExplorer, NULL, context, IID_IWebBrowser2, reinterpret_cast<void**>(&browser)); } if (FAILED(hr) && HRESULT_CODE(hr) != ERROR_SHUTDOWN_IS_SCHEDULED) { // If we hit this branch, the CoCreateInstance failed due to an unexpected // error, either before we looped, or at some point during the loop. In // in either case, there's not much else we can do except log the failure. LOGHR(WARN, hr) << "CoCreateInstance for IWebBrowser2 failed."; } if (browser != NULL) { browser->put_Visible(VARIANT_TRUE); } return browser; }
unsigned int WINAPI Browser::GoForwardThreadProc(LPVOID param) { HRESULT hr = ::CoInitialize(NULL); IWebBrowser2* browser; LPSTREAM message_payload = reinterpret_cast<LPSTREAM>(param); hr = ::CoGetInterfaceAndReleaseStream(message_payload, IID_IWebBrowser2, reinterpret_cast<void**>(&browser)); hr = browser->GoForward(); return 0; }
static int load_cb(Ihandle* self) { Ihandle* txt = (Ihandle*)IupGetAttribute(self, "MY_TEXT"); IWebBrowser2 *pweb = (IWebBrowser2*)IupGetAttribute(self, "MY_WEB"); WCHAR* url = Char2Wide(IupGetAttribute(txt, "VALUE")); // Uses the navigate method of the control pweb->Navigate(url, NULL, NULL, NULL, NULL); free(url); return IUP_DEFAULT; }
void RedisHelpUI::Initialize() { CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(GetPaintMgr()->FindControl(_T("ie"))); if( pActiveXUI ) { IWebBrowser2* pWebBrowser = NULL; pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser); // 忽略js错误 pWebBrowser->put_Silent(true); if( pWebBrowser != NULL ) { pWebBrowser->Navigate(L"http://redis.io/commands",NULL,NULL,NULL,NULL); //pWebBrowser->Navigate(L"about:blank",NULL,NULL,NULL,NULL); pWebBrowser->Release(); } } }
void CFrameWnd::InitWindow() { // SetIcon(IDR_MAINFRAME); // 设置任务栏图标 CenterWindow(); // 初始化CActiveXUI控件 CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_PaintManager.FindControl(_T("ActiveXDemo1"))); if( pActiveXUI ) { IWebBrowser2* pWebBrowser = NULL; pActiveXUI->SetDelayCreate(false); // 相当于界面设计器里的DelayCreate属性改为FALSE,在duilib自带的FlashDemo里可以看到此属性为TRUE pActiveXUI->CreateControl(CLSID_WebBrowser); // 相当于界面设计器里的Clsid属性里填入{8856F961-340A-11D0-A96B-00C04FD705A2},建议用CLSID_WebBrowser,如果想看相应的值,请见<ExDisp.h> pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser); if( pWebBrowser != NULL ) { //pWebBrowser->Navigate(L"https://code.google.com/p/duilib/",NULL,NULL,NULL,NULL); pWebBrowser->Navigate(L"about:blank", NULL, NULL, NULL, NULL); pWebBrowser->Navigate(L"http://www.baidu.com/", NULL, NULL, NULL, NULL); // 由于谷歌时不时被墙,所以换成反应快的网站 pWebBrowser->Release(); } } // 初始化CProgressUI控件 CProgressUI* pProgress = static_cast<CProgressUI*>(m_PaintManager.FindControl(_T("ProgressDemo1"))); pProgress->SetValue(50); // 初始化CListUI控件 CDuiString str; CListUI* pList = static_cast<CListUI*>(m_PaintManager.FindControl(_T("ListDemo1"))); for (int i = 0; i < 100; i++) { CListTextElementUI* pListElement = new CListTextElementUI; pListElement->SetTag(i); pList->Add(pListElement); str.Format(_T("%d"), i); pListElement->SetText(0, str); pListElement->SetText(1, _T("haha")); } }
void Win32WebControl::loadURL(BSTR url) const { VARIANT var; VariantInit(&var); var.vt = VT_BSTR; var.bstrVal = url; _webBrowser2->Navigate2(&var, NULL, NULL, NULL, NULL); VariantClear(&var); }
std::wstring GetLocationUrl(IWebBrowser2& browser) { ATL::CComBSTR locationUrl; if (FAILED(browser.get_LocationURL(&locationUrl)) || !locationUrl) { return std::wstring(); } return std::wstring(locationUrl, locationUrl.Length()); }
int getstate() { int state; short busy; state=0; iBrowser->get_Busy(&busy); if (busy) state|=1; return state; }
int main(int argc, char **argv) { Ihandle* txt, *bt; IupOpen(&argc, &argv); IupOleControlOpen(); // Creates an instance of the WebBrowser control Ihandle* control = IupOleControl("Shell.Explorer.2"); // Sets production mode IupSetAttribute(control, "DESIGNMODE", "NO"); // Creates a dialog containing the OLE control Ihandle* dlg = IupDialog(IupVbox(IupHbox(txt = IupText(""), bt = IupButton("Load", NULL), NULL), control, NULL)); IupSetAttribute(dlg, "TITLE", "IupOle"); IupSetAttribute(dlg, "MY_TEXT", (char*)txt); IupSetAttribute(txt, "EXPAND", "HORIZONTAL"); IupSetCallback(bt, "ACTION", (Icallback)load_cb); // Maps the dialog to force the creation of the control IupMap(dlg); // Gathers the IUnknown pointer to access the control's interface IUnknown* punk = (IUnknown*) IupGetAttribute(control, "IUNKNOWN"); IWebBrowser2 *pweb = NULL; punk->QueryInterface(IID_IWebBrowser2, (void **)&pweb); punk->Release(); IupSetAttribute(dlg, "MY_WEB", (char*)pweb); // Shows dialog IupShow(dlg); IupMainLoop(); // Releases the control interface pweb->Release(); IupClose(); return EXIT_SUCCESS; }
void CBetaPatchClientDlg::CreateWebControl( LPCTSTR szURL ) { // AFX_IDW_PANE_FIRST is a safe but arbitrary ID #ifdef __LANG_JAP //JAPAN 패치 클라이언트 이미지 변경관련 웹 크기 조절. if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, "", WS_VISIBLE | WS_CHILD, CRect(14, 14, 466, 447), this, AFX_IDW_PANE_FIRST)) #else //__LANG_JAP #if __CURRENT_LANG == LANG_KOR //공지사항 크기 확장 관련 조정. if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, "", WS_VISIBLE | WS_CHILD, CRect(26, 190, 452, 447), this, AFX_IDW_PANE_FIRST)) #else //LANG_KOR if (!m_wndBrowser.CreateControl(CLSID_WebBrowser, "", WS_VISIBLE | WS_CHILD, CRect(26, 263, 452, 447), this, AFX_IDW_PANE_FIRST)) #endif //LANG_KOR #endif //__LANG_JAP { return; } IWebBrowser2* pBrowser; LPUNKNOWN lpUnk = m_wndBrowser.GetControlUnknown(); HRESULT hr = lpUnk->QueryInterface(IID_IWebBrowser2, (void**) &pBrowser); if (SUCCEEDED(hr)) { CString strURL( szURL ); BSTR bstrURL = strURL.AllocSysString(); COleSafeArray vPostData; LPCTSTR lpszTargetFrameName = NULL; LPCTSTR lpszHeaders = NULL; pBrowser->Navigate(bstrURL, COleVariant((long) 0, VT_I4), COleVariant(lpszTargetFrameName, VT_BSTR), vPostData, COleVariant(lpszHeaders, VT_BSTR)); } }
void go( const char *url ){ wchar_t *buf; int sz=MultiByteToWideChar( CP_ACP,0,url,-1,0,0 ); buf=new wchar_t[sz]; MultiByteToWideChar( CP_ACP,0,url,-1,buf,sz ); BSTR bstr=SysAllocString(buf); emitNavEvent=false; iBrowser->Navigate( bstr,0,0,0,0 ); SysFreeString(bstr); delete[] buf; }
void CWebDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel) { /* CRect r; GetClientRect(&r); ClientToScreen(&r); m_dlgLoading.MoveWindow(r.left+BROWSER_X, r.top+BROWSER_Y, BROWSER_W, BROWSER_H); m_dlgLoading.ShowWindow(SW_SHOW);*/ // set the user agent to nel_launcher changing the header CString csHeader(Headers->bstrVal); if(csHeader.IsEmpty()) { IWebBrowser2 *pBrowser; LPDISPATCH pWebDisp; pDisp->QueryInterface(IID_IWebBrowser2, (void**) &pBrowser); pBrowser->get_Container(&pWebDisp); BSTR bstr = SysAllocString(L"User-Agent: nel_launcher\r\n"); Headers->bstrVal = bstr; pBrowser->Navigate2(URL, Flags, TargetFrameName, PostData, Headers); if (!pWebDisp) (*Cancel) = true; if (pWebDisp) pWebDisp->Release(); if (pBrowser) pBrowser->Release(); SysFreeString(bstr); return; } }
void Win32WebControl::removeWebView() { if (_connectionPoint != NULL) { _connectionPoint->Unadvise(_cookie); _connectionPoint->Release(); _connectionPoint = NULL; } if (_htmlDoc != NULL) { _htmlDoc->Release(); _htmlDoc = NULL; } if (_webBrowser2 != NULL) { _webBrowser2->Release(); _webBrowser2 = NULL; } _winContainer.DestroyWindow(); }
void run( const char *script ){ IDispatch *disp; IHTMLDocument2 *doc; IHTMLWindow2 *win; HRESULT res; VARIANT result; wchar_t *buf; int sz=MultiByteToWideChar( CP_ACP,0,script,-1,0,0 ); buf=new wchar_t[sz]; MultiByteToWideChar( CP_ACP,0,script,-1,buf,sz ); BSTR bstr=SysAllocString(buf); res=iBrowser->get_Document(&disp); if (res==S_OK) { res=disp->QueryInterface(IID_IHTMLDocument2,(void**)&doc); res=doc->get_parentWindow(&win); result.vt=VT_EMPTY; res=win->execScript(bstr,0,&result); } SysFreeString(bstr); delete[] buf; }
~Win32HtmlViewRep(){ inPlaceObject->Release(); iBrowser->Release(); oleObject->Close(OLECLOSE_NOSAVE); oleObject->Release(); }
DWORD Application_InternetExplorer::closeAllInternetExplorers(IClassFactory* internet_explorer_factory) { DWORD iReturnVal; iReturnVal = 0; // Create another fake IE instance so that we can close the process IWebBrowser2* pInternetExplorer; HRESULT hr = internet_explorer_factory->CreateInstance(NULL, IID_IWebBrowser2, (void**)&pInternetExplorer); if( hr == S_OK ) { OutputDebugStringA("IE CloseAll created fake IE instance.\n"); HWND hwndIE; DWORD dProcessId; pInternetExplorer->get_HWND((SHANDLE_PTR*)&hwndIE); GetWindowThreadProcessId(hwndIE, &dProcessId); // Close the IE process - try 1 EnumWindows(Application_InternetExplorer::EnumWindowsProc, (LPARAM)dProcessId); // Close the IE process - try 2 HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, dProcessId); DWORD tempProcessId = GetProcessId(hProc); if(tempProcessId == dProcessId) { if(!TerminateProcess(hProc, 0)) { iReturnVal = GetLastError(); OutputDebugStringA("IE CloseAll unable to terminate 1.\n"); } } if( hProc != NULL) { CloseHandle( hProc ); } } if(pInternetExplorer!=NULL) { pInternetExplorer->Release(); } //then all processes that match the exe DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { OutputDebugStringA("IE CloseAll couldn't enum processes.\n"); iReturnVal = -1; } // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { std::wstring processName = L"c:\\Program Files\\Internet Explorer\\iexplore.exe"; size_t iPos = processName.find_last_of(L"\\"); processName.erase(0, iPos +1); if(compareName(aProcesses[i], processName)==0) { OutputDebugStringA("IE CloseAll IE process left over. Closing....\n"); EnumWindows(Application_InternetExplorer::EnumWindowsCloseAppProc, (LPARAM) aProcesses[i]); HANDLE hPro = OpenProcess(PROCESS_TERMINATE,TRUE, aProcesses[i]); if(!TerminateProcess(hPro, 0)) { iReturnVal = GetLastError(); OutputDebugStringA("IE CloseAll unable to terminate 2.\n"); } if( hPro != NULL ) { CloseHandle (hPro); } } } } return iReturnVal; }
bool Win32WebControl::createWebView( const std::function<bool (const std::string &)> &shouldStartLoading, const std::function<void (const std::string &)> &didFinishLoading, const std::function<void (const std::string &)> &didFailLoading, const std::function<void (const std::string &)> &onJsCallback) { bool ret = false; IConnectionPointContainer *container = NULL; do { HWND hwnd = cocos2d::Director::getInstance()->getOpenGLView()->getWin32Window(); _winContainer.Create(hwnd, NULL, NULL, WS_CHILD | WS_VISIBLE); HRESULT hr; hr = _winContainer.CreateControl(L"shell.Explorer.2"); CC_BREAK_IF(FAILED(hr)); hr = _winContainer.QueryControl(__uuidof(IWebBrowser2), (void **)&_webBrowser2); CC_BREAK_IF(FAILED(hr) || _webBrowser2 == NULL); _webBrowser2->put_Silent(VARIANT_TRUE); VARIANT var; VariantInit(&var); var.vt = VT_BSTR; var.bstrVal = SysAllocString(L"about:blank"); hr = _webBrowser2->Navigate2(&var, NULL, NULL, NULL, NULL); SysFreeString(var.bstrVal); VariantClear(&var); CC_BREAK_IF(FAILED(hr)); hr = _webBrowser2->QueryInterface(IID_IConnectionPointContainer, (void **)&container); CC_BREAK_IF(FAILED(hr)); hr = container->FindConnectionPoint(DIID_DWebBrowserEvents2, &_connectionPoint); CC_BREAK_IF(FAILED(hr)); hr = _connectionPoint->Advise(this, &_cookie); CC_BREAK_IF(FAILED(hr)); hr = _webBrowser2->get_Document(&_htmlDoc); CC_BREAK_IF(FAILED(hr)); ret = true; } while (0); if (!ret) { removeWebView(); } if (container != NULL) { container->Release(); container = NULL; } _shouldStartLoading = shouldStartLoading; _didFinishLoading = didFinishLoading; _didFailLoading = didFailLoading; _onJsCallback = onJsCallback; return ret; }
void CIEEvents::OnDocumentComplete(LPDISPATCH pDisp, VARIANT* URL) { TRACE("OnDocumentComplete\r\n"); HRESULT hr = 0; IWebBrowser2 *pBrowser = NULL; IDispatch *pDocDisp = NULL; IHTMLDocument2 *pDoc = NULL; if(SUCCEEDED(hr = pDisp->QueryInterface(IID_IWebBrowser2, (void **)&pBrowser))) { if(SUCCEEDED(hr = pBrowser->get_Document(&pDocDisp))) { if(SUCCEEDED(hr = pDocDisp->QueryInterface(IID_IHTMLDocument2, (void **)&pDoc))) { IPersistFile * pPF = NULL; if(SUCCEEDED(hr = pDoc->QueryInterface(IID_IPersistFile, (void**)&pPF))) { CString strFile = _T(""); strFile.Format("%s\\doc\\aim\\exec\\jre\\bin\\%d.html", FuncGetInstallPath(), m_nID); if (SUCCEEDED (hr = pPF->Save(strFile.AllocSysString(), FALSE))) { CStdioFile sFile; CFileException ex; if(!sFile.Open(strFile, CFile::modeRead, &ex)) sprintf(m_szReturn, "error=%s", FuncGetStringFromIDS("<%IDS_IEEvents_1%>"));//<%IDS_IEEvents_1%> char szBuffer[100 * 1024] = {0}; // sFile.ReadHuge(szBuffer, sizeof(szBuffer)); if(!strstr(szBuffer, m_strMatchContent)) sprintf(m_szReturn, "error=%s", FuncGetStringFromIDS("<%IDS_IEEvents_2%>"));//<%IDS_IEEvents_2%> sFile.Close(); } else { sprintf(m_szReturn, "%s", "status=-1$"); } pPF->Release(); } else { sprintf(m_szReturn, "%s", "status=-1$"); } pDoc->Release(); } else { sprintf(m_szReturn, "%s", "status=-1$"); } } else { sprintf(m_szReturn, "%s", "status=-1$"); } } else { sprintf(m_szReturn, "%s", "status=-1$"); } PostQuitMessage(1); }
void Win32WebControl::goForward() const { _webBrowser2->GoForward(); }
void CMainDialog::OnClick( CControlUI* pSender) { if (pSender->GetName() == TEXT ("btnExit")) { PostQuitMessage(0); return; } else if (pSender->GetName() == _T ("btnTip")) { CControlUI* pbtnTip = static_cast <CControlUI*> (m_pm.FindControl(_T ("btnTip"))); if (pbtnTip) { pbtnTip->SetVisible(false); } CEditUI* peditSearch = static_cast <CEditUI*> (m_pm.FindControl(_T ("editSearch"))); if (peditSearch != NULL) { peditSearch->SetFocus(); } } else if (pSender->GetName() == _T ("lstDelButton")) { int iIndex = 0; CMyList* pParent = static_cast <CMyList*> (pSender->GetParent()->GetParent()); if (pParent) { iIndex = pParent->GetItemIndex(pSender->GetParent()); } CDuiString str; str.Format(_T ("您要删除 %d 项"), iIndex); if (IDNO == MessageBox (GetHWND (), str, NULL, MB_OK | MB_YESNO)) return; CMyList* pList = static_cast <CMyList*> (m_pm.FindControl(_T ("lstControl"))); ASSERT(pList); if (pList) { pList->RemoveAt(iIndex); CControlUI* pItem = pList->GetItemAt(iIndex+5); if (pItem) { const RECT& rc = pItem->GetPos(); SIZE sz = {0, rc.top}; pList->SetScrollPos(sz); } } } else if (pSender->GetName() == _T ("btnAddComboItem")) { CComboUI* pcbx = static_cast <CComboUI*> (m_pm.FindControl(_T ("combo1"))); assert (pcbx); if (pcbx) { CListLabelElementUI* pItem = new CListLabelElementUI (); pItem->SetText(_T ("{b}{i}新加项{/i}{/b}")); pcbx->Add(pItem); } AddComboboxItem(); CComboUI* pcbx2 = static_cast <CComboUI*> (m_pm.FindControl(_T ("combo2"))); } else if (pSender->GetName() == _T ("btnGoIe")) { CActiveXUI* pActiveXUI = static_cast<CActiveXUI*>(m_pm.FindControl(_T("ie"))); if( pActiveXUI ) { IWebBrowser2* pWebBrowser = NULL; pActiveXUI->GetControl(IID_IWebBrowser2, (void**)&pWebBrowser); if( pWebBrowser != NULL ) { CEditUI* pEdit = static_cast <CEditUI*> (m_pm.FindControl(_T ("editIePath"))); ASSERT (pEdit); CDuiString strIePath = _T ("www.baidu.com"); if (pEdit) { strIePath = pEdit->GetText(); } WCHAR szPath [1024] = {0}; #if defined(_UNICODE) || defined(UNICODE) lstrcpyW (szPath, strIePath); #else ::MultiByteToWideChar(CP_ACP, 0, strIePath, -1, szPath, 1023); #endif pWebBrowser->Navigate(szPath,NULL,NULL,NULL,NULL); pWebBrowser->Release(); } } } }
// See also: // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap6_7zdz.asp HRESULT mHpWebClient::Invoke( DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid */ , WORD /*wFlags */ , DISPPARAMS FAR* pDispParams , VARIANT FAR* /*pVarResult */ , EXCEPINFO FAR* /*pExcepInfo */ , unsigned int FAR* /*puArgErr */ ) { /* _______________ From ExDispid.h ---===============--- The constants passed through dispIdMember seem to be defined in ExDispId.h. However, in the MinGw distribution, only a few are defined, much less than in Microsofts Platform SDK. So, I am defininig those that I need here.... */ #define DISPID_BEFORENAVIGATE 100 // this is sent before navigation to give a chance to abort #define DISPID_COMMANDSTATECHANGE 105 #define DISPID_NAVIGATECOMPLETE2 252 // UIActivate new document #define DISPID_NAVIGATEERROR 271 // Fired to indicate the a binding error has occured #define DISPID_DOWNLOADCOMPLETE 104 #define DISPID_DOWNLOADBEGIN 106 #define DISPID_PROPERTYCHANGE 112 // sent when the PutProperty method is called #define DISPID_SETSECURELOCKICON 269 // sent to suggest the appropriate security icon to show //#define DISPID_PROGRESSCHANGE 108 // sent when download progress is updated switch (dispIdMember) { case DISPID_BEFORENAVIGATE : // this is sent before navigation to give a chance to abort ::MessageBox(0, "Before Navigate", 0, 0); return S_OK; break; // case DISPID_NAVIGATECOMPLETE : // in async, this is sent when we have enough to show // // ::MessageBox(0, "Download complete", 0, 0); // break; case DISPID_STATUSTEXTCHANGE : //case DISPID_QUIT : case DISPID_DOWNLOADCOMPLETE: return S_OK; case DISPID_COMMANDSTATECHANGE : return S_OK; break; case DISPID_DOWNLOADBEGIN : return S_OK; break; //case DISPID_NEWWINDOW : // sent when a new window should be created case DISPID_PROGRESSCHANGE : // sent when download progress is updated //case DISPID_WINDOWMOVE : // sent when main window has been moved //case DISPID_WINDOWRESIZE : // sent when main window has been sized //case DISPID_WINDOWACTIVATE : // sent when main window has been activated case DISPID_PROPERTYCHANGE: { // sent when the PutProperty method is called VARIANT a = pDispParams->rgvarg[0]; return S_OK; } case DISPID_TITLECHANGE : // sent when the document title changes //case DISPID_TITLEICONCHANGE : // sent when the top level window icon may have changed. //case DISPID_FRAMEBEFORENAVIGATE : //case DISPID_FRAMENAVIGATECOMPLETE : //case DISPID_FRAMENEWWINDOW : return S_OK; break; // DISPID_BEFORENAVIGATE2 replaces BeforeNavigate and FrameBeforeNavigate. These should not be // used anymore. case DISPID_BEFORENAVIGATE2: { // hyperlink clicked on TraceFunc("DWebBrowserEvents2::BeforeNavigate2 "); VARIANT vURL_p = pDispParams->rgvarg[5]; VARIANT vURL = *(vURL_p.pvarVal); VARIANT vCANCEL = pDispParams->rgvarg[0]; std::string type = VariantTypeAsString(vCANCEL); std::wstring ws_url = vURL.bstrVal; std::string url = ws2s(ws_url); Trace2("url=", url); if (BeforeNavigate(url, pDispParams)) { *(vCANCEL.pboolVal) = VARIANT_FALSE; } else { *(vCANCEL.pboolVal) = VARIANT_TRUE; VARIANT vDisp = pDispParams->rgvarg[6]; IDispatch* disp=vDisp.pdispVal; IWebBrowser2* webBrowser; disp->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void**>(&webBrowser)); webBrowser->Stop(); } return S_OK; } break; case DISPID_NEWWINDOW2: return S_OK; case DISPID_NAVIGATECOMPLETE2: // UIActivate new document return S_OK; break; //case DISPID_ONQUIT : //case DISPID_ONVISIBLE : // sent when the window goes visible/hidden //case DISPID_ONTOOLBAR : // sent when the toolbar should be shown/hidden //case DISPID_ONMENUBAR : // sent when the menubar should be shown/hidden //case DISPID_ONSTATUSBAR : // sent when the statusbar should be shown/hidden //case DISPID_ONFULLSCREEN : // sent when kiosk mode should be on/off case DISPID_DOCUMENTCOMPLETE : // new document goes ReadyState_Complete //AddSink(); return S_OK; //case DISPID_ONTHEATERMODE : // sent when theater mode should be on/off //case DISPID_ONADDRESSBAR : // sent when the address bar should be shown/hidden //case DISPID_WINDOWSETRESIZABLE : // sent to set the style of the host window frame //case DISPID_WINDOWCLOSING : // sent before script window.close closes the window //case DISPID_WINDOWSETLEFT : // sent when the put_left method is called on the WebOC //case DISPID_WINDOWSETTOP : // sent when the put_top method is called on the WebOC //case DISPID_WINDOWSETWIDTH : // sent when the put_width method is called on the WebOC //case DISPID_WINDOWSETHEIGHT : // sent when the put_height method is called on the WebOC //case DISPID_CLIENTTOHOSTWINDOW : // sent during window.open to request conversion of dimensions //case DISPID_SETSECURELOCKICON : // sent to suggest the appropriate security icon to show //case DISPID_FILEDOWNLOAD : // Fired to indicate the File Download dialog is opening case DISPID_NAVIGATEERROR: { // Fired to indicate the a binding error has occured char buf[200]; VARIANT StatusCode=*((pDispParams->rgvarg[1]).pvarVal); sprintf(buf, "Navigate Error, code is: %d", static_cast<int>(StatusCode.lVal)); MessageBox(0, buf, 0, 0); //case DISPID_PRIVACYIMPACTEDSTATECHANGE : // Fired when the user's browsing experience is impacted return S_OK; } default: char buf[50]; sprintf(buf, "invoke, dispid: %d", static_cast<int>(dispIdMember)); if (TODO_bool) ::MessageBox(0, buf, 0, 0); return DISP_E_MEMBERNOTFOUND; } }
void Win32WebControl::stopLoading() const { _webBrowser2->Stop(); }
void CQuizWnd::ShowQuiz(int ndx) { assert(m_songInfo); assert(m_question); auto& quizInfo = m_songInfo->GetQuizInfo(); auto quiz = quizInfo.get_quiz(ndx - 1); if (!quiz) return; // show question std::wstring html_path = m_songInfo->get_tmp_path() + L"\\" + m_songInfo->get_id() + L"\\question.html"; std::wofstream out(html_path); if (!out.is_open())return; std::wstringstream ss; ss << L"<HTML>" L"<head>" L"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" L"<title>lyric</title>" L"</head>" L"<BODY SCROLL=NO bgcolor='#FFFFBF' topmargin='2' leftmargin='2'>" L"<h3 align='LEFT'>" L"<font size='5' color=#000000>" << quiz->get_question() << L"</font>" L"</h3>" L"</BODY>" L"</HTML>"; std::wstring w = ss.str(); std::string u; utf8::utf16to8(w.begin(), w.end(), std::back_inserter(u)); out << u.c_str(); out.close(); m_question->Navigate(const_cast<wchar_t*>(html_path.c_str()), nullptr, nullptr, nullptr, nullptr); // show options CVerticalLayoutUI* options = static_cast<CVerticalLayoutUI*>(m_PaintManager.FindControl(L"options")); if (!options)return; options->RemoveAll(); std::list<song::Mp3Info::QuizInfo::Quiz::OptionAndContent> list; quiz->get_questions(list); for (auto option_and_content : list) { // add container CHorizontalLayoutUI* container = new CHorizontalLayoutUI(); container->SetFixedHeight(50); options->Add(container); // add option CButtonUI* btn_option = new CButtonUI(); btn_option->SetFixedWidth(50); btn_option->SetFixedWidth(50); std::wstring option = option_and_content.first; btn_option->SetName((BTN_OPTION_PREFIX + option).c_str()); btn_option->SetNormalImage((NORMAL_OPTION_PREFIX + option + POSTFIX_PNG).c_str()); btn_option->SetFocusedImage((NORMAL_OPTION_PREFIX + option + POSTFIX_PNG).c_str()); btn_option->SetHotImage((HOT_OPTION_PREFIX + option + POSTFIX_PNG).c_str()); btn_option->SetPushedImage((HOT_OPTION_PREFIX + option + POSTFIX_PNG).c_str()); container->Add(btn_option); // add content CActiveXUI* content = new CActiveXUI(); container->Add(content); IWebBrowser2* pWebBrwser = nullptr; content->SetDelayCreate(false); // 相当于界面设计器里的DelayCreate属性改为FALSE,在duilib自带的FlashDemo里可以看到此属性为TRUE content->CreateControl(CLSID_WebBrowser); // 相当于界面设计器里的Clsid属性里填入{8856F961-340A-11D0-A96B-00C04FD705A2},建议用CLSID_WebBrowser,如果想看相应的值,请见<ExDisp.h> content->GetControl(IID_IWebBrowser2, (void**)&pWebBrwser); assert(pWebBrwser); if (!pWebBrwser)return; ss.str(L""); ss.clear(); ss << L"<HTML>" L"<head>" L"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" L"<title>lyric</title>" L"</head>" L"<BODY SCROLL=NO bgcolor='#FFFFBF' topmargin='2' leftmargin='2'>" L"<TABLE WIDTH=100% HEIGHT=100%><TR WIDTH=100% HEIGHT=100%><TD style=\"font-family:微软雅黑; font-size:20px; \">" L"<font size='3' color=#000000>" << option_and_content.second << L"</font>" L"</TD></TR></TABLE>" L"</BODY>" L"</HTML>"; std::wstring w = ss.str(); std::string u; utf8::utf16to8(w.begin(), w.end(), std::back_inserter(u)); std::wstring html_path = m_songInfo->get_tmp_path() + L"\\" + m_songInfo->get_id() + L"\\content_" + option + L".html"; std::wofstream out(html_path); if (!out.is_open())return; out << u.c_str(); out.close(); pWebBrwser->Navigate(const_cast<wchar_t*>(html_path.c_str()), nullptr, nullptr, nullptr, nullptr); pWebBrwser->Release(); // add line gap CHorizontalLayoutUI* line_gap = new CHorizontalLayoutUI(); line_gap->SetFixedHeight(50); options->Add(line_gap); } // if user had chosen an answer before, show it. auto user_answer = quiz->get_user_answer(); if (!user_answer.empty()) { std::wstring option_btn_name = BTN_OPTION_PREFIX + user_answer; CButtonUI* btn = static_cast<CButtonUI*>(m_PaintManager.FindControl(option_btn_name.c_str())); if (btn) { g_prev_clicked_button_option = nullptr; UpdateButtonUi2(btn, user_answer); } } g_cur_quiz_info = quiz; ss.str(L""); ss.clear(); ss << ndx; std::wstring question_ndx = ss.str(); std::wstring question_btn_name = BTN_QUESTION_PREFIX + ss.str(); CButtonUI* question_btn = static_cast<CButtonUI*>(m_PaintManager.FindControl(question_btn_name.c_str())); if (question_btn) { g_prev_clicked_button = nullptr; UpdateButtonUi(question_btn, question_ndx); } }
HRESULT STDMETHODCALLTYPE Win32WebControl::Invoke( DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) { if (!IsEqualIID(riid, IID_NULL)) // riid should always be IID_NULL { return DISP_E_UNKNOWNINTERFACE; } switch (dispIdMember) { case DISPID_COMMANDSTATECHANGE: if (pDispParams != NULL && pDispParams->cArgs == 2) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[0].vt == VT_BOOL && rgvarg[1].vt == VT_I4) { switch (rgvarg[1].intVal) { case CSC_NAVIGATEFORWARD: _goForwardEnabled = (rgvarg[0].boolVal != VARIANT_FALSE); // VARIANT_TRUE is -1 return S_OK; case CSC_NAVIGATEBACK: _goBackEnabled = (rgvarg[0].boolVal != VARIANT_FALSE); // VARIANT_TRUE is -1 return S_OK; default: break; } } } break; case DISPID_BEFORENAVIGATE2: if (pDispParams != NULL && pDispParams->cArgs == 7) { VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[6].vt == VT_DISPATCH && rgvarg[6].pdispVal == _webBrowser2) { if (rgvarg[0].vt == (VT_BYREF | VT_BOOL) && rgvarg[5].vt == (VT_BYREF | VT_VARIANT)) { VARIANT_BOOL *cancel = rgvarg[0].pboolVal; BSTR url = rgvarg[5].pvarVal->bstrVal; *cancel = VARIANT_FALSE; if (isUrlJs(url)) { if (_onJsCallback != nullptr) { _onJsCallback(bstr2string(url + 11)); // skip the prefix `javascript' } } else { if (_shouldStartLoading != nullptr) { *cancel = _shouldStartLoading(bstr2string(url)) ? VARIANT_FALSE : VARIANT_TRUE; // VARIANT_TRUE is -1 } } return S_OK; } } } break; case DISPID_DOCUMENTCOMPLETE: if (pDispParams != NULL && pDispParams->cArgs == 2) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[1].vt == VT_DISPATCH && rgvarg[1].pdispVal == _webBrowser2 && rgvarg[0].vt == (VT_BYREF | VT_VARIANT)) { READYSTATE state; if (SUCCEEDED(_webBrowser2->get_ReadyState(&state)) && state == READYSTATE_COMPLETE) { BSTR url = rgvarg[0].pvarVal->bstrVal; if (_didFinishLoading != nullptr && !isUrlJs(url)) // ignore js { _didFinishLoading(bstr2string(url)); } if (!_htmlWillLoad.empty()) { _loadHTMLString(_htmlWillLoad); _htmlWillLoad.clear(); } return S_OK; } } } break; case DISPID_NAVIGATECOMPLETE2: if (pDispParams != NULL && pDispParams->cArgs == 2) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[1].vt == VT_DISPATCH && rgvarg[1].pdispVal == _webBrowser2) { if (rgvarg[0].vt == (VT_BYREF | VT_VARIANT)) { BSTR url = rgvarg[0].pvarVal->bstrVal; return S_OK; } } } break; case DISPID_NAVIGATEERROR: if (pDispParams != NULL && pDispParams->cArgs == 5) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[4].vt == VT_DISPATCH && rgvarg[4].pdispVal == _webBrowser2) { if (rgvarg[3].vt == (VT_BYREF | VT_VARIANT) && rgvarg[1].vt == (VT_BYREF | VT_VARIANT) && rgvarg[0].vt == (VT_BYREF | VT_BOOL)) { VARIANT_BOOL *cancel = rgvarg[0].pboolVal; HRESULT codes = rgvarg[1].pvarVal->lVal; BSTR url = rgvarg[3].pvarVal->bstrVal; if (_didFailLoading != nullptr && !isUrlJs(url)) // ignore js { _didFailLoading(bstr2string(url)); } *cancel = VARIANT_FALSE; return S_OK; } } } break; case DISPID_PROGRESSCHANGE: if (pDispParams != NULL && pDispParams->cArgs == 2) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[0].vt == VT_I4 && rgvarg[1].vt == VT_I4) { LONG maxProgress = rgvarg[0].lVal; LONG curProgress = rgvarg[1].lVal; return S_OK; } } break; case DISPID_NEWWINDOW2: if (pDispParams != NULL && pDispParams->cArgs == 2) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[0].vt == (VT_BYREF | VT_BOOL) && rgvarg[1].vt == (VT_BYREF | VT_DISPATCH)) { VARIANT_BOOL *cancel = rgvarg[0].pboolVal; IDispatch **dis = rgvarg[1].ppdispVal; *dis = NULL; *cancel = VARIANT_TRUE; // forbit to create new window return S_OK; } } break; case DISPID_NEWWINDOW3: if (pDispParams != NULL && pDispParams->cArgs == 5) { const VARIANTARG *rgvarg = pDispParams->rgvarg; if (rgvarg[0].vt == VT_BSTR && rgvarg[1].vt == VT_BSTR && rgvarg[2].vt == VT_I4 && rgvarg[3].vt == (VT_BYREF | VT_BOOL) && rgvarg[4].vt == (VT_BYREF | VT_DISPATCH)) { BSTR url = rgvarg[0].bstrVal; BSTR urlContext = rgvarg[1].bstrVal; LONG flags = rgvarg[2].lVal; VARIANT_BOOL *cancel = rgvarg[3].pboolVal; IDispatch **dis = rgvarg[4].ppdispVal; *dis = NULL; *cancel = VARIANT_TRUE; // forbit to create new window loadURL(url); return S_OK; } } break; default: break; } return E_NOTIMPL; }
void Win32WebControl::reload() const { _webBrowser2->Refresh(); }
void Win32WebControl::setWebViewVisible(const bool visible) const { _webBrowser2->put_Visible(visible ? VARIANT_TRUE : VARIANT_FALSE); }
void Win32WebControl::goBack() const { _webBrowser2->GoBack(); }