c/c++/MFC 调用 js 函数代码(自家用)

时间:2022-09-22 08:49:18

 熊健 2009.12.22 于 武汉

c/c++/MFC 调用 js 函数代码(自家用)c/c++/MFC 调用 js 函数代码(自家用)调用函数代码和示例
  1  首先 .h 文件中定义:
  2 
  3   CComPtr < IHTMLWindow2 >  m_sphtmlWnd;
  4   CComPtr < IHTMLDocument2 >  m_spHtmlDoc;
  5 
  6 
  7 
  8  // 方法1 可以取得返回值。。。。。
  9 
 10  // 调用方法示例:stringArray为传入参数列表,getSum为js函数,pVarResult 为返回值
 11 
 12  /*  CStringArray stringArray;
 13   stringArray.RemoveAll();
 14   stringArray.SetSize(5); 
 15   stringArray[0].Format(L"%d",m_poiStart.x);
 16   stringArray[1].Format(L"%d",m_poiStart.y);
 17   stringArray[2].Format(L"%d",m_poiEnd.x);
 18   stringArray[3].Format(L"%d",m_poiEnd.y);
 19   stringArray[4].Format(L"%d",a + 1);
 20   CComVariant pVarResult = CallJScript(L"getSum", stringArray); */
 21 
 22  bool  Cems_mysql_appView::GetJScript(CComPtr < IDispatch >&  spDisp)
 23  {
 24   m_spHtmlDoc  =   (IHTMLDocument2 * )(GetHtmlDocument());
 25    if (m_spHtmlDoc  ==  NULL)
 26   {
 27     return   false ;
 28   }
 29   HRESULT hr  =  m_spHtmlDoc -> get_Script( & spDisp);
 30   ATLASSERT(SUCCEEDED(hr));
 31    return  SUCCEEDED(hr);
 32  }
 33 
 34  CComVariant Cems_mysql_appView::CallJScript( const  CString strFunc, const  CStringArray &  paramArray)
 35  {
 36    // Getting IDispatch for Java Script objects
 37   CComPtr < IDispatch >  spScript;
 38    if ( ! GetJScript(spScript))
 39   {
 40     return   false ;
 41   }
 42    // Find dispid for given function in the object
 43   CComBSTR bstrMember(strFunc);
 44   DISPID dispid  =  NULL;
 45   HRESULT hr  =  spScript -> GetIDsOfNames(IID_NULL, & bstrMember, 1 ,
 46    LOCALE_SYSTEM_DEFAULT, & dispid);
 47    if (FAILED(hr))
 48   {
 49     return   false ;
 50   }
 51 
 52    const   int  arraySize  =  paramArray.GetSize();
 53    // Putting parameters
 54   DISPPARAMS dispparams;
 55   memset( & dispparams,  0 sizeof  dispparams);
 56   dispparams.cArgs       =  arraySize;
 57   dispparams.rgvarg      =   new  VARIANT[dispparams.cArgs];
 58   dispparams.cNamedArgs  =   0 ;
 59 
 60    for int  i  =   0 ; i  <  arraySize; i ++ )
 61   {
 62    CComBSTR bstr  =  paramArray.GetAt(arraySize  -   1   -  i);
 63     //  back reading
 64    bstr.CopyTo( & dispparams.rgvarg[i].bstrVal);
 65    dispparams.rgvarg[i].vt  =  VT_BSTR;
 66   }
 67   EXCEPINFO excepInfo;
 68   memset( & excepInfo,  0 sizeof  excepInfo);
 69   CComVariant vaResult;
 70   UINT nArgErr  =  (UINT) - 1 ;       //  initialize to invalid arg
 71    // Call JavaScript function
 72   hr  =  spScript -> Invoke(dispid,IID_NULL, 0 ,DISPATCH_METHOD, & dispparams, & vaResult, & excepInfo, & nArgErr);
 73   delete [] dispparams.rgvarg;
 74    if (FAILED(hr))
 75   {
 76     return   false ;
 77   }
 78    return  vaResult;
 79  }
 80 
 81 
 82 
 83  // 方法2 
 84 
 85  /* 调用方法,不必多说。
 86 
 87  CString str;
 88   str.Format(L"getSum(%d,%d,%d,%d,%d)",m_poiStart.x,m_poiStart.y,m_poiEnd.x,m_poiEnd.y,a+1);
 89   ExecScript(str);
 90 
 91  */
 92  HRESULT Cems_mysql_appView::ExecScript(CString strjs)
 93  {
 94   HRESULT hr;
 95   m_spHtmlDoc  =   (IHTMLDocument2 * )(GetHtmlDocument());
 96    if (m_sphtmlWnd  ==  NULL)
 97   {
 98    hr  =  m_spHtmlDoc -> get_parentWindow( & m_sphtmlWnd); // 获取脚本指针
 99   }
100   CComBSTR bstrjs  =  strjs.AllocSysString();
101   CComBSTR bstrlan  =  SysAllocString(L " javascript " );
102   VARIANT varRet;
103   hr  =  m_sphtmlWnd -> execScript(bstrjs, bstrlan,  & varRet);
104    // m_sphtmlWnd = NULL;
105    return   1 ;
106  }
107