Beispiel #1
0
// 해당 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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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);
}