2025-11-28 00:35:46 +09:00

204 lines
5.3 KiB
C++

//-----------------------------------------------------------------------------
// File: WebHelper.h
// Desc: Class for opening a browser window and sending data via HTTP PUSH.
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
#include "ProtectedPlayback.h"
#include "WebHelper.h"
//-----------------------------------------------------------------------------
// Name: Init
// Desc: Initializes the InternetExplorer object.
//-----------------------------------------------------------------------------
HRESULT WebHelper::Init(DispatchCallback *pCallback)
{
m_pDispatchCB = pCallback;
IConnectionPointContainer *pCPContainer = NULL;
HWND hwndBrowser = NULL;
// Create the InternetExplorer object.
HRESULT hr = CoCreateInstance(CLSID_InternetExplorer, NULL,
CLSCTX_ALL, IID_IWebBrowser2, (void**)&m_pBrowser);
LOG_MSG_IF_FAILED(L"CoCreateInstance(CLSID_InternetExplorer)", hr);
// Set up the connection point so that we receive events.
if (SUCCEEDED(hr))
{
hr = m_pBrowser->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPContainer);
LOG_MSG_IF_FAILED(L"QueryInterface for IConnectionPointContainer)", hr);
}
if (SUCCEEDED(hr))
{
hr = pCPContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pCP);
LOG_MSG_IF_FAILED(L"FindConnectionPoint)", hr);
}
if (SUCCEEDED(hr))
{
hr = m_pCP->Advise(this, &m_dwCookie);
LOG_MSG_IF_FAILED(L"Advise)", hr);
}
if (SUCCEEDED(hr))
{
hr = m_pBrowser->get_HWND((SHANDLE_PTR*)&hwndBrowser);
}
// Move the browser window to the front.
if (SUCCEEDED(hr))
{
SetWindowPos(hwndBrowser, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
SAFE_RELEASE(pCPContainer);
return hr;
}
//-----------------------------------------------------------------------------
// Name: Exit
// Desc: Cleans up.
//-----------------------------------------------------------------------------
void WebHelper::Exit()
{
// Release the connection point.
if (m_pCP)
{
m_pCP->Unadvise(m_dwCookie);
}
SAFE_RELEASE(m_pBrowser);
SAFE_RELEASE(m_pCP);
m_pDispatchCB = NULL;
}
//-----------------------------------------------------------------------------
// Name: OpenURLWithData
// Desc: Navigates to a URL and POSTs the license acquisition data.
//
// wszURL: The license acquisition URL
// pbPostData: The license acquisition data.
// cbData: Size of the data, in bytes.
//
// (Get the values of these parameters from WM_GET_LICENSE_DATA structure.)
//-----------------------------------------------------------------------------
HRESULT WebHelper::OpenURLWithData(const WCHAR *wszURL, const BYTE *pbPostData, DWORD cbData)
{
// This string is the header needed for HTTP POST actions.
const LPWSTR POST_HEADER_DATA = L"Content-Type: application/x-www-form-urlencoded\r\n";
if (!wszURL)
{
return E_INVALIDARG;
}
if (!m_pBrowser)
{
return E_UNEXPECTED;
}
HRESULT hr = S_OK;
BSTR bstrURL = NULL;
VARIANT vtEmpty;
VARIANT vtHeader;
VARIANT vtPostData;
VariantInit(&vtEmpty);
VariantInit(&vtHeader);
VariantInit(&vtPostData);
// Allocate a BSTR for the URL.
bstrURL = SysAllocString(wszURL);
if (bstrURL == NULL)
{
hr = E_OUTOFMEMORY;
}
// Allocate a BSTR for the header.
if (SUCCEEDED(hr))
{
vtHeader.bstrVal = SysAllocString(POST_HEADER_DATA);
if (vtHeader.bstrVal == NULL)
{
hr = E_OUTOFMEMORY;
}
else
{
vtHeader.vt = VT_BSTR;
}
}
if (SUCCEEDED(hr))
{
if ( pbPostData )
{
// Convert the POST data to a safe array in a variant. The safe array type is VT_UI1.
void *pvData = NULL;
SAFEARRAY *saPostData = SafeArrayCreateVector(VT_UI1, 0, cbData);
if (saPostData == NULL)
{
hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
{
hr = SafeArrayAccessData(saPostData, &pvData);
}
if (SUCCEEDED(hr))
{
CopyMemory((BYTE*)pvData, pbPostData, cbData);
hr = SafeArrayUnaccessData(saPostData);
}
if (SUCCEEDED(hr))
{
vtPostData.vt = VT_ARRAY | VT_UI1;
vtPostData.parray = saPostData;
}
}
}
// Make the IE window visible.
if (SUCCEEDED(hr))
{
hr = m_pBrowser->put_Visible(VARIANT_TRUE);
LOG_MSG_IF_FAILED(L"put_Visible)", hr);
}
// Navigate to the URL.
if (SUCCEEDED(hr))
{
hr = m_pBrowser->Navigate(bstrURL, &vtEmpty, &vtEmpty, &vtPostData, &vtHeader);
LOG_MSG_IF_FAILED(L"Navigate", hr);
}
SysFreeString(bstrURL);
VariantClear(&vtEmpty);
VariantClear(&vtHeader);
VariantClear(&vtPostData);
return hr;
}