|
|
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
复制、删除、移动、改名
对此贴的扩展,并写成单独的函数:办公软件WPS的JSA中删除文件入回收站
- function 复制文件测试(){
- let 源文件名='D:\\abc.txt';
- let 目标文件名='D:\\批处理\\xyz.ini';
- let 复制结果=复制文件(源文件名,目标文件名);
- console.clear();
- if(!复制结果){console.log("复制成功。");}else{console.log("复制失败!"+复制结果);}
- }
- function 删除文件测试(){
- let 文件名='D:\\abc.txt';
- let 删除结果=删除文件(文件名);
- console.clear();
- if(!删除结果){console.log("删除成功。");}else{console.log("删除失败!"+删除结果);}
- }
- function 移动文件测试(){
- let 源文件名='D:\\abc.txt';
- let 目标文件名='D:\\批处理\\xyz.ini'; //let 目标文件名='D:\\批处理\\xyz.ini';
- let 移动结果=移动文件(源文件名,目标文件名);
- console.clear();
- if(!移动结果){console.log("移动成功。");}else{console.log("移动失败!"+移动结果);}
- }
- function 文件改名测试(){ //必须是在同目录
- let 原文件名='D:\\abc.txt';
- let 新文件名='D:\\xyz.ini'; //let 新文件名='D:\\批处理\\xyz.ini';
- let 改名结果=文件改名(原文件名,新文件名);
- console.clear();
- if(!改名结果){console.log("改名成功。");}else{console.log("改名失败!"+改名结果);}
- }
- function 复制文件(源文件名,目标文件名){ //源与目标均用完整路径
- let 源文件名字节数=源文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 目标文件名字节数=目标文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 申请源内存大小=源文件名字节数+2,申请目标内存大小=目标文件名字节数+2;
-
- let 源内存句柄=申请本地内存(申请源内存大小);
- let 源内存地址=锁定本地内存(源内存句柄);
- 字符串写入内存(源文件名,源内存地址); //源文件名写入内存
- 解锁本地内存(源内存句柄);
-
- let 目标内存句柄=申请本地内存(申请目标内存大小);
- let 目标内存地址=锁定本地内存(目标内存句柄);
- 字符串写入内存(目标文件名,目标内存地址); //目标文件名写入内存
- 解锁本地内存(目标内存句柄);
-
- let 复制=2,删除=3,移动=1,改名=4;
- let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
- let 复制文件操作结构=[0,复制,源内存地址,目标内存地址,允许撤销|无需确认|不显示进度|直建目录,0,0,0];
- let 复制结果=文件操作(复制文件操作结构);
-
- 释放本地内存(目标内存句柄);释放本地内存(源内存句柄);
- return 复制结果;
- }
- function 删除文件(文件名){ //文件/目录用完整路径
- let 文件名字节数=文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 申请内存大小=文件名字节数+2;
-
- let 内存句柄=申请本地内存(申请内存大小);
- let 内存地址=锁定本地内存(内存句柄);
- 字符串写入内存(文件名,内存地址); //源文件名写入内存
- 解锁本地内存(内存句柄);
-
- let 删除=3,移动=1,改名=4;
- let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4;
- let 删除文件操作结构=[0,删除,内存地址,0,允许撤销|无需确认|不显示进度,0,0,0];
- let 删除结果=文件操作(删除文件操作结构);
-
- 释放本地内存(内存句柄);
- return 删除结果;
- }
- function 移动文件(源文件名,目标文件名){ //源与目标均用完整路径
- let 源文件名字节数=源文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 目标文件名字节数=目标文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 申请源内存大小=源文件名字节数+2,申请目标内存大小=目标文件名字节数+2;
-
- let 源内存句柄=申请本地内存(申请源内存大小);
- let 源内存地址=锁定本地内存(源内存句柄);
- 字符串写入内存(源文件名,源内存地址); //源文件名写入内存
- 解锁本地内存(源内存句柄);
-
- let 目标内存句柄=申请本地内存(申请目标内存大小);
- let 目标内存地址=锁定本地内存(目标内存句柄);
- 字符串写入内存(目标文件名,目标内存地址); //目标文件名写入内存
- 解锁本地内存(目标内存句柄);
-
- let 移动=1,改名=4;
- let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
- let 移动文件操作结构=[0,移动,源内存地址,目标内存地址,允许撤销|无需确认|不显示进度|直建目录,0,0,0];
- let 移动结果=文件操作(移动文件操作结构);
-
- 释放本地内存(目标内存句柄);释放本地内存(源内存句柄);
- return 移动结果;
- }
- function 文件改名(原文件名,新文件名){ //均用完整路径,必须在同目录下
- let 原文件名字节数=原文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 新文件名字节数=新文件名.replace(/[^\x00-\xff]/g,'xx').length;
- let 申请原内存大小=原文件名字节数+2,申请新内存大小=新文件名字节数+2;
-
- let 原内存句柄=申请本地内存(申请原内存大小);
- let 原内存地址=锁定本地内存(原内存句柄);
- 字符串写入内存(原文件名,原内存地址); //原文件名写入内存
- 解锁本地内存(原内存句柄);
-
- let 新内存句柄=申请本地内存(申请新内存大小);
- let 新内存地址=锁定本地内存(新内存句柄);
- 字符串写入内存(新文件名,新内存地址); //新文件名写入内存
- 解锁本地内存(新内存句柄);
-
- let 移动=1,改名=4;let 目标已存在=8;
- let 允许撤销=不显示错误=0x40,无需确认=0x10,不显示进度=4,直建目录=0x200;
- let 文件改名操作结构=[0,改名,原内存地址,新内存地址,允许撤销|无需确认|不显示进度,0,0,0];
- let 改名结果=文件操作(文件改名操作结构);
-
- 释放本地内存(新内存句柄);释放本地内存(原内存句柄);
- return 改名结果;
- }
- function 文件操作(操作数组){ //复制、删除、移动、改名
- const 执行宏调用=ExecuteExcel4Macro;
- let 内存句柄=申请本地内存(4*8); //文件操作结构:4字节*8
- let 内存地址=锁定本地内存(内存句柄);
- 数组写入内存(内存地址,操作数组);
- 解锁本地内存(内存句柄);
-
- 内存地址=锁定本地内存(内存句柄);
- let 操作结果=执行宏调用(`CALL("Shell32","SHFileOperationA","JJ",${内存地址})`); //执行文件操作
- 解锁本地内存(内存句柄);释放本地内存(内存句柄);
- return 操作结果;
- }
- function 字符串写入内存(字符串,内存地址){
- const 执行宏调用=ExecuteExcel4Macro;
- let 分段文本=[],分段字节=[],总字节=0,段长度=127;
- for(let 起始=i=0;起始<字符串.length;起始+=段长度,i++){
- 分段文本.push(字符串.slice(起始,起始+段长度));
- 分段字节.push(分段文本[i].replace(/[^\x00-\xff]/g,'xx').length); //一汉字占俩字节
- 总字节+=分段字节[i];
- }
- for(let 偏移字节=i=0;i<分段文本.length;i++){ //内存使用限长,字符串分批复制
- 执行宏调用(`CALL("Kernel32","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i].replace(/"/g,'""')}",${分段字节[i]})`);
- 偏移字节+=分段字节[i];
- }
- }
- function 数组写入内存(内存地址,数组){
- const 执行宏调用=ExecuteExcel4Macro,写入字节=4;
- for(let 偏移=i=0;i<数组.length;i++){ //写入
- 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${数组[i]},${写入字节})`);
- 偏移+=写入字节;
- }
- }
- function 申请本地内存(字节数){ //返回内存句柄
- const 执行宏调用=ExecuteExcel4Macro;
- const 内存句柄=执行宏调用(`CALL("Kernel32","LocalAlloc","JJJ",2,${字节数})`);
- if(内存句柄){
- return 内存句柄;
- }else{console.log("未能分配内存!");}
- }
- function 释放本地内存(内存句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("Kernel32","LocalFree","JJ",${内存句柄})`); //释放内存
- }
- function 锁定本地内存(内存句柄){ //返回内存地址
- const 执行宏调用=ExecuteExcel4Macro;
- const 内存地址=执行宏调用(`CALL("Kernel32","LocalLock","JJ",${内存句柄})`);
- if(内存地址){
- return 内存地址;
- }else{console.log("未找到内存地址!");}
- }
- function 解锁本地内存(内存句柄){
- const 执行宏调用=ExecuteExcel4Macro;
- 执行宏调用(`CALL("Kernel32","LocalUnlock","JJ",${内存句柄})`); //解锁
- }
复制代码 |
|