如何实现 js 和 c++ 的互相调用

JavaScript016

如何实现 js 和 c++ 的互相调用,第1张

脚本执行的基础是WEB控件,

那么C++在WINDOWS下运行可以装入WEB控件实现脚本调用。

下面是一段引用某位博主的代码可以参考一下。

// vcJscript.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#import "C:/windows/system32/msscript.ocx" // msscript.ocx

using namespace MSScriptControl

#include <fstream>

#include <string>

using namespace std

int _tmain(int argc, _TCHAR* argv[])

{

HRESULT hr = CoInitialize(NULL) //使用一个变量初始化COM设置,单线程运行

IScriptControlPtr pScriptControl(__uuidof(ScriptControl))//初始化脚本控件

pScriptControl->Language = "JavaScript"//设置语言

pScriptControl->AllowUI = TRUE//设置显示

fstream file//文件流用于读出JS代码

file.open( "test.js" )

string strFileContent, strTemp

char szTemp[1024]=""

do

{

file.read(szTemp, 1024)

strFileContent.append( szTemp )//拼接JS文件

memset( szTemp, 0, 1024 )

}

while ( !file.fail() )

file.close()

pScriptControl->AddCode(strFileContent.c_str())//向控件加入代码

VARIANT A = pScriptControl->Eval("main(4)")//获取返回值

int iRet = A.intVal

return 0

}

js只支持Activex Dll(所谓的com组件).在C#里如下面的方法写.

然后js里注册该控件并调用.

里面有两个方法

Encrypt(string pToEncrypt,string sKey) //加密

Decrypt(string pToDecrypt,string sKey) //解密

然后你这样写代码:

using System

using System.Runtime.InteropServices

namespace 名称空间

{

// 首先建立接口,这个是Com必须使用的

[Guid("61BB24CB-4C2C-40f8-9E13-1AC5E558D56A")]

public interface IEncrypt

{

string Encrypt(string pToEncrypt,string sKey)

string Decrypt(string pToDecrypt,string sKey)

}

// 写接口的实现

[Guid("CB52E990-185E-4448-A7E8-C88ECAD563AB")]

public class 类名称 : IEncrypt

{

public string Encrypt(string pToEncrypt,string sKey)

{

// 复制FAQ加密代码

}

public string Decrypt(string pToDecrypt,string sKey)

{

// 复制FAQ解密代码

}

}

}

然后用vs.net打包成.dll类库文件,假设名称为MyEncrypt.dll

然后用如下工具

regasm MyEnCrypt.dll /tlb:MyEncrypt.tlb

这个.tlb文件就是类型库,可以由vb6和vc++6引用。

注意上面的guid是使用vs.net工具菜单里面的创建guid工具生成的。

还要注意,vs.net自动生成的assemblyinfo.cs文件中必须添加强名称和版本号,因为Com组件需要版本号,不要改动版本号,也不要用vs.net自动的1.*这样的版本号,最好使用

1.1.1.1这样的固定版本,而且必须一次添加,不能多次添加。

regasm后怎样在js里调用?

用你的例子是这样?

var ss = new ActiveXObject("MyEncrypt.类名称")

JS不可以调用普通的Dll动态链接库,但你可以使用new ActiveXObject调用ActiveX DLL,如:

<script>

set z_shell= CreateObject( "WScript.Shell" )

z_shell.Run( "command.com /c mkdir " + "c:\NewDir")

</script>

例如一个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)}