这种方式可以直接调用外部我们自己准备好的JS函数,而不需要打开网页,只能调用网页里的JS函数。
调用代码如下:
#include "stdafx.h"
#include"windows.h"
#include"stdio.h"
#import "C:\\Windows\\SysWOW64\\msscript.ocx" //ocx文件的位置,
using namespace MSScriptControl;
#include"fstream"
#include"string"
#include"stdlib.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr = CoInitialize(NULL); //初始化接口
IScriptControlPtr pScriptControl(__uuidof(ScriptControl));//定义脚本控件指针
pScriptControl->Language = "JavaScript";//说明脚本语言
fstream file;
file.open("D:\\VC++编程1200例\\C++调用JS\\test.js");//调用脚本文件的位置,
string strFileContent;//strFileContent表示整个JS代码段的内容
char szTemp[1024] = "";//每次读取1024个字符
do
{
file.read(szTemp, 1024);
strFileContent.append(szTemp);//将读取的字符添加到代码段
memset(szTemp, 0, 1024);//初始化函数,将szTemp归0
}while (!file.fail());//如果读写过程中出现错误则退出循环
file.close();//关闭文件
pScriptControl->AddCode(strFileContent.c_str());//c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同。是为了与C语言兼容
VARIANT A = pScriptControl->Eval(L"add(4,5)");
int iRet = A.intVal;
printf("%d\n", iRet);
system("pause");
return 0;
}
外部定义的JavaScript函数
function add(a,b)
{
return a+b;
}
备注:
1. memset函数
memset是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个函数通常为新申请的内存做初始化工作。
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 。
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。
2. fstream类
- ofstream, ifstream, fstream
在fstream类中,用open成员函数打开文件,实现类与文件的关联操作。 - open(filename, mode, prot):对所属类进行用指定的参数进行特定的文件关联
几种打开方式(mode):(这些方式可以用 ‘|’ 组合起来)
mode | 含义 |
---|---|
ios::in | 打开输入(读)文件 |
ios::out | 打开输出(写)文件 |
ios::ate | 初始位置为文件尾 |
ios::app | 所有写入附加在文件末尾 |
ios::trunc | 如果所操作的文件已经存在了,就先删除 |
ios::binary | 以二进制打开 |
打开文件的属性(prot):(这些方式可以用’+'进行组合,这个参数可以省略不传)
mode | 含义 |
---|---|
0 | 普通文件,打开操作 |
1 | 只读文件 |
2 | 隐含文件 |
4 | 系统文件 |
- close():用来关闭文件,是文件重新变为可访问,对象流也可以打开其他文件了
- 判断文件状态
is_open():文件是否正常打开
bad():读写过程中是否出错(操作对象没有打开,写入的设备没有空间)
fail():读写过程中是否出错(操作对象没有打开,写入的设备没有空间,格式错误–比如读入类型不匹配)
eof():读文件到达文件末尾,返回true
good():以上任何一个返回true,这个就返回false
- 获得和设置流指针
- 对于所有的输入输出流都有至少一个指针,指向下一个要操作的位置
ofstream put_point
ifstream get_point
fstream put_point和get_point
- 获取流指针位置
tellg(): 返回输入流指针的位置(返回类型long)
tellp(): 返回输出流指针的位置(返回类型long)
- 设置指针位置
seekg(long position): 设置输入流指针位置为第position个字符(文件首位置为开始位置)
seekp(long position): 设置输出流指针到指定位置
- 缓存和同步
当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起。这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介。例如,对于一个输出流, 每次成员函数put (写一个单个字符)被调用,这个字符不是直接被写入该输出流所对应的物理文件中的,而是首先被插入到该流的缓存(buffer)中。
当缓存被排放出来(flush)时,它里面的所有数据或者被写入物理媒质中(如果是一个输出流的话),或者简单的被抹掉(如果是一个输入流的话)。这个过程称为同步(synchronization),它会在以下任一情况下发生:
当文件被关闭时: 在文件被关闭之前,所有还没有被完全写出或读取的缓存都将被同步。
当缓存buffer 满时:缓存Buffers 有一定的空间限制。当缓存满时,它会被自动同步。
控制符明确指明:当遇到流中某些特定的控制符时,同步会发生。这些控制符包括:flush 和endl。
明确调用函数sync(): 调用成员函数sync() (无参数)可以引发立即同步。这个函数返回一个int 值,等于-1 表示流没有联系的缓存或操作失败。