//由于所有页面下载完后都会执行这个函数,所以必须根据URL判断消息来源网页
if(strUrl=="http://www.onlytest.com/vote.htm")
{
CComPtrpDisp;
if(HasItem(objAllElement,"voteform")==true) //voteform为投票选项所在的Form
{
objAllElement->item(COleVariant("voteform"),COleVariant((long)0),&pDisp);
CComQIPtrpElement;
if(pDisp==NULL)
{
//接口指针获取失败,结束程序,不另外作处理,原因见后
EndDialog(IDOK);
return;
}
else
{
//如果投票结果在新窗口打开,则应该修改网页代码,让结果在本控件中显示
pElement=pDisp;
pElement->put_target(CComBSTR("_self")); //等效于target="_self"
pElement->put_action(CComBSTR("vote2.asp"));//等效于action="vote2.asp"
}
CheckItem(objAllElement,"chk2"); //将form中id为chk2的CheckBox选中
SubmitPage(objAllElement,"vote"); //提交网页,vote为submit按钮的id或name
}
}
else if(strUrl=="http://www.onlytest.com/vote2.asp")
{
EndDialog(IDOK); //如果投票处理页面已经下载完毕,则结束程序,原因见后。
}
}
现在票已经投出去了,但看过程序你可能会奇怪,为什么投完票或中间出了错要用EndDialog结束程序,而不是继续投票呢?事情是这样的,有些网站一个session只能投一票,而一个IE控件创建好,与服务器连接后(有了Session),那个Session Key就定好了(一家之言),所以如果继续用这个IE控件投票,服务器会告诉你你已经投过票了(当然如果投票程序写的笨,没管这个,那就简单多了)。这个问题本来我想通过分析WinInet API的运行过程对付的,可是好像很麻烦,所以用了一个很笨的但简单的方法:投票程序作为一个程序,然后另一个程序调用这个投票程序,投完票后投票程序结束,主程序再次运行投票程序,如此反复。至于投票程序数量的限制之类的东西,用共享内存段是最简单的(一家之言),具体就不在这里讨论了。