调用javascript函数并取得返回值

cczlp 2010-07-08 09:24:44
bool __fastcall ExeScript(TWebBrowser * Web, String jsName, TStringList *args, CComVariant *pVarResult)
{
IHTMLDocument2 *spDoc = (IHTMLDocument2 *)(void *)Web->Document;
if (spDoc == NULL) return false;

CComPtr<IDispatch> spScript;
HRESULT hr = spDoc->get_Script(&spScript);
ATLASSERT(SUCCEEDED(hr));
if (!SUCCEEDED(hr))
{
return false;
}

BSTR bstrMember = WideString(jsName).c_bstr();
DISPID dispid = NULL;
hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (!SUCCEEDED(hr))
{
ShowMessage(IntToHex((int)hr, 2));
spDoc->Release();
return false;
}
//...........

GetIDsOfNames总是失败, 错误是名字未知.
如果用execScript调用会成功, 但execScript不能取得返回值.
...全文
848 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
husolinglal 2010-10-25
  • 打赏
  • 举报
回复
问一下,那个TWebBrowser 是怎么初始化的啊?
qningning 2010-07-09
  • 打赏
  • 举报
回复
ajax应该不能解决问题因为数据入库前,php还是要检测的。既然为了安全性,模拟发包也是要防的
cczlp 2010-07-08
  • 打赏
  • 举报
回复
我用的是 2009
cczlp 2010-07-08
  • 打赏
  • 举报
回复
麻烦老妖帮看看
cczlp 2010-07-08
  • 打赏
  • 举报
回复
添加函数的代码:
bool __fastcall AddCode(TWebBrowser * Web, String sCode)
{
IHTMLDocument2 *pDoc = (IHTMLDocument2 *)(void *)Web->Document;
if (pDoc == NULL) return false;

IHTMLElement *pBody;
HRESULT hr = S_OK;

hr = pDoc->get_body(&pBody);
if( SUCCEEDED(hr))
{
WideString s = AnsiReplaceText(sCode, "<script", "<br><script defer");
pBody->insertAdjacentHTML(L"AfterBegin", s.c_bstr());
pDoc->Release();
return true;
}
pDoc->Release();
return false;
}

//执行函数的代码
bool __fastcall ExeScript(TWebBrowser * Web, String jsName, TStringList *args, CComVariant *pVarResult)
{
IHTMLDocument2 *spDoc = (IHTMLDocument2 *)(void *)Web->Document;
if (spDoc == NULL) return false;

CComPtr<IDispatch> spScript;
HRESULT hr = spDoc->get_Script(&spScript);
ATLASSERT(SUCCEEDED(hr));
if (!SUCCEEDED(hr))
{
return false;
}

BSTR bstrMember = WideString(jsName).c_bstr();
DISPID dispid = NULL;
hr = spScript->GetIDsOfNames(IID_NULL, &bstrMember, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (!SUCCEEDED(hr))
{
ShowMessage(IntToHex((int)hr, 2));
spDoc->Release();
return false;
}

const int arraySize = args->Count;

DISPPARAMS dispparams;
memset(&dispparams, 0, sizeof dispparams);
dispparams.cArgs = arraySize;
dispparams.rgvarg = new VARIANT[dispparams.cArgs];

for (int i = 0; i < arraySize; i++)
{
CComBSTR bstr = WideString(args->Strings[arraySize - 1 - i]).Copy(); // back reading
bstr.CopyTo(&dispparams.rgvarg->bstrVal);
dispparams.rgvarg->vt = VT_BSTR;
}

dispparams.cNamedArgs = 0;

EXCEPINFO excepInfo;
memset(&excepInfo, 0, sizeof excepInfo);

CComVariant vaResult;
UINT nArgErr = (UINT) - 1; // initialize to invalid arg
hr = spScript->Invoke(dispid, IID_NULL, 0, DISPATCH_METHOD, &dispparams, &vaResult, &excepInfo, &nArgErr);

spDoc->Release();
delete[] dispparams.rgvarg;
if (FAILED(hr))
{
return false;
}

if (pVarResult)
{
*pVarResult = vaResult;
}

return true;
}

打开网页后,点击按钮执行:
	String sCode =  "<script type=\"text/javascript\">"
"function myFunction(str)"
"{"
" alert(str);"
" return str;" ;
"}" "</script>";
if (!AddCode(WebBrowser1, sCode)) ShowMessage("add error");
ccrun.com 2010-07-08
  • 打赏
  • 举报
回复
把你的js函数代码贴出来,我帮你调试一下。另外,你用的哪个CBuilder版本?
周药师 2010-07-08
  • 打赏
  • 举报
回复


HRESULT GetIDsOfNames(
REFIID riid,
OLECHAR FAR* FAR* rgszNames,
unsigned int cNames,
LCID lcid,
DISPID FAR* rgDispId
);


//这样试试?
OLECHAR FAR* bstrMember= WideString(jsName).c_bstr();
cczlp 2010-07-08
  • 打赏
  • 举报
回复
bstrMember函数是存在的, 可以通过execScript来调用
周药师 2010-07-08
  • 打赏
  • 举报
回复
"GetIDsOfNames总是失败, 错误是名字未知"
是不是bstrMember不对啊?
cczlp 2010-07-08
  • 打赏
  • 举报
回复
调用 TWebBrowser 打开的网页中的js函数. 这个js函数是我在网页打开后加载进去的.
decamonth 2010-07-08
  • 打赏
  • 举报
回复
数据合法性验证吧?php在服务器端,还是要验证一遍的,js在客户端验证,通常只是为了提高用户体验
ccrun.com 2010-07-08
  • 打赏
  • 举报
回复
好,我研究一下先。

1,317

社区成员

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

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