关于如何在程序中调用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 ;
}
这些问题其实还不全,有些我可能还有错,希望大家指点.谢谢.
分享到:
相关推荐
史上最详细的JS脚本调用VC自定义函数资料 看完准保不后悔 可以节省你很多时间的 实现原理: 利用BHO实现IDocHostUIHandler接口和IDispatch接口 通过BHO拦截网页加载完毕事件,将自己的IDocHostUIHandler接口设置给...
截获你的应用程序调用的任何输入函数,vc 源程序.
本文简单介绍下VC中程序调用可执行程序。博客地址:http://blog.csdn.net/bingdianlanxin,有问题欢迎留言!
Javascript和VC的交互方法,内部包含几个可运行工程,基于VC6.0,主要分为两部分,一部分是VC调用javascript函数,另外一部分是javascript调用VC函数
详细介绍了MFC中怎样使用sendmessage自定义消息函数
实现matcom和vc的混合编程,利用vc界面和matlab的计算能力实现
VC6中调用dll文件中的函数_傻瓜式教程
VC中DLL的调用规则 VC中DLL的调用规则 VC中DLL的调用规则
vc钩子hook 截获exe调用的任何函数.api拦截
VC调用Python函数的源代码示例 VC++ Python
VC 实验代码,测试调用DLL动态库中的函数,本代码将学习动态链接库程序的编写。静态库与动态库的区别,以及调用程序在链接静态库和动态库时的区别。如何利用工具查看动态链接库输出的函数,Depends工具的使用,C ...
这个程序是我用来做数据处理的,在VC中调用matlab编写的.m文件来实现我所需功能,直接调用matlab中现成的函数来处理在vc中需要自己编很长代码来实现的数据处理函数,提高了工作效率,结合vc的界面美观与matlab的方便
VC8调用matlab引擎测试程序
VC 在ActiveX中动态调用外部DLL函数,演示如何在ActiveX控件中动态调用来自外部的DLL函数,虽然不常用,研究学习一下也不多余哦,里面有两个调用DLL的例子。
本文介绍了在VC曰环境下调用MATLAB6.X提供的数学岸和图形库的方法,实现了在VC刊州环境下脱离MATLAB调用其数据处理和图形显示的功能。
MATCOM与VC++混合编程中自定义函数作为输
本程序演示了如何用VC程序来动态的调用JavaScript或VBScript脚本函数
示范如何使用 LoadLibrary(...) 和 GetProcAddress(....)调用dll的输出函数.
基本的调用lua变量与函数,实现文本的获取与显示策略,若要改变显示方式,只要修改move()函数即可.
在VC项目中使用自定义资源 的 Code