读书人

CppWebBrowser捉源遇到很怪的

发布时间: 2013-01-02 13:08:44 作者: rapoo

CppWebBrowser捉源遇到很怪的 求救各位神人~~
我考版上其他人的法 了一代
此代作用在先用CppWebBrowser1後
再更新日期送出查循
再接下 捉出想要的源
但碰到很怪的 我不管怎弄
明明CppWebBrowser1已送出查了
但我捉下都是的料(未更新前)
我也版上其他文章有"判定取完"的法
但是都用.....
後我 我要是把最後捉源的部分 另外在一Button
先跑完底下的程式 再手去 Button 可以捉出最新的源代
所以想教各位先 我是那有放掉?
要如何修改呢? 很急阿 麻各位忙 我已弄了好天了


Memo1->Clear();
int status=1,status2=1;
String URL="http://www.cnyes.com/twstock/ps_historyprice/2498.htm";
webdone=false;
CppWebBrowser1->Navigate(URL.c_str());

while(!webdone){
Sleep(500);
Application->ProcessMessages();
}
CoInitialize(NULL); //--- 初始化 COM ---//

VARIANT id, index,id1,index1;
IDispatch *spDispatch;
IHTMLDocument2 *pDoc;
IHTMLElement *pElement;
IHTMLElementCollection *pElementCol;
IHTMLFormElement *pFormElement;
IHTMLInputElement *pInputElement;//Input

//IDispatch *WebDocument=static_cast<IDispatch*>(CppWebBrowser1->Document);
//pDoc=static_cast<IHTMLDocument2*>(WebDocument); //首先取IWebBrowser2接口
if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pDoc)))
{
if (SUCCEEDED(pDoc->get_forms(&pElementCol))) //得到form
{
long p=0;
if(SUCCEEDED(pElementCol->get_length(&p))) //哪一form
{
if(p!=0)
{
for(long i=0;i<=(p-1);i++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = i;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;

if(SUCCEEDED(pElementCol->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLFormElement,(void**)&pFormElement)))
{
long q=0;
if(SUCCEEDED(pFormElement->get_length(&q))) //得到form中的控件
{
for(long j=0;j<=(q-1);j++)
{
V_VT(&id) = VT_I4;
V_I4(&id) = j;
V_VT(&index) = VT_I4;
V_I4(&index) = 0;
if(SUCCEEDED(pFormElement->item(id,index, &spDispatch)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLElement,(void**)&pElement)))
{
if(SUCCEEDED(spDispatch->QueryInterface(IID_IHTMLInputElement,(void**)&pInputElement)))
{
//BSTR Value;
//BSTR Type;
BSTR Id;
//BSTR Name;

//pInputElement->get_type(&Type); //取型
//pInputElement->get_value(&Value); //取值
pElement->get_id(&Id);//取Id的方法不一
//pInputElement->get_name(&Name); //取它的名字
//Memo1->Lines->Add("Id+Name");
AnsiString tempId;
tempId = AnsiString(Id);

Memo1->Lines->Add(tempId);
if(tempId!=NULL && ((tempId.Trim()).Length()>0))
{
//tempName = AnsiString(Type);
if(tempId == "ctl00_ContentPlaceHolder1_startText") //--- 始日期 ---//
{


pInputElement->put_value(L"2002/01/01");
Memo1->Lines->Add("pInputElement->put_value");
}
else if(tempId == "ctl00_ContentPlaceHolder1_submitBut") //--- 提交查 ---//
{
pElement->click();
break;
}
//break;
}//如果不符,不做理
pInputElement->Release();
}
pElement->Release();
}//if pelement
spDispatch->Release();
}
}
pFormElement->Release();
}
}
spDispatch->Release();
}
}
}
}
//if(pDoc)
pDoc->Release();
}
}
Sleep(2000);

//--- 底下捉出源 ---//
IHTMLDocument2 *document;
if(SUCCEEDED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&document))){
IHTMLElement *html;
BSTR title,source,content,lang;

document->get_title(&title); //取title
document->get_body(&html);
html->get_outerHTML(&source);//取源程序
Memo1->Clear();
Memo1->Lines->Add(source);
}

CoUninitialize();
}


[解决办法]
捕捉源码的时机不合适。Sleep(2000)并不能保证页面已执行完成,并且,这个会阻塞当前线程。
你可以考虑在OnDocumentComplete事件中执行。
[解决办法]
cppwebBrowser中的自带的那个查看源文件的命令如何调用实现

有个简单的方法,并且对其他进程的WebBrowser也有用

void __fastcall TForm1::FormCreate(TObject *Sender)
{
CppWebBrowser1-> Navigate(WideString( "http://blog.sina.com.cn/zswang "));
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int IDM_VIEWSOURCE = 2139;
HWND vHandle = CppWebBrowser1-> Handle;
vHandle = FindWindowEx(vHandle, NULL, "Shell DocObject View ", NULL);
vHandle = FindWindowEx(vHandle, NULL, "Internet Explorer_Server ", NULL);
SendMessage(vHandle, WM_COMMAND, IDM_VIEWSOURCE, (long)Handle);
}
//---------------------------------------


谁用谁知道!

读书人网 >C++ Builder

热点推荐