1,Webbrowser截获POST数据
void __stdcall CBrowserWeb::OnBeforeNavigate2(IDispatch *pDisp,
VARIANT *url,
VARIANT *Flags,
VARIANT *TargetFrameName,
VARIANT *PostData,
VARIANT *Headers,
VARIANT_BOOL *Cancel
)
{
ATLASSERT(m_spWebBrowser2);
/* 别的代码 */
/* 以下此段为以字符串形式查看提交的POST数据*/
if( PostData && PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY)
{
//Cancel=VARIANT_TRUE;
char *szTemp = NULL, *szPostData = NULL;
long plLbound, plUbound;
SAFEARRAY *parrTemp = PostData -> pvarVal->parray;
SafeArrayAccessData(parrTemp , (void HUGEP **) &szTemp);
SafeArrayGetLBound(parrTemp , 1, &plLbound);
SafeArrayGetUBound(parrTemp , 1, &plUbound);
szPostData = new char[plUbound - plLbound + 2];
StrCpyA(szPostData, szTemp);//, plUbound - plLbound + 1);
szPostData[plUbound-plLbound] = '\0';
SafeArrayUnaccessData(parrTemp);
Memo1->Lines->Add(szPostData);
delete[] szPostData;
}
}
2,Webbrowser模拟POST提交数据,自己封装的Navigate2,直接调用此函数即可
HRESULT CBrowserWeb::Navigate2(LPCSTR szUrl,LPCSTR szPostData)
{
HRESULT hr;
string strHeaders = "Content-Type: application/x-www-form-urlencoded\r\n";
CComBSTR bstrURL(szUrl);
CComVariant vHeaders;
vHeaders.vt = VT_BSTR;
vHeaders.bstrVal = SysAllocString(CComBSTR(strHeaders.c_str()).Detach());
CComVariant vFlags;
vFlags.vt = VT_I4;
vFlags.lVal = navNoReadFromCache | navNoWriteToCache;
CComVariant vTargetFrameName;
//加上下面这段浏览器就会在一个新的窗口打开页面,几个参数都试过,
//效果都一样,还没清楚是什么原因。
vTargetFrameName.vt = VT_BSTR;
vTargetFrameName.bstrVal= SysAllocString(L"resultFrame");
CComVariant vPostData;
GetPostData(vPostData,szPostData);
::Navigate(m_spWebBrowser2,bstrURL, &vFlags,
&vTargetFrameName, &vPostData, &vHeaders);
return TRUE;
}
HRESULT CBrowserWeb::GetPostData(CComVariant &vPostData,LPCSTR szPostData)
{
HRESULT hr;
LPSAFEARRAY psa;
psa = SafeArrayCreateVector(VT_UI1, 0, strlen(szPostData));
if (!psa) {
return E_OUTOFMEMORY;
}
LPSTR pPostData;
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, szPostData, strlen(szPostData));
hr = SafeArrayUnaccessData(psa);
vPostData.vt = VT_ARRAY | VT_UI1;
vPostData.parray = psa;
return S_OK;
}