在C++中怎么调用一个js中的方法

JavaScript025

在C++中怎么调用一个js中的方法,第1张

例如一个test.js内容如下:function main( input ){ return input}在C++中调用方法如下:// vcJscript.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#import "C:/windows/system32/msscript.ocx" // msscript.ocx using namespace MSScriptControl#include <fstream>#include <string>using namespace stdint _tmain(int argc, _TCHAR* argv[]){HRESULT hr = CoInitialize(NULL)IScriptControlPtr pScriptControl(__uuidof(ScriptControl))pScriptControl->Language = "JavaScript"//pScriptControl->AllowUI = TRUEfstream filefile.open( "test.js" )string strFileContent, strTempchar szTemp[1024]=""do{ file.read(szTemp, 1024) strFileContent.append( szTemp ) memset( szTemp, 0, 1024 )}while ( !file.fail() )file.close()pScriptControl->AddCode(strFileContent.c_str())VARIANT A = pScriptControl->Eval("main(4)")int iRet = A.intValreturn 0}脚本控件有四种方法。其中之一是 Run(),运行子例程或函数。在调用此方法之前,指定的脚本语言、 设置 AllowUI,并将下面的脚本添加到脚本控件://---------------------- Begin --------------------------- #include <stdio.h>#import "C:/winnt/system32/msscript.ocx" // msscript.ocx using namespace MSScriptControlint main(void){ HRESULT hr = CoInitialize(NULL) IScriptControlPtr pScriptControl(__uuidof(ScriptControl)) // Create a VARIANT array of VARIANTs which hold BSTRs LPSAFEARRAY psaSAFEARRAYBOUND rgsabound[] = { 3, 0 }// 3 elements, 0-based int i psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound)if (!psa) { return E_OUTOFMEMORY} VARIANT vFlavors[3]for (i = 0i <3i++) { VariantInit(&vFlavors[i]) V_VT(&vFlavors[i]) = VT_BSTR} V_BSTR(&vFlavors[0]) = SysAllocString(OLESTR("Vanilla"))V_BSTR(&vFlavors[1]) = SysAllocString(OLESTR("Chocolate"))V_BSTR(&vFlavors[2]) = SysAllocString(OLESTR("Espresso Chip")) long lZero = 0long lOne = 1long lTwo = 2 // Put Elements to the SafeArray: hr = SafeArrayPutElement(psa, &lZero,&vFlavors[0])hr = SafeArrayPutElement(psa, &lOne,&vFlavors[1])hr = SafeArrayPutElement(psa, &lTwo,&vFlavors[2]) // Free Elements from the SafeArray: for(i=0i<3i++) { SysFreeString(vFlavors[i].bstrVal)} // Set up Script control properties pScriptControl->Language = "JScript"pScriptControl->AllowUI = TRUEpScriptControl->AddCode( "function MyStringFunction(Argu1,Argu2,Argu3)/ { return /"hi there/" }" ) // Call MyStringFunction with the two args: _variant_t outpar = pScriptControl->Run("MyStringFunction", &psa)// Convert VARIANT to C string: _bstr_t bstrReturn = (_bstr_t)outparchar *pResult = (char *)bstrReturn // Print the result out: printf("func=%s/n",pResult) // Clean up: SafeArrayDestroy(psa) CoUninitialize()return(0)}

通过webBrowser实现C#和javascript互调

实现步骤:

一、新建一个窗体,加入webBrowser控件

控件名:webBrowser1

二、在窗体后台代码加入如下定义

[System.Runtime.InteropServices.ComVisibleAttribute(true)]

public partial class Form1 : Form

{

...

}

三、加载网页

webBrowser1.Navigate(Application.StartupPath + "/UpDateReport.htm")

webBrowser1.ObjectForScripting = this//这句必须,不然js不能调用C#

四、调用脚本方法

/// <summary>

/// 脚本方法

/// </summary>

/// <param name="tag">JS函数名|参数1|参数2</param>

/// <returns></returns>

private object EXEC_JS(System.Windows.Forms.WebBrowser webBrowser, string tag)

{

string[] args = tag.Split('|')

if (args.Length == 1)

{

return webBrowser.Document.InvokeScript(args[0], null)

}

else

{

object[] objects = new object[args.Length - 1]

Array.Copy(args, 1, objects, 0, objects.Length)

return webBrowser.Document.InvokeScript(args[0], objects)

}

}

五、C#调用脚本方法例子,可以有返回值

//JS方法

<script language="javascript">

function js_fun(args)

{

alert("我是通过js脚本弹出的。你输入的内容是:"+args)

return "JAVASCRIPT"

}

</script>

//C#代码

object returnvalue = EXEC_JS(webBrowser1, "js_fun|参数字符串")

MessageBox.Show("js方法返回值是:" + returnvalue.ToString())

六、JS调用C#方法的例子

//C#方法

public string Test(string args)

{

return "你输入的是:"+args

}

//JS代码

<script language="javascript">

window.onload = function()

{

var CS_returnvalue= window.external.Test("aaa")

alert(CS_returnvalue)

}

</script>

可能的原因有以下几种:

确保jsp页面有引用c标签,可以通过在c:if之前${user}这样也可以输出session里的对象会打印出类包名。

确保页面引用了jquery

js页面加载的问题,js加载是有顺序的。要在dom都加载好后才能取得页面的ID值的。

样式也可能使你的窗口看不到比如被别的层遮了。特别是iframe容易遮别人

解决调试方法代码如下:

如果类不为空,这里会显示类名:${user}

<c:if test="${empty user}">

<script>

alert("说明user为空,已经进入JS")//alert是js最好的调试工具可以知道js是否已经执行到这行

$(function(){//用jquery页面初始化加载会在dom加载完后执行确保curtain等ID能取到

  alert($("#curtain").html())

$("#dialogue").css({top:150,left:500,position:"absolute","z-index":99999})//这个要绝对定位z-index要比较高才能浮起来

$("#curtain").show()

})

</script>

</c:if>