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 ;
}
 

 

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

posted on 2009-11-05 10:10  norsd  阅读(172)  评论(0编辑  收藏  举报

导航