关于webbrowser提交的的一点问题

orcher 2005-11-08 12:14:16
请问我该怎么做到提交一个frame中的子叶面,看过一段代码,不过方法找不到
var

kk:hwnd;

obj:OleVariant;

doc: ihtmldocument2;

doc:=(WebBrowser1.Document as IHTMLDocument2);
obj:=doc.all.item('Submit',0);
obj.click; //点“下一步”按钮
statusBar1.Panels[0].Text := '正在打开报名协议页面。。。';
...全文
275 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xingzhou 2005-11-13
  • 打赏
  • 举报
回复
void HTML_GetAll(IHTMLDocument2 *pDoc,IHTMLElementCollection **ppAlls)
{
*ppAlls = NULL;
if(!pDoc) return ;

pDoc->get_all(ppAlls);
}
//---------------------------------------------------------------------------

void HTML_GetElementCollection(const AnsiString &TagName,IHTMLDocument2 *pDoc,IHTMLElementCollection **ppCols)
{
*ppCols = NULL;
if(!pDoc) return ;

IHTMLElementCollection *spAll = NULL;
if(S_OK != pDoc->get_all(&spAll)) return ;
if(!spAll) return ;

spAll->tags(TVariant(TagName), (IDispatch **)ppCols);
}
//---------------------------------------------------------------------------


-----------------
行舟
欢迎使用CSDN论坛浏览器
http://blog.csdn.net/xingzhou/
orcher 2005-11-12
  • 打赏
  • 举报
回复
HTML_GetAll(spDoc2, &spInputs);--〉找不到函数,
改成 spDoc2->get_all(&spInputs);后
if (!spInputs) return; 非法访问
orcher 2005-11-12
  • 打赏
  • 举报
回复
submit_id没有定义
xingzhou 2005-11-11
  • 打赏
  • 举报
回复
上面是根据我的实际代码临时写的,有些小问题(加了个返回值,但是忘了在return 后加上返回的数据)

-----------------
行舟
CSDN论坛浏览器
http://blog.xingzhou.com
http://blog.csdn.net/xingzhou/
xingzhou 2005-11-11
  • 打赏
  • 举报
回复
// 一段类是的CB代码
bool SubmitForm(TCppWebBrowser * WB, wchar_t *Submit_id)
{
IHTMLDocument2 *spDoc2 = get_Doc2(WB); // 可以(IHTMLDocument2 *)WB->Document;
if(!spDoc2) return ;

IHTMLElementCollection *spInputs = NULL;
IHTMLElement *spElement = NULL;
IDispatch *IDisp;

HTML_GetAll(spDoc2, &spInputs);
// HTML_GetElementCollection("INPUT", spDoc2, &spInputs);// 不知为何,CB无效,没有按钮,只有编辑框,但Delphi可以的,只好来了个All
if (!spInputs) return;

AnsiString ID;
VARIANT vIndex,vName;
long nCnt;

spInputs->get_length(&nCnt);
for (int i=0; i<nCnt-1; ++i)
{
vName.vt=VT_I4;
vIndex.vt=VT_I4;
vName.lVal=i;
vIndex.lVal=i;

spInputs->item(vName,vIndex,&IDisp);
IDisp->QueryInterface(IID_IHTMLElement,(void**)&spElement);
BSTR bid;
spElement->get_id(&bid);
if (bid && 0 == _wcscmpi(bid, Submit_id
{
// MSGINFO("ok");
spElement->click();
i = nCnt;
}
SysFreeString(bid);
spElement->Release();
}
spInputs->Release();
spDoc2->Release();
}


-----------------
行舟
CSDN论坛浏览器
http://blog.xingzhou.com
http://blog.csdn.net/xingzhou/
xingzhou 2005-11-11
  • 打赏
  • 举报
回复
obj:=doc.all.item('Submit',0); // 找出当前名字为submit的网页元素,因为提交按钮一般是submit,所以这里默许了,实际上有问题,因为可能有多个submit,或者也未必有submit,而是用脚步提交,但考虑到如果是自己写的页面,所以只有在设计页面时注意就行了
obj.click; //点“下一步”按钮,模拟点击这个提交按钮,自动提交

这段代码如果用CB来做,麻烦的很,但是Delphi却简单的没法说,呵呵,选择什么语言开放软件,区别太大了,CB难以忍受的,Delphi轻松搞定。

多说一句:这段代码我在CB写过,obj:=doc.all.item('Submit',0)的用法无效,只能逐个枚举,如ccrun那样,这也是我在写CSDNBrowser时用Delphi写了个动态库的原因

-----------------
行舟
CSDN论坛浏览器
http://blog.xingzhou.com
http://blog.csdn.net/xingzhou/
蒋晟 2005-11-11
  • 打赏
  • 举报
回复
you did not use VariantInit to initialize your VARIANT structure.
ccrun.com 2005-11-10
  • 打赏
  • 举报
回复
vID.vt = VT_UI1;
vID.bstrVal = 0;
// 可能是上面这两行的问题。
pEleColl->item(vID, vTemp, &pDisp);

我的代码没有经过调试,所以可能是写错了,你试试这样:
vID.vt = VT_BSTR;
vID.bstrVal = 0;
或者
vID.vt = VT_UI1;
vID.uiVal = 0;
orcher 2005-11-10
  • 打赏
  • 举报
回复
能指导我一下关于frame中提交的问题吗?到step2222就下不去了
LPDISPATCH lpDisp = NULL;
lpDisp = CppWebBrowser1->Document;
if (lpDisp)
{
IOleContainer* pContainer;
HRESULT hr = lpDisp->QueryInterface(IID_IOleContainer,
(void**)&pContainer);
lpDisp->Release();
if (FAILED(hr))
return ;

IEnumUnknown* pEnumerator;
// Get an enumerator for the frames
hr = pContainer->EnumObjects(OLECONTF_EMBEDDINGS, &pEnumerator);
pContainer->Release();
if (FAILED(hr))
return ;
IUnknown* pUnk;
ULONG uFetched;
// Enumerate and refresh all the frames
for (UINT i = 0; S_OK == pEnumerator->Next(1, &pUnk, &uFetched); i++)
{
IWebBrowser2* pBrowser;
hr = pUnk->QueryInterface(IID_IWebBrowser2, (void**)&pBrowser);
pUnk->Release();
// pBrowser->LocationURL
if (SUCCEEDED(hr))
{
IHTMLDocument2 *spDoc = NULL;
if (SUCCEEDED(pBrowser->Document->QueryInterface(
IID_IHTMLDocument2, (void**)&spDoc)))
{
ShowMessage("step1111");
IHTMLElementCollection *pEleColl;
IDispatch *pDisp = NULL;
spDoc->get_forms(&pEleColl);
// 获取第一个Form
VARIANT vTemp, vID;
vID.vt = VT_UI1;
vID.bstrVal = 0;
pEleColl->item(vID, vTemp, &pDisp);
pEleColl->Release();

IHTMLFormElement *pFormElem = NULL;
ShowMessage("step222");
if(pDisp)
{
ShowMessage("step3333");
if(SUCCEEDED(pDisp->QueryInterface(
IID_IHTMLFormElement,(LPVOID*)&pFormElem)))
{
ShowMessage("step4444");
pDisp->Release();
// 这里可以添加一些填写表单的代码
// ...
pFormElem->submit();//提交
pFormElem->Release();
}
}
}
spDoc->Release();
}
}

pEnumerator->Release();
}
orcher 2005-11-10
  • 打赏
  • 举报
回复
还不行,
在每个frame中到step 3333就出错
IHTMLFormElement *pFormElem = NULL;
if(pDisp)
{
//step3333
if(SUCCEEDED(pDisp->QueryInterface(
IID_IHTMLFormElement,(LPVOID*)&pFormElem)))
{

pDisp->Release();
// 这里可以添加一些填写表单的代码
// ...
pFormElem->submit();//提交
pFormElem->Release();
}
蒋晟 2005-11-09
  • 打赏
  • 举报
回复
How to get the WebBrowser object model of an HTML frame

This article details the standard technique WebBrowser control hosts can use to access the WebBrowser object model of frame windows in an HTML page inside the control. This object model provides extra functionality that is not exposed for the frame window through the HTML object model.

http://support.microsoft.com/kb/196340

PRB: Permission Denied Error Message When Scripting Across Frames
Script code that attempts to access a script or an object in a different frame may get the following script error message:
Permission denied: 'Parent.RemoteFrame.RemoteObject'

http://support.microsoft.com/kb/q167796/
orcher 2005-11-08
  • 打赏
  • 举报
回复
不是阿,它是一段自动提交的代码,我现在想实现在frame中的自动提交阿
shadowstar 2005-11-08
  • 打赏
  • 举报
回复
翻译?
orcher 2005-11-08
  • 打赏
  • 举报
回复
谢谢,我还没弄明白怎么区分不同的frame,和frame下面不同的form,能讲讲吗?
ccrun.com 2005-11-08
  • 打赏
  • 举报
回复
写了段代码,没有具体的调试,自己看着改改吧。

#include <Mshtml.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
IHTMLDocument2 *spDoc = NULL;
if(!CppWebBrowser1->Busy && CppWebBrowser1->Document != NULL)
{
if (SUCCEEDED(CppWebBrowser1->Document->QueryInterface(
IID_IHTMLDocument2, (void**)&spDoc)))
{
IHTMLElementCollection *pEleColl;
IDispatch *pDisp = NULL;

spDoc->get_forms(&pEleColl);

// 获取第一个Form
VARIANT vTemp, vID;
vID.vt = VT_UI1;
vID.bstrVal = 0;
pEleColl->item(vID, vTemp, &pDisp);
pEleColl->Release();

IHTMLFormElement *pFormElem = NULL;
if(pDisp)
{
if(SUCCEEDED(pDisp->QueryInterface(
IID_IHTMLFormElement,(LPVOID*)&pFormElem)))
{
pDisp->Release();
// 这里可以添加一些填写表单的代码
// ...
pFormElem->submit();//提交
pFormElem->Release();
}
}
}
spDoc->Release();
}
}

1,317

社区成员

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

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