как, имея объект сабжа, установить для него прокси, юзерагента, и аццепт-лэнгвидж, так, чтобы при кликах на странице эти парметры сохранялись.
при изпольхзовании заголовков при клике заголовки возыращаются в прежнее значение.
пока что мне приходится менять эти параметры в реестре, но должен быть более гуманный путь, я думаю.
Здравствуйте, Flamer, Вы писали:
F>Здравствуйте, cls, Вы писали:
cls>>как, имея объект сабжа, установить для него прокси, юзерагента,
F>То и другое можно сделать с помощью UrlMkSetSessionOption.
cls>>и аццепт-лэнгвидж, так, чтобы при кликах на странице эти парметры сохранялись.
F>С этим вроде как посложнее, но в принципе ничто не мешает перехватить событие BeforeNavigate2 и добавлять свой хидер Accept-Language в каждый исходящий запрос.
спасибо огромное, функция интересная, но как мне приплести её к текущей сессии IWebBrowser2 ?
аццепт-лэнгвидж я в реестре меняю — это меня устраивает.
а вот юзерагента через реестр менять фигово

там он из нескольких параметров складывается, поэтому не всякий юзер-агент таким образом можно получить.
про хук BeforуNavigate2 думал, но нет нагладного примера, как использовать.
для меня это наверное будет самый оптимальный способ, т.к. я перехватываю весь запрос и париться с реестром не надо.
подкиньте пожалуйста пример.
Вот тебе два метода используемых в моей программе:
CString IE_Exetension::GetCurInetConnection()
{
const int RAS_MAXENTRYNAME = 256;
const int RAS_RASCONNSIZE = 412;
RASCONN udtRasConn[255];
DWORD countConn = 0;
udtRasConn[0].dwSize = RAS_RASCONNSIZE;
DWORD size = RAS_MAXENTRYNAME * udtRasConn[0].dwSize;
if(!RasEnumConnections(&udtRasConn[0], &size, &countConn) && countConn > 0)
return udtRasConn[0].szEntryName;
else
return _T("");
}
bool IE_Exetension::SetIEProxy(CString strServerAddress, UINT nServerPort)
{
CString buffer;
buffer.Format(_T("%s:%d"), strServerAddress, nServerPort);
LPCTSTR proxy_full_addr = buffer.GetBuffer(buffer.GetLength());
CString connection_name = GetCurInetConnection();
//conn_name: active connection name.
//proxy_full_addr : eg "210.78.22.87:8000"
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill out list struct.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = (LPSTR)connection_name.GetBuffer(connection_name.GetLength());
// Set three options.
list.dwOptionCount = 3;
list.pOptions = new INTERNET_PER_CONN_OPTION[3];
// Make sure the memory was allocated.
if(NULL == list.pOptions)
{
// Return FALSE if the memory wasn't allocated.
OutputDebugString("failed to allocat memory in SetConnectionOptions()");
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT |
PROXY_TYPE_PROXY;
// Set proxy name.
list.pOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER;
list.pOptions[1].Value.pszValue = (LPSTR)proxy_full_addr;//"
http://proxy:80";
// Set proxy override.
list.pOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS;
list.pOptions[2].Value.pszValue = "local";
// Set the options on the connection.
bReturn = InternetSetOption(NULL,
INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory.
delete [] list.pOptions;
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
return bReturn;
}
bool IE_Exetension::ResetProxy()
{
CString connection_name = GetCurInetConnection();
//conn_name: active connection name.
INTERNET_PER_CONN_OPTION_LIST list;
BOOL bReturn;
DWORD dwBufSize = sizeof(list);
// Fill out list struct.
list.dwSize = sizeof(list);
// NULL == LAN, otherwise connectoid name.
list.pszConnection = (LPSTR)connection_name.GetBuffer(connection_name.GetLength());
// Set three options.
list.dwOptionCount = 1;
list.pOptions = new INTERNET_PER_CONN_OPTION[list.dwOptionCount];
// Make sure the memory was allocated.
if(NULL == list.pOptions)
{
// Return FALSE if the memory wasn't allocated.
OutputDebugString("failed to allocat memory in DisableConnectionProxy()");
return FALSE;
}
// Set flags.
list.pOptions[0].dwOption = INTERNET_PER_CONN_FLAGS;
list.pOptions[0].Value.dwValue = PROXY_TYPE_DIRECT ;
// Set the options on the connection.
bReturn = InternetSetOption(NULL,
INTERNET_OPTION_PER_CONNECTION_OPTION, &list, dwBufSize);
// Free the allocated memory.
delete [] list.pOptions;
InternetSetOption(NULL, INTERNET_OPTION_SETTINGS_CHANGED, NULL, 0);
InternetSetOption(NULL, INTERNET_OPTION_REFRESH , NULL, 0);
return bReturn;
}
bool IE_Exetension::SetIEProxy2NonChangeFeaturesOfColumnist(CString strServerAddress, UINT nServerPort)
{
CString buffer;
buffer.Format(_T("%s:%d"), strServerAddress, nServerPort);
INTERNET_PROXY_INFO InetProxyInfo;
InetProxyInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
InetProxyInfo.lpszProxy = buffer;
InetProxyInfo.lpszProxyBypass = _T("");
return S_OK == UrlMkSetSessionOption(INTERNET_OPTION_PROXY, (LPVOID)&InetProxyInfo, sizeof(INTERNET_PROXY_INFO),0);
}
Posted via RSDN NNTP Server 1.9
вобщем вот код.
IWebBrowser2 *m_browser;
HRESULT hr;
hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowser2, (void**)&m_browser);
m_browser->put_Visible(TRUE);
_bstr_t p;
string m_url = (string)"http://localhost/";
string m_referer = (string)"http://ya.ru";
string m_headers;
m_headers = "Referer: " + m_referer;
m_headers += "\n\r";
p=_bstr_t((LPCSTR)m_url.c_str());
_variant_t q;
_variant_t v_headers(m_headers.c_str());
m_browser->Navigate((BSTR)p.copy(), &q, &q, &q, &v_headers);
как мне приплести сюда DWebBrowserEvents2::BeforeBavigate2 ?
и как с ним работать, то есть изменять параметры запроса, хэдэры, в частности?
я НИ РАЗУ этих вещей не делал и представления не имею как что работает,
форум смотрел, частично что-то написано и всё непонятно
да, и пишу без мфц...