vc++调用msscript.ocx解析实现C++与JavaScript脚本交互
ScriptControl接口
|
属性名称 |
类型 |
备注 |
|
AllowUI |
BOOL |
检测是否允许运行用户的接口元素。如果为False,则诸如消息框之类的界面元素不可见。 |
|
CodeObject |
Object |
脚本暴露给宿主调用的对象。只读。 |
|
Modules |
Modules |
宿主提供给脚本的组件库模块。只读。(COM组件通常都是以对象收集的形式向用户提供可以留给用户二次开发的对象集合,每一个收集即一个Modules) |
|
Language |
String |
设置或获取脚本引擎解释的语言,例如:VBScript、JScript。 |
|
Name |
String |
脚本引擎的名称。只读。 |
|
Procedures |
Procedures |
返回模块中定义的过程的集合 |
|
SitehWnd |
HWND |
在脚本中显示UI的父窗口句柄 |
|
State |
Enum |
设置或返回控件的状态,如果为0,控件只执行语句但不转发事件,为1则为加入的本控件接受的对象转发事件。 |
|
Timeout |
Long |
控件的执行脚本的超时值,-1表示不超时 |
|
UseSafeSubset |
BOOL |
设置或返回宿主程序是否关心安全。宿主程序的安全级别可以从此属性设置 |
|
Error |
Error |
错误对象,发生错误时,此属性返回一个错误对象 |
|
方法名称 |
参数 |
功能 |
|
AddCode |
Code As String |
往脚本引擎中加入要执行的脚本 |
|
AddObject |
Name As String, Object As Object, [AddMembers As Boolean = False] |
往脚本引擎加入一个对象,以便在脚本中可以使用该对象提供的方法等。 |
|
Eval |
Expression As String |
表达式求值 |
|
ExecuteStatement |
Statement As String |
解释并执行脚本语句 |
|
Reset |
丢弃所有的对象和代码,将State属性置0。 |
|
|
Run |
ProcedureName As String, ParamArray Parameters() As Variant |
运行一个指定的过程 |
|
事件名称 |
功能 |
|
Error |
有错误发生时激发该事件 |
|
TimeOut |
执行过程超时时发生 |
一般使用方法
1、在程序中加入ScriptControl
2、定义一个ScriptControl的实例
3、调用AddCode等方法向脚本引擎中加入要执行的脚本。
4、调用Run执行要执行的脚本函数。
1.导入msscript.ocx
#import "C:\\Windows\\syswow64\\msscript.ocx" no_namespace
这一步步能忘记否则无法生成com接口文件
下面的就是代码了
fstream m_fs;
long Error_code=NULL;
long Error_Line = NULL;
BSTR Error_content;
HRESULT hr = ::CoInitialize(NULL); //初始化com库
IScriptControlPtr m_IScritp(__uuidof(ScriptControl));
IScriptErrorPtr m_IScript_Error = m_IScritp->Error;
//hr = m_IScritp->get_Error(&m_IScript_Error);
m_IScritp->Language = "javascript"; //设置语言的格式
m_fs.open("QQ.js", ios::in | ios::_Nocreate);
if (!m_fs.is_open()) {
m_fs.close();
return ;
}
//得到文件的大小
m_fs.seekg(, ios::end);
streamoff length;
DWORD i = ;
string m_str;
length = m_fs.tellg();
i = (DWORD)length;
char* strTemp = new char[i];
if (!strTemp)return;
memset(strTemp, , i);
m_fs.seekg(, ios::beg);
m_fs.read(strTemp, length);
m_str.append(strTemp);
m_fs.close(); //关闭文件流
//size_t max_size =m_str.max_size();
/*hr = m_IScritp->AddCode(m_str.c_str()); //把代码加载到解释器里
if (FAILED(hr)) {
hr = m_IScript_Error->get_Number(&Error_code);
hr = m_IScript_Error->get_Line(&Error_Line);
hr = m_IScript_Error->get_Description(&Error_content);
};*/
hr=m_IScritp->ExecuteStatement(m_str.c_str()); //ExecuteStatement 和AddCode 一样都是将代码加入解释器 使用任意一个都可以
if (FAILED(hr)) {
hr = m_IScript_Error->get_Number(&Error_code); //获取错误的代码
hr = m_IScript_Error->get_Line(&Error_Line); //获取错误的行号
hr = m_IScript_Error->get_Description(&Error_content); //获取具体错误的文本描述
};
_bstr_t eval = "getEncryption(\"123456\",\"\",\"!VVZ\",0);";
_variant_t r_st;
LPSAFEARRAY pSafearray; //安全数组指针
SAFEARRAYBOUND rgsabound[];
/*
SAFEARRAYBOUND是一个结构体,里面有两个变量,ULONG cElements表示的是元素的数目(更准确的说是在本维中的数目);
LONG lLbound表示的是一个逻辑起点序号,实际访问内存的时候,安全数组会将程序指定的序号减去lLbound,
比如你将其设置为10000,a[10000]这相当于A[0],a[999]数组越界,所以在没有特殊要求的情况下,lLbound一般为0。
还有一点,定义的时候是SAFEARRAYBOUND rgsaBound[1], 这点要解释一下,rgsaBound[1]表示的是一位数组,
二维数组要定义为rgsaBound[2],这里主要讲解一位数组,更高维数大家可以去搜一下,和一维的相似。
*/
rgsabound[].cElements = ;
rgsabound[].lLbound = ;
pSafearray = SafeArrayCreate(VT_VARIANT, , rgsabound);
/*
第一个参数VT_VARIANT表示数组的类型,第二个参数表示创建数组的维数,本例中是一维,第三个参数是对这个数组各个维度的描述。
SafeArrayCreate()就是创建SAFEARRAY的函数,准确的说是在堆中创建了一个SAFEARRAY,也就是说在这个函数里面,
调用了new或者malloc()之类的申请了一个空间 最后使用SafeArrayDestroy() 释放内部申请的空间
*/
if (!pSafearray)
{
return;
}
VARIANT vFlavors[]; for (LONG i = ;i<;i++)
{
VariantInit(&vFlavors[i]);
V_VT(&vFlavors[i]) = VT_BSTR;
if (i==)
{
vFlavors[i].vt = VT_INT; //最后一个参数是整数
}
}
vFlavors[].bstrVal = SysAllocString(OLESTR(""));
vFlavors[].bstrVal = SysAllocString(OLESTR(""));
vFlavors[].bstrVal = SysAllocString(OLESTR("!VVZ"));
vFlavors[].intVal = ; for (LONG l=;l<;l++)
{
SafeArrayPutElement(pSafearray, &l, &vFlavors[l]);
/*
第一个参数是指向SAFEARRAY的指针;
第二个参数是long型数组元素下标的指针,
第三个参数就是要放置的那个值得指针了。
*/
if (l<)
{
SysFreeString(vFlavors[l].bstrVal);
} }
r_st = m_IScritp->Run("getEncryption",&pSafearray);
if (r_st.vt==VT_NULL || r_st.vt ==VT_EMPTY) {
hr = m_IScript_Error->get_Number(&Error_code);
hr = m_IScript_Error->get_Line(&Error_Line);
hr = m_IScript_Error->get_Description(&Error_content);
};
/*
m_IScript_Error->get_Column();
m_IScript_Error->get_HelpContext();
m_IScript_Error->get_Source();
m_IScript_Error->get_Text();
*/
SafeArrayDestroy(pSafearray);//释放数组空间
delete [] strTemp;
::CoUninitialize();
vc++调用msscript.ocx解析实现C++与JavaScript脚本交互的更多相关文章
- VC调用javascript的几种方法
第一种:通过execScript调用.这种方法,虽然操作方便,但不能获取返回值.m_spHtmlDoc->get_parentWindow(&m_pHtmlWindow);VARIANT ...
- c++builder调用VC的dll以及VC调用c++builder的dll
解析__cdecl,__fastcall, __stdcall 的不同:在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式. 比如说__cdecl,它是标准的c方法的堆栈调用方式,就 ...
- JAVA方法调用中的解析与分派
JAVA方法调用中的解析与分派 本文算是<深入理解JVM>的读书笔记,参考书中的相关代码示例,从字节码指令角度看看解析与分派的区别. 方法调用,其实就是要回答一个问题:JVM在执行一个方法 ...
- VC调用DLL
VC调用DLL 调用DLL有两种方法:静态调用和动态调用. (一).静态调用其步骤如下: 1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下; 2. ...
- VC调用MATLAB
最近项目要用VC调用MATLAB,今天闲来无事,在这里稍微总结了一下初级的用法,大家共同学习: 首先在MATLAB Command Window里输入mbuild -setup,一步步走 还有一个me ...
- VC调用易语言DLL
易语言方面: .版本 .子程序 show, , 公开 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中. ***注意不 ...
- C#调用第三方ocx控件 (winform /aspx)
C#调用第三方ocx控件 1..net环境在工具箱上点右键,选择自定义工具箱,然后选择你需要的COM或者OCX控件就可以了. 2.在自定义工具箱中加入相应的控件,设置id,在客户端脚本中直接引用它 ...
- ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法
ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...
- VBA中使用JavaScript脚本语言解析JSON数据
JSON:JavaScript 对象表示法(JavaScript Object Notation) 和xml相似,都是文本形式(保存在文本文件中或字符串等形式),比如: jsstr = {" ...
随机推荐
- android service中stub作用是什么?
AIDL(android 接口描述语言)是一个IDL语言,它可以生成一段代码,可以使在一个android设备上运行的两个进程使用内部通信进程进行交互.如果你需要在一个进程中(例如:在一个Activit ...
- 使用 Captcha 扩展包 为 Laravel 5 应用生成验证码
http://laravelacademy.org/post/3910.html 1.安装 我们通过 Composer 安装 Captcha 扩展包: composer require mews/ca ...
- jquery attr()和prop()方法的区别
$('').attr()返回的是html对象 $('').prop()返回的是DOM对象 attr(): attr() 方法设置或返回被选元素的属性和值. 当该方法用于返回属性值,则返回第一个匹配元素 ...
- Linux 用户he用户组管理
8)系统中有一类用户称为伪用户(psuedo users). 这些用户在/etc/passwd 文件中也占有一条记录,但是不能登陆,因为他们的登陆shell 为空,他们的存在主要是方便系统管理,满足 ...
- oracle函数 RTRIM(c1,[,c2])
[功能]删除右边出现的字符串 [参数]C1 字符串 c2 追加字符串,默认为空格 [返回]字符型 [示例] SQL> select RTRIM('gao qian jingXXXX','X') ...
- 动画删除cell出问题
删除UITableView行的代理时出了问题 解决办法 先remove数据,再执行 [_mTableView deleteRowsAtIndexPaths:[NSArray arrayWithObje ...
- Android 性感美图在线浏览APP
周末无聊,遂整理了下近来常用的几个开源库,无意间又发现了一些开放接口,于是乎决定融合在一起,做个简单的"性感美图"浏览的APP,名字呢,就叫"性感沙滩",效果如 ...
- Linux环境下第一次提交项目
Linux环境下第一次提交项目: vi 日记 新增一个文件名为“日记”的文件 git status 工作区的状态 git add 日记 建立跟踪 git commit 提交变更 ----------- ...
- jar包运行
配置mainClass: <plugin> <groupId>org.apache.maven.plugins</gr ...
- PL/SQL语言的学习笔记
一.PL/SQL简介1.什么是PL/SQL程序?(PL/SQL是对SQL语言的一个扩展,从而形成的一个语言) 2.PL/SQL语言的特点(操作Orcale数据库效率最高的就是PL/SQL语言,而不是C ...