// 해당 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; }
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; }
HWND MkWebBrowser::Open(const MkStr& pageUrl, int posX, int posY, int width, int height) { if (pageUrl.Empty()) return NULL; HRESULT hr; IWebBrowser2* pWebBrowser = NULL; VARIANT vtHeader2 = {0}; VARIANT vtTarget2 = {0}; VARIANT vtEmpty2 = {0}; vtHeader2.vt = VT_BSTR; vtHeader2.bstrVal = SysAllocString(L"Content-Type: application/x-www-form-urlencoded\r\n"); vtTarget2.vt = VT_BSTR; vtTarget2.bstrVal = SysAllocString(L"_top"); VariantInit(&vtEmpty2); CoInitialize(NULL); CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pWebBrowser); pWebBrowser->put_Width((long)width); pWebBrowser->put_Height((long)height); pWebBrowser->put_Left((long)posX); pWebBrowser->put_Top((long)posY); pWebBrowser->put_MenuBar(VARIANT_FALSE); pWebBrowser->put_ToolBar(VARIANT_FALSE); pWebBrowser->put_AddressBar(VARIANT_FALSE); pWebBrowser->put_StatusBar(VARIANT_FALSE); BSTR cBuf = SysAllocString(pageUrl.GetPtr()); hr = pWebBrowser->Navigate(cBuf, &vtEmpty2, &vtTarget2, &vtEmpty2, &vtHeader2); SysFreeString(cBuf); SysFreeString(vtHeader2.bstrVal); SysFreeString(vtTarget2.bstrVal); HWND exh = NULL; if (SUCCEEDED(hr)) { pWebBrowser->put_Visible(VARIANT_TRUE); pWebBrowser->get_HWND((long*)&exh); } else { pWebBrowser->Quit(); } pWebBrowser->Release(); CoUninitialize(); return exh; }
void Win32WebControl::setWebViewVisible(const bool visible) const { _webBrowser2->put_Visible(visible ? VARIANT_TRUE : VARIANT_FALSE); }