在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
ScriptControl接口
一般使用方法1、在程序中加入ScriptControl 2、定义一个ScriptControl的实例 3、调用AddCode等方法向脚本引擎中加入要执行的脚本。 4、调用Run执行要执行的脚本函数。 1.导入msscript.ocx1 #import "C:\\Windows\\syswow64\\msscript.ocx" no_namespace 这一步步能忘记否则无法生成com接口文件 下面的就是代码了
1 fstream m_fs; 2 long Error_code=NULL; 3 long Error_Line = NULL; 4 BSTR Error_content; 5 HRESULT hr = ::CoInitialize(NULL); //初始化com库 6 IScriptControlPtr m_IScritp(__uuidof(ScriptControl)); 7 IScriptErrorPtr m_IScript_Error = m_IScritp->Error; 8 //hr = m_IScritp->get_Error(&m_IScript_Error); 9 m_IScritp->Language = "javascript"; //设置语言的格式 10 m_fs.open("QQ.js", ios::in | ios::_Nocreate); 11 if (!m_fs.is_open()) { 12 m_fs.close(); 13 return ; 14 } 15 //得到文件的大小 16 m_fs.seekg(0, ios::end); 17 streamoff length; 18 DWORD i = 0; 19 string m_str; 20 length = m_fs.tellg(); 21 i = (DWORD)length; 22 char* strTemp = new char[i]; 23 if (!strTemp)return; 24 memset(strTemp, 0, i); 25 m_fs.seekg(0, ios::beg); 26 m_fs.read(strTemp, length); 27 m_str.append(strTemp); 28 m_fs.close(); //关闭文件流 29 //size_t max_size =m_str.max_size(); 30 /*hr = m_IScritp->AddCode(m_str.c_str()); //把代码加载到解释器里 31 if (FAILED(hr)) { 32 hr = m_IScript_Error->get_Number(&Error_code); 33 hr = m_IScript_Error->get_Line(&Error_Line); 34 hr = m_IScript_Error->get_Description(&Error_content); 35 };*/ 36 hr=m_IScritp->ExecuteStatement(m_str.c_str()); //ExecuteStatement 和AddCode 一样都是将代码加入解释器 使用任意一个都可以 37 if (FAILED(hr)) { 38 hr = m_IScript_Error->get_Number(&Error_code); //获取错误的代码 39 hr = m_IScript_Error->get_Line(&Error_Line); //获取错误的行号 40 hr = m_IScript_Error->get_Description(&Error_content); //获取具体错误的文本描述 41 }; 42 _bstr_t eval = "getEncryption(\"123456\",\"\",\"!VVZ\",0);"; 43 _variant_t r_st; 44 LPSAFEARRAY pSafearray; //安全数组指针 45 SAFEARRAYBOUND rgsabound[1]; 46 /* 47 SAFEARRAYBOUND是一个结构体,里面有两个变量,ULONG cElements表示的是元素的数目(更准确的说是在本维中的数目); 48 LONG lLbound表示的是一个逻辑起点序号,实际访问内存的时候,安全数组会将程序指定的序号减去lLbound, 49 比如你将其设置为10000,a[10000]这相当于A[0],a[999]数组越界,所以在没有特殊要求的情况下,lLbound一般为0。 50 还有一点,定义的时候是SAFEARRAYBOUND rgsaBound[1], 这点要解释一下,rgsaBound[1]表示的是一位数组, 51 二维数组要定义为rgsaBound[2],这里主要讲解一位数组,更高维数大家可以去搜一下,和一维的相似。 52 */ 53 rgsabound[0].cElements = 4; 54 rgsabound[0].lLbound = 0; 55 pSafearray = SafeArrayCreate(VT_VARIANT, 1, rgsabound); 56 /* 57 第一个参数VT_VARIANT表示数组的类型,第二个参数表示创建数组的维数,本例中是一维,第三个参数是对这个数组各个维度的描述。 58 SafeArrayCreate()就是创建SAFEARRAY的函数,准确的说是在堆中创建了一个SAFEARRAY,也就是说在这个函数里面, 59 调用了new或者malloc()之类的申请了一个空间 最后使用SafeArrayDestroy() 释放内部申请的空间 60 */ 61 if (!pSafearray) 62 { 63 return; 64 } 65 VARIANT vFlavors[4]; 66 67 for (LONG i = 0;i<4;i++) 68 { 69 VariantInit(&vFlavors[i]); 70 V_VT(&vFlavors[i]) = VT_BSTR; 71 if (i==3) 72 { 73 vFlavors[i].vt = VT_INT; //最后一个参数是整数 74 } 75 } 76 vFlavors[0].bstrVal = SysAllocString(OLESTR("123456")); 77 vFlavors[1].bstrVal = SysAllocString(OLESTR("")); 78 vFlavors[2].bstrVal = SysAllocString(OLESTR("!VVZ")); 79 vFlavors[3].intVal = 0; 80 81 for (LONG l=0;l<4;l++) 82 { 83 SafeArrayPutElement(pSafearray, &l, &vFlavors[l]); 84 /* 85 第一个参数是指向SAFEARRAY的指针; 86 第二个参数是long型数组元素下标的指针, 87 第三个参数就是要放置的那个值得指针了。 88 */ 89 if (l<3) 90 { 91 SysFreeString(vFlavors[l].bstrVal); 92 } 93 94 } 95 r_st = m_IScritp->Run("getEncryption",&pSafearray); 96 if (r_st.vt==VT_NULL || r_st.vt ==VT_EMPTY) { 97 hr = m_IScript_Error->get_Number(&Error_code); 98 hr = m_IScript_Error->get_Line(&Error_Line); 99 hr = m_IScript_Error->get_Description(&Error_content); 100 }; 101 /* 102 m_IScript_Error->get_Column(); 103 m_IScript_Error->get_HelpContext(); 104 m_IScript_Error->get_Source(); 105 m_IScript_Error->get_Text(); 106 */ 107 SafeArrayDestroy(pSafearray);//释放数组空间 108 delete [] strTemp; 109 ::CoUninitialize();
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论