首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

CppWebBrowser捉網頁源碼遇到很怪的問題 各位神人~

2013-01-02 
CppWebBrowser捉網頁源碼遇到很怪的問題求救各位神人~~我參考版上其他人的寫法寫了一個代碼此代碼作用在先

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); 

//--------------------------------------- 


谁用谁知道!

热点排行