老妖、蒋晟、漂遥的安吉儿等高手进,有关CppWebBrowser的问题。

dxqxiaoqiang 2006-02-21 02:23:09
看了好多相关的贴子和文章,仍然没能搞定以下问题:
比如:http://www.pampers.com.cn/bsod/page3c.asp?city=华北
1.如何自动向CppWebBrowser显示的网页中填写文本,然后点击相应按钮。
  如何向搜索宝宝EDIT中填入“BJ01109",我怎么通过IHTMLDocument2接口找到这个EDIT的IHTMLElement元素。
  又如何找到“GO”按钮的IHTMLElement元素然后对“GO”按钮进行点击。
2.如何将页面上的某张图片,好比说某个宝宝的相片显示在我的CBC的FORM页面的IMAGE控件上。

最好能有某一功能能调试通过完整源码,如果没有给出思路和关键的函数也行。
在此相当地感谢各位的帮助,问题解决后另开贴500分相送。


...全文
433 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxqxiaoqiang 2006-02-25
  • 打赏
  • 举报
回复
结贴,散分,其余分数在http://community.csdn.net/Expert/topic/4570/4570380.xml?temp=.4659693,等高手来拿。
MEFULEU 2006-02-24
  • 打赏
  • 举报
回复
关注,继续学习一下
netying 2006-02-23
  • 打赏
  • 举报
回复
关注!
痞子酷 2006-02-23
  • 打赏
  • 举报
回复
第一个问题解决啦,就散分呀。

呵呵 接分。
dxqxiaoqiang 2006-02-22
  • 打赏
  • 举报
回复
终于能发200分的贴子了,给贴子加100分,求高手给予指导,如何将cppwebbrower中下面代码对应的图片提最出来:
<img src="code.asp" height="16" alt="验证码,看不清楚?请点击刷新验证码" style="cursor : pointer;" onClick="this.src='code.asp'" />
dxqxiaoqiang 2006-02-22
  • 打赏
  • 举报
回复
谢谢ouygg(痞子酷) 了,我现在最急需的问题就是将cppwebbrower中下面代码对应的图片提最出来:
<img src="code.asp" height="16" alt="验证码,看不清楚?请点击刷新验证码" style="cursor : pointer;" onClick="this.src='code.asp'" />


请高手指导,谢谢!
痞子酷 2006-02-22
  • 打赏
  • 举报
回复
图片验证码是图片,你看过超星阅读器吗?
其中有个工具是图片文字转换成汉字,你看看网上有这些资料没有?
祝君好运。
痞子酷 2006-02-22
  • 打赏
  • 举报
回复
55555555555555555
图像是不能直接提取的,你看看那个生成图片文字的源代码。再进行分析,看看是否能解决问题。图片是动态生成的,通过网页形式过来的,你无法从图片进行简单分析处理。
dxqxiaoqiang 2006-02-22
  • 打赏
  • 举报
回复
怎么把验证码图形抓下来,不需要识别,识别我自己会搞,然后怎么把识别结果发上去。
minlulu 2006-02-22
  • 打赏
  • 举报
回复
有趣!
constantine 2006-02-22
  • 打赏
  • 举报
回复
我不熟悉这个,帮顶
pp616 2006-02-22
  • 打赏
  • 举报
回复
看msdn啊。ihtml...那些接口都写的很详细的。
dxqxiaoqiang 2006-02-22
  • 打赏
  • 举报
回复
再自己顶一下。
lurel 2006-02-21
  • 打赏
  • 举报
回复
查MSDN
dxqxiaoqiang 2006-02-21
  • 打赏
  • 举报
回复
IHTMLDocument2 的详细资料谁有?给个网址也行,谢谢。
dxqxiaoqiang 2006-02-21
  • 打赏
  • 举报
回复
更麻烦的一个问题是:直接不能访问:
http://www.pampers.com.cn/bsod/seebaby_2.asp?id=BJ01190
会告诉地址非法来源,是不是cookie中有什么东东还是session?
验证码img src="code.asp" 由code.asp动态生成,怎么提取这个图形?

dxqxiaoqiang 2006-02-21
  • 打赏
  • 举报
回复
谢谢ouygg(痞子酷)

现在又遇到一个新的问题,网页为http://www.pampers.com.cn/bsod/seebaby_2.asp?id=BJ01190
网页代码如下:

<form name="form1" method="post" action="clicount.asp?id=BJ01190">
<tr>
<td height="33"><div align="center">


<br>请输入验证码确定投票:
<input name="code000888xxx" type="text" class="input_code" id="code000888xxx" size="10" maxlength="6">
<img src="code.asp" height="16" alt="验证码,看不清楚?请点击刷新验证码" style="cursor : pointer;" onClick="this.src='code.asp'" />
</div></td>
</tr>
<tr>
<td height="60"><div align="center">温馨提示:部分电脑不能显示图片验证码,请<a href="xpcode.reg">下载系统补丁</a></div></td>
</tr>
<tr>
<td><div align="center">
<input name="imageField" type="image" src="images/ok2.gif" width="107" height="49" border="0">
</div></td>
</tr>
</form>


如何向code000888xxx里边填写图形img src="code.asp" 对应的四位数字?
如何将图形img src="code.asp" 调出来,再进行识别?
再次感谢!
痞子酷 2006-02-21
  • 打赏
  • 举报
回复
void __fastcall TFormWeb::WebBrowserDocumentComplete(TObject *Sender,
LPDISPATCH pDisp, Variant *URL)
{
if(WebBrowser->ReadyState!=::READYSTATE_COMPLETE)
return;
IHTMLDocument2 *pDoc = NULL;
IHTMLInputElement *pInput;
int i,j,n,m;
if(SUCCEEDED(WebBrowser->Document->QueryInterface(IID_IHTMLDocument,(LPVOID *) &pDoc)))
{
BSTR strText;
pInput=findNamedTag("cs_exclusive",pDoc);
if(pInput)
{
pInput->get_value(&strText);
m_csExclusive=AnsiString(strText);
string tmp=m_csExclusive.c_str();
string tmp1=replace(tmp,"\r\n","");
m_csExclusive=tmp1.c_str();
n=CountChar(m_csExclusive,',')+1;
m_WebItems.clear();
for(i=0;i<n;i++)
{
AnsiString aTmp=GetSubItemText(m_csExclusive,',',i).Trim();
if(aTmp.IsEmpty())
continue;
m=CountChar(aTmp,'|')+1;
if(m<7)
continue;
// for(j=0;j<7;j++)
{
TWebItem WebItem;
WebItem.id=GetSubItemText(aTmp,'|',0).Trim();
WebItem.name=GetSubItemText(aTmp,'|',1).Trim();
WebItem.type=GetSubItemText(aTmp,'|',2).Trim();
WebItem.isEmpty=GetSubItemText(aTmp,'|',3).Trim();
WebItem.regex=GetSubItemText(aTmp,'|',4).Trim();
WebItem.defaultValue=GetSubItemText(aTmp,'|',5).Trim();
WebItem.length=GetSubItemText(aTmp,'|',6).Trim();
m_WebItems.push_back(WebItem);
}
}
pInput->Release();
}
}
pDoc->Release();
TMessage msg;
if(m_NeedFeedBack)
InitialCustMessage(msg);

}

------------------------------------------------
希望对你有所帮助。
痞子酷 2006-02-21
  • 打赏
  • 举报
回复
//---------------------------------------------------------------------------
// 下面这段代码跟findNamedTag一样,
// 但程序执行到 '//**'处总是不能成功,get_document返回0x80070005
// 在google上搜索'0x80070005 get_document'找到下面这篇文章,
// http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20572427.html
// 专门讨论了这个问题。
// 从讨论中找到findNamedTag的代码片断,稍加修改移植到了上面。
IHTMLInputElement *GetInputItem(IDispatch *pDispatch,AnsiString Name)
{
IHTMLDocument2 *pDoc = NULL;

if(SUCCEEDED(pDispatch->QueryInterface(IID_IHTMLDocument,(LPVOID *) &pDoc)))
{
IDispatch *pdInput;
IHTMLFramesCollection2 *pdFrame;

IHTMLElementCollection *pAll;
pDoc->get_all(&pAll);
pDoc->get_frames(&pdFrame);
pAll->tags(Variant(WideString(L"INPUT")) ,&pdInput) ;
pAll->Release();

IHTMLElementCollection* pInput;
pdInput->QueryInterface( IID_IHTMLElementCollection, (LPVOID*)&pInput );
void *pInputItem = NULL;
long cElems = -1;
pInput->get_length(&cElems );
IDispatch* pdInputItem = NULL;
for(int i=0;i<cElems;i++)
{
pInput->item( Variant(UINT(i)), Variant(UINT(i)), &pdInputItem );
if(SUCCEEDED(pdInputItem->QueryInterface(IID_IHTMLInputElement, &pInputItem )))
{
BSTR strText;
AnsiString ansi;
((IHTMLInputElement*)pInputItem)->get_name(&strText);
if(AnsiString(strText)==Name)
{
pdInputItem->Release();
pInput->Release();
pdInput->Release();
pdFrame->Release();
pDoc->Release();
return (IHTMLInputElement *)pInputItem;
}
}
pdInputItem->Release();
}

IHTMLInputElement *pItem = NULL;
pdFrame->get_length(&cElems );
VARIANT pdFrameItem;
VARIANT pIndex;
pIndex.vt=VT_I4;
IHTMLWindow2 *pFrameWnd=NULL;
IHTMLDocument2 *pFrameDoc=NULL;
for(int i=0;i<cElems;i++)
{
pdFrame->item( Variant(UINT(i)), &pdFrameItem );
if(SUCCEEDED(pdFrameItem.pdispVal->QueryInterface(IID_IHTMLWindow2, (void**)&pFrameWnd)))
{
if(SUCCEEDED(pFrameWnd->get_document(&pFrameDoc))) //**
{
pItem=GetInputItem((IDispatch *)pFrameDoc,Name);
pFrameWnd->Release();
pFrameDoc->Release();
if(pItem!=NULL)
{
pInput->Release();
pdFrame->Release();
pdInput->Release();
pDoc->Release();
return pItem;
}
}
}
}

pInput->Release();
pdFrame->Release();
pdInput->Release();
pDoc->Release();
}
return NULL;
}
void __fastcall TFormWeb::WebPostData(TCppWebBrowser *CppWebBrowser, AnsiString sURL, AnsiString sPostData)
{
BSTR bstrHeaders = NULL;
TVariant vFlags = {0}, vTargetFrameName={0}, vPostData={0}, vHeaders={0};
LPSAFEARRAY psa;
LPCTSTR cszPostData = sPostData.c_str();
UINT cElems = lstrlen(cszPostData);
LPSTR pPostData;
LPVARIANT pvPostData;
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn");
if (!bstrHeaders)
{
Application->MessageBox("Could not allocate bstrHeaders", "Warning", MB_OK | MB_ICONWARNING);
return;
}
V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;
pvPostData = vPostData;
if(pvPostData)
{
VariantInit(pvPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
if(!psa)
return;
SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, cszPostData, cElems);
SafeArrayUnaccessData(psa);
V_VT(pvPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(pvPostData) = psa;
}
CppWebBrowser->Navigate((TVariant)sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
}
痞子酷 2006-02-21
  • 打赏
  • 举报
回复
//通过名称查找Web页中的某个<input>元素
//如果要找其他类型的元素,替换下面的两个宏定义就行了
#define HTML_ELEMENT IHTMLInputElement
#define IID_HTML_ELEMENT IID_IHTMLInputElement
//---------------------------------------------------------------------------
HTML_ELEMENT *findNamedTag(AnsiString name, IHTMLDocument2 *doc)
{
if(doc == NULL) return NULL;
IHTMLElementCollection *all;
doc->get_all(&all);
if(all == NULL) return NULL;

VARIANT index;
index.vt = VT_I4;
index.lVal = 0;

VARIANT bstrName;
bstrName.vt = VT_BSTR;
bstrName.bstrVal=BSTR(WideString(name.c_str()));

IDispatch *dispatch;
all->item(bstrName, index, &dispatch);
all->Release();

if(dispatch == NULL)
{
//Then recursively check child frames ...
IOleContainer* pContainer;

// Get the container
HRESULT hr = doc->QueryInterface(IID_IOleContainer, (void**)&pContainer);

if (FAILED(hr))
{
return NULL;
}

IEnumUnknown* pEnumerator;

// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();

if (FAILED(hr))
{
return NULL;
}

IUnknown* pUnk;
ULONG uFetched;

// Enumerate and refresh all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
// QI for IWebBrowser here to see if we have an embedded browser
IWebBrowser2* pBrowser;

hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pUnk->Release();

if (SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pBrowser->get_Document(&pDisp);
pBrowser->Release();

if(FAILED(hr))
{
continue;
}

IHTMLDocument2 *frameDoc;
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&frameDoc);
pDisp->Release();
if(FAILED(hr))
{
continue;
}

HTML_ELEMENT *element = findNamedTag(name, frameDoc);
frameDoc->Release();
if(element != NULL)
{
pEnumerator->Release();
return element;
}
}
}
pEnumerator->Release();

return NULL;
}

HTML_ELEMENT *tag;
dispatch->QueryInterface(IID_HTML_ELEMENT, (void**)&tag);
dispatch->Release();

return tag;
}
IHTMLSelectElement *findNamedTag2(AnsiString name, IHTMLDocument2 *doc)
{
if(doc == NULL) return NULL;
IHTMLElementCollection *all;
doc->get_all(&all);
if(all == NULL) return NULL;

VARIANT index;
index.vt = VT_I4;
index.lVal = 0;

VARIANT bstrName;
bstrName.vt = VT_BSTR;
bstrName.bstrVal=BSTR(WideString(name.c_str()));

IDispatch *dispatch;
all->item(bstrName, index, &dispatch);
all->Release();

if(dispatch == NULL)
{
//Then recursively check child frames ...
IOleContainer* pContainer;

// Get the container
HRESULT hr = doc->QueryInterface(IID_IOleContainer, (void**)&pContainer);

if (FAILED(hr))
{
return NULL;
}

IEnumUnknown* pEnumerator;

// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();

if (FAILED(hr))
{
return NULL;
}

IUnknown* pUnk;
ULONG uFetched;

// Enumerate and refresh all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
// QI for IWebBrowser here to see if we have an embedded browser
IWebBrowser2* pBrowser;

hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pUnk->Release();

if (SUCCEEDED(hr))
{
IDispatch *pDisp;
hr = pBrowser->get_Document(&pDisp);
pBrowser->Release();

if(FAILED(hr))
{
continue;
}

IHTMLDocument2 *frameDoc;
hr = pDisp->QueryInterface(IID_IHTMLDocument2, (void**)&frameDoc);
pDisp->Release();
if(FAILED(hr))
{
continue;
}

IHTMLSelectElement *element = findNamedTag2(name, frameDoc);
frameDoc->Release();
if(element != NULL)
{
pEnumerator->Release();
return element;
}
}
}
pEnumerator->Release();

return NULL;
}

IHTMLSelectElement *tag;
dispatch->QueryInterface(IID_IHTMLSelectElement, (void**)&tag);
dispatch->Release();

return tag;
}

加载更多回复(1)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧