如何定制一款12306抢票浏览器――实现自动查询和预定功能(三)

2014-11-24 08:18:56 · 作者: · 浏览: 8
}
#endif
}
if ( FALSE == IsStopButtonExist(spDiv) ) {
hr = InsertStopButton(spDiv);
CHECKHR(hr);
#ifdef DEBUG
if ( FALSE == IsStopButtonExist(spDiv) ) {
DebugBreak();
}
#endif
}
} while (0);
return hr ;
}
[cpp]
HRESULT CDeal12306WebPage::GetInsertButtonElem( CComPtr & spForm,
CComPtr & spDiv )
{
HRESULT hr = E_FAIL;
do {
CComPtr spCx_TabDiv;
hr = GetElementByClassName(spForm, L"cx_tab", spCx_TabDiv);
CHECKHRPOINTER(hr, spCx_TabDiv);
hr = GetElementByIndex(spCx_TabDiv, 0, spDiv);
CHECKHRPOINTER(hr, spDiv);
} while (0);
return hr;
}
HRESULT CDeal12306WebPage::InsertStartButton( CComPtr & spElem )
{
HRESULT hr = E_FAIL;
do {
CComBSTR bstrWhere(L"beforeEnd");
CString cstrHTML;
cstrHTML.Format( BUTTONFORMAT, STARTBUTTONID, STARTCOMD, L"开始" );
CComBSTR bstrHTML(cstrHTML.GetString());
hr = spElem->insertAdjacentHTML( bstrWhere, bstrHTML );
CHECKHR(hr);
} while (0);
return hr ;
}
HRESULT CDeal12306WebPage::InsertStopButton( CComPtr & spElem )
{
HRESULT hr = E_FAIL;
do {
CComBSTR bstrWhere(L"beforeEnd");
CString cstrHTML;
cstrHTML.Format( BUTTONFORMAT, STOPBUTTONID, STOPCMD, L"停止" );
CComBSTR bstrHTML(cstrHTML.GetString());
hr = spElem->insertAdjacentHTML( bstrWhere, bstrHTML );
CHECKHR(hr);
} while (0);
return hr ;
}
[cpp]
#define BUTTONFORMAT L"
  • %s
  • "
    #define STARTBUTTONID L"StartButton"
    #define STOPBUTTONID L"StopButton"
    [cpp]
    #define STARTCOMD L"http://www.12306.cn/mormhweb/kyfw/StartQuery.fl"
    #define STOPCMD L"http://www.12306.cn/mormhweb/kyfw/StopQuery.fl"
    当我们点击开始按钮是,页面将试图跳转到http://www.12306.cn/mormhweb/kyfw/StartQuery.fl,此时,我将终止该跳转,同时将“开启查询”标志设置为TRUE。
    [cpp] view plaincopy
    void CBrowserHost::BeforeNavigate2(IDispatch *pDisp, VARIANT *url,
    VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData,
    VARIANT *Headers, VARIANT_BOOL *Cancel)
    {
    do {
    if ( NULL != url ) {
    CString cstrUrl((LPWSTR)(url->bstrVal));
    if ( 0 == cstrUrl.CompareNoCase(SETTINGOK) ) {
    ……
    }
    else if ( 0 == cstrUrl.CompareNoCase(STARTCOMD) ) {
    *Cancel = VARIANT_TRUE;
    m_AutoMan.SetStart(TRUE);
    break;
    }
    else if ( 0 == cstrUrl.CompareNoCase(STOPCMD) ) {
    *Cancel = VARIANT_TRUE;
    m_AutoMan.SetStart(FALSE);
    break;
    }
    }
    *Cancel = VARIANT_FALSE;
    } while (0);
    }
    点击停止按钮原理同点击开始按钮原理一致。此处不再赘述。
    当用户选择好出发地和目的地及时间后,用户点击查询按钮。并点击“开始”按钮。我们的“人”线程就开始了自动查询操作。
    查询是否存在票,有票则预定,无票则再次查询
    当我们执行完一次查询后,我们要查看下搜索结果列表信息中用户选择的车次是否存在票。我们先看一下页面结构
    其查找该节点的方法如下
    [cpp]
    HRESULT CDeal12306WebPage::QueryTicketsInfo( CComPtr & spDoc )
    {
    HRESULT hr = E_FAIL;
    do {
    CComPtr spMainDoc;
    hr = GetMainDoc( spDoc, spMainDoc);
    CHECKHRPOINTER(hr, spMainDoc);