|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
函数:
- function 获取电脑时间(){ //返回时间数组缓冲
- const 执行宏调用=ExecuteExcel4Macro;
- const 时间结构字节数=16; //时间结构2*8=16字节 //申请内存
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${时间结构字节数},${0x3000},4)`);
- 执行宏调用(`CALL("Kernel32","GetLocalTime","JJ",${内存地址})`); //获取电脑时间数据
- let 时间数组缓冲=内存读取数据(内存地址,时间结构字节数); /*****读取内存数据*****/
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- return 时间数组缓冲;
- }
- function 设置电脑时间(时间数组缓冲){
- const 执行宏调用=ExecuteExcel4Macro;
- const 时间结构字节数=16; //申请内存
- const 内存地址=执行宏调用(`CALL("Kernel32","VirtualAlloc","JJJJJ",0,${时间结构字节数},${0x3000},4)`);
- 数据写入内存(内存地址,时间数组缓冲,时间结构字节数); //写入时间结构
- let 设置时间=执行宏调用(`CALL("Kernel32","SetLocalTime","AJ",${内存地址})`); //设置时间
- if(!设置时间){console.log("时间设置失败!");}
- 执行宏调用(`CALL("Kernel32", "VirtualFree", "JJJJ", ${内存地址}, 0, ${0x8000})`); //释放内存
- }
复制代码
测试与调用的函数:
- function 获取设置本机时间测试(){
- let 时间数组缓冲=获取电脑时间(); /*****获取时间*****/
- console.clear();显示数组缓冲(时间数组缓冲); /*****显示时间数据*****/
-
- const 数据操作=new DataView(时间数组缓冲); //将日期时间数据转成常用文本形式
- let 年=数据操作.getInt16(0,true),月=数据操作.getInt16(2,true);
- let 星期=数据操作.getInt16(4,true),日=数据操作.getInt16(6,true);
- let 时=数据操作.getInt16(8,true),分=数据操作.getInt16(10,true);
- let 秒=数据操作.getInt16(12,true),毫秒=数据操作.getInt16(14,true);
- console.log(年+"-"+月+"-"+日+" 周"+星期+" "+时+':'+分+':'+秒+'.'+毫秒); //显示日期时间文本
-
- //分钟减15
- 分=(分+60-15)%60;数据操作.setInt16(10,分,true);
- 设置电脑时间(时间数组缓冲); /*****设置时间*****/
- }
- function 内存读取数据(内存地址,字节数){ //返回数组缓冲
- const 执行宏调用=ExecuteExcel4Macro;
- let 偏移,i,读取字节=[],读出数据;
- for(偏移=i=0;偏移<字节数;i++){
- if(字节数-偏移>=4){读取字节[i]=4;偏移+=4;}
- else{if(字节数-偏移>=2){读取字节[i]=2;偏移+=2;}
- else{if(字节数-偏移==1){读取字节[i]=1;偏移++;}}}
- }
- const 数组缓冲=new ArrayBuffer(字节数); //用于存储读出的数据
- const 数据操作=new DataView(数组缓冲);
- for(偏移=i=0;偏移<字节数;i++){ //库Kernel32.dll和NtDll.dll里都有RtlMoveMemory //读出
- 读出数据=执行宏调用(`CALL("Kernel32","RtlMoveMemory","1NJJ",${内存地址},${内存地址+偏移},${读取字节[i]})`);
- if(读取字节[i]==4){数据操作.setInt32(偏移,读出数据,true);偏移+=4;}
- else{if(读取字节[i]==2){数据操作.setInt16(偏移,读出数据,true);偏移+=2;}
- else{if(读取字节[i]==1){数据操作.setInt8(偏移,读出数据,true);偏移++;}}}
- }
- return 数组缓冲; //返回
- }
- function 数据写入内存(内存地址,数组缓冲,字节数){
- const 数据操作=new DataView(数组缓冲);
- let 偏移=i=0,待写数据=[],写入字节=[];
- while(字节数>偏移){
- if(字节数-偏移>=4){待写数据[i]=数据操作.getInt32(偏移,true);写入字节[i]=4;i++;偏移+=4;}
- else{if(字节数-偏移>=2){待写数据[i]=数据操作.getInt16(偏移,true);写入字节[i]=2;i++;偏移+=2;}
- else{if(字节数-偏移==1){待写数据[i]=数据操作.getInt8(偏移,true);写入字节[i]=1;i++;偏移++;}}}
- }
- const 执行宏调用=ExecuteExcel4Macro;
- for(偏移=i=0;i<写入字节.length;i++){ //写入
- 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${待写数据[i]},${写入字节[i]})`);
- 偏移+=写入字节[i];
- }
- }
- function 显示数组缓冲(数组缓冲){
- const 数据操作=new DataView(数组缓冲);
- var 字节数码串=[],字符串=[],行号,四分隔,八分隔;
- for(let 偏移=0;偏移<数组缓冲.byteLength;偏移++){
- var 字节数码=数据操作.getInt8(偏移);
- 行号=Math.floor(偏移/16);
- if((偏移+1)%4){四分隔=''}else{四分隔=' '};
- if((偏移+1)%8){八分隔=''}else{八分隔=' '};
- if(typeof 字节数码串[行号]=="undefined"){字节数码串[行号]=''}
- var 字节高位=(字节数码>>>4&0xF).toString(16).toUpperCase(),字节低位=(字节数码&0xF).toString(16).toUpperCase();
- 字节数码串[行号]+=字节高位+字节低位+" "+四分隔+八分隔;
- if(typeof 字符串[行号]=="undefined"){字符串[行号]=''}
- if(字节数码){字符串[行号]+=String.fromCharCode(字节数码);}else{字符串[行号]+=' ';}
- }
- for(let 行号=0;行号<字节数码串.length;行号++){
- var 十六进制行号=('000'+(行号<<4).toString(16)).slice(-4).toUpperCase();
- console.log(十六进制行号+":"+字节数码串[行号]+"\t["+字符串[行号]+"]");
- }
- }
复制代码
|
|