`
helpbs
  • 浏览: 1154874 次
文章分类
社区版块
存档分类
最新评论

VC中程序调用Js自定义函数的注意事项

 
阅读更多

关于如何在程序中调用js函数, 网络上已经泛滥多时了.

下面这个链接是这方面的鼻祖了,大家可以看看.

http://www.codeproject.com/KB/COM/jscalls.aspx?msg=1162277

一般说来,调用js函数多数是为了让程序内核和程序界面(ie界面)交互.

所以我让程序内核发送自定义消息 WM_CALLDISP 到界面窗口.

界面窗口调用invoke运行disp.

这里有几个问题要注意:

0. js自定义函数其实是一个DISPATCH 对象.

在我给出的例子中是通过 GetIDsOfNames 来获取DISPATCH对象的指针.

你也可以自己在你的WebBrowser中创建一个自定义函数.

(你必须先实现virtual HRESULT __stdcall GetExternal( IDispatch **ppDispatch ); 这个接口)

比如GetJsFunction.

然后在js脚本中调用 window.external.GetJsFunction

这种方法比较灵活 , 我就是这么干的.

1. 发送消息代码:

DISPPARAMS* npDispParams = new DISPPARAMS ;
::memset( npDispParams, 0 , sizeof(DISPPARAMS) );

//必须使DISPPARAMS初始化为0, 否则有些域的值,会使invoke直接退出.


npDispParams->cArgs = 1 ;
npDispParams->rgvarg = new VARIANT[1] ;

//即使只有一个参数,也必须写[1],而不是 new VARIANT

//因为删除的时候是 delete [] npArgs->rgvarg


npDispParams->rgvarg[0].vt = VT_BSTR ;

npDispParams->rgvarg[0].bstrVal = ::SysAllocString( L"hello world" ) ;

//不需要释放bstr, js会释放.
::SendMessageW( hWnd , WM_CALLDISP , (WPARAM)pDisp ,(LPARAM)npDispParams ) ;

2.界面窗口,WM_CALLDISP消息接收端

LRESULT
CWebBrowser::OnCallDisp( WPARAM wParam ,LPARAM lParam )
{
VARIANT varRet ;
varRet.intVal = TRUE ;

//使用SEH异常处理,防止disp出现异常
__try
{
IDispatch* pDisp = (IDispatch*)wParam;
DISPPARAMS* npArgs = (DISPPARAMS*)lParam;

//调用js函数
pDisp->Invoke( 0, IID_NULL,LOCALE_USER_DEFAULT ,DISPATCH_METHOD , npArgs , &varRet ,NULL, NULL );

//释放pDisp

pDisp->Release();

delete []npArgs->rgvarg;
delete npArgs;
}
__except(1)
{
varRet.intVal = FALSE;
}
//RETURN:
return varRet.intVal ;
}

这些问题其实还不全,有些我可能还有错,希望大家指点.谢谢.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics