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 ;
}
这些问题其实还不全,有些我可能还有错,希望大家指点.谢谢.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏