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 ;
}
这些问题其实还不全,有些我可能还有错,希望大家指点.谢谢.