在MFC的对话框中,可以通过Activex方式加入对浏览器的支持。通过响应BeforeNavigate2事件可以获取IE当前加载的URL,提交的PostData,并且可以控制是否继续刷新页面。
事件响应函数的原型为:
BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)
ON_EVENT(CMyDlg, IDC_EXPLORER1, 250, BeforeNavigate2Explorer1, VTS_DISPATCH VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PVARIANT VTS_PBOOL)
END_EVENTSINK_MAP()
void CMyDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel);
其中PostData参数为VARIANT*类型,若想解析PostData中的数据,需作如下处理:
if( PostData && PostData->vt == (VT_VARIANT|VT_BYREF) && PostData->pvarVal->vt != VT_EMPTY)
{
char* szTemp = NULL;
char* szData = NULL;
long lBound,uBound;
SAFEARRAY* pdata = PostData->pvarVal->parray;
SafeArrayAccessData(pdata,(void HUGEP**)&szTemp);
SafeArrayGetLBound(pdata,1,&lBound);
SafeArrayGetUBound(pdata,1,&uBound);
szData = new char[uBound - lBound + 2];
memset(szData,0,uBound - lBound + 2);
StrCpyN(szData,szTemp,uBound - lBound + 1);
szData[uBound - lBound] = '/0';
SafeArrayUnaccessData(pdata);
MessageBox(szData);
delete [] szData;
*Cancel = VARIANT_TRUE; //停止刷新页面
}