找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 233|回复: 9

办公软件WPS的JSA中执行程序操作

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式
办公软件WPS的表格:通过ExecuteExcel4Macro调用WinAPI实现
打开、定位、显示属性

打开目录并定位文件:
  1. function 打开目录选中文件测试(){
  2.         let 操作="open",程序="explorer";
  3.         let 参数="/select,C:\\Windows\\System32\\cmd.exe";
  4.        
  5.         let 操作字节数=操作.replace(/[^\x00-\xff]/g,'xx').length;
  6.         let 程序字节数=程序.replace(/[^\x00-\xff]/g,'xx').length;
  7.         let 参数字节数=参数.replace(/[^\x00-\xff]/g,'xx').length;
  8.         let 申请内存大小=(操作字节数+1)+(程序字节数+1)+(参数字节数+1);
  9.         let 操作偏移=0,程序偏移=操作字节数+1,参数偏移=程序偏移+(程序字节数+1);
  10.        
  11.         let 内存句柄=申请本地内存(申请内存大小);
  12.         let 内存地址=锁定本地内存(内存句柄);
  13.         字符串写入内存(操作,内存地址+操作偏移);        //写入内存
  14.         字符串写入内存(程序,内存地址+程序偏移);
  15.         字符串写入内存(参数,内存地址+参数偏移);
  16.         解锁本地内存(内存句柄);
  17.        
  18.         let 结构大小=4*15,菜单项=0xC,普通显示=1,显示=5;
  19.         let 程序操作结构=[结构大小,0,0,内存地址,内存地址+程序偏移,内存地址+参数偏移,0,普通显示,0,0,0,0,0,0,0];
  20.         let 操作结果=执行操作(程序操作结构);        //===具体操作===//
  21.        
  22.         释放本地内存(内存句柄);
  23. }
复制代码

调用函数:
  1. function 执行操作(执行操作数组){        //打开、定位、编辑、查找、属性、打印等
  2.         const 执行宏调用=ExecuteExcel4Macro;
  3.         let 内存句柄=申请本地内存(4*15);        //执行操作结构:4字节*15
  4.         let 内存地址=锁定本地内存(内存句柄);
  5.         数组写入内存(内存地址,执行操作数组);        //===结构参数放到内存===//
  6.         解锁本地内存(内存句柄);
  7.        
  8.         内存地址=锁定本地内存(内存句柄);
  9.         let 执行操作结果=执行宏调用(`CALL("Shell32","ShellExecuteExA","AJ",${内存地址})`);        //执行操作
  10.         解锁本地内存(内存句柄);释放本地内存(内存句柄);
  11.         return 执行操作结果;
  12. }

  13. function 字符串写入内存(字符串,内存地址){
  14.         const 执行宏调用=ExecuteExcel4Macro;
  15.         let 分段文本=[],分段字节=[],总字节=0,段长度=127;
  16.         for(let 起始=i=0;起始<字符串.length;起始+=段长度,i++){
  17.                 分段文本.push(字符串.slice(起始,起始+段长度));
  18.                 分段字节.push(分段文本[i].replace(/[^\x00-\xff]/g,'xx').length);        //一汉字占俩字节
  19.                 总字节+=分段字节[i];
  20.         }
  21.         for(let 偏移字节=i=0;i<分段文本.length;i++){        //内存使用限长,字符串分批复制
  22.                 执行宏调用(`CALL("Kernel32","lstrcpynW","JJFJ",${内存地址+偏移字节},"${分段文本[i].replace(/"/g,'""')}",${分段字节[i]})`);
  23.                 偏移字节+=分段字节[i];
  24.         }
  25. }
  26. function 数组写入内存(内存地址,数组){
  27.         const 执行宏调用=ExecuteExcel4Macro,写入字节=4;
  28.         for(let 偏移=i=0;i<数组.length;i++){        //写入
  29.                 执行宏调用(`CALL("Kernel32","RtlMoveMemory","2JNJ",${内存地址+偏移},${数组[i]},${写入字节})`);
  30.                 偏移+=写入字节;
  31.         }
  32. }
  33. function 申请本地内存(字节数){        //返回内存句柄
  34.         const 执行宏调用=ExecuteExcel4Macro;
  35.         const 内存句柄=执行宏调用(`CALL("Kernel32","LocalAlloc","JJJ",2,${字节数})`);
  36.         if(内存句柄){
  37.                 return 内存句柄;
  38.         }else{console.log("未能分配内存!");}
  39. }
  40. function 释放本地内存(内存句柄){
  41.         const 执行宏调用=ExecuteExcel4Macro;
  42.         执行宏调用(`CALL("Kernel32","LocalFree","JJ",${内存句柄})`);        //释放内存
  43. }
  44. function 锁定本地内存(内存句柄){        //返回内存地址
  45.         const 执行宏调用=ExecuteExcel4Macro;
  46.         const 内存地址=执行宏调用(`CALL("Kernel32","LocalLock","JJ",${内存句柄})`);
  47.         if(内存地址){
  48.                 return 内存地址;
  49.         }else{console.log("未找到内存地址!");}
  50. }
  51. function 解锁本地内存(内存句柄){
  52.         const 执行宏调用=ExecuteExcel4Macro;
  53.         执行宏调用(`CALL("Kernel32","LocalUnlock","JJ",${内存句柄})`);        //解锁
  54. }
复制代码


 楼主| 发表于 3 天前 | 显示全部楼层

打开特殊目录:我的电脑

  1. function 打开我的电脑测试(){        //我的电脑/此电脑
  2.         let 操作="open",程序="explorer.exe";
  3.         let 参数="::{20d04fe0-3aea-1069-a2d8-08002b30309d};"        //特殊目录用ID
  4.         
  5.         let 操作字节数=操作.replace(/[^\x00-\xff]/g,'xx').length;
  6.         let 程序字节数=程序.replace(/[^\x00-\xff]/g,'xx').length;
  7.         let 参数字节数=参数.replace(/[^\x00-\xff]/g,'xx').length;
  8.         let 申请内存大小=(操作字节数+1)+(程序字节数+1)+(参数字节数+1);
  9.         let 操作偏移=0,程序偏移=操作字节数+1,参数偏移=程序偏移+(程序字节数+1);
  10.         
  11.         let 内存句柄=申请本地内存(申请内存大小);
  12.         let 内存地址=锁定本地内存(内存句柄);
  13.         字符串写入内存(操作,内存地址+操作偏移);        //写入内存
  14.         字符串写入内存(程序,内存地址+程序偏移);
  15.         字符串写入内存(参数,内存地址+参数偏移);
  16.         解锁本地内存(内存句柄);
  17.         
  18.         let 结构大小=4*15,菜单项=0xC,普通显示=1,显示=5;
  19.         let 程序操作结构=[结构大小,0,0,内存地址,内存地址+程序偏移,内存地址+参数偏移,0,显示,0,0,0,0,0,0,0];
  20.         let 操作结果=执行操作(程序操作结构);        //===具体操作===//
  21.         
  22.         释放本地内存(内存句柄);
  23. }
复制代码

回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层

打开文件/目录属性

  1. function 打开目录属性测试(){        //目录Windows的属性
  2.         let 操作="properties",程序="C:\\Windows";
  3.         
  4.         let 操作字节数=操作.replace(/[^\x00-\xff]/g,'xx').length;
  5.         let 程序字节数=程序.replace(/[^\x00-\xff]/g,'xx').length;
  6.         let 申请内存大小=(操作字节数+1)+(程序字节数+1);
  7.         let 操作偏移=0,程序偏移=操作字节数+1;
  8.         
  9.         let 内存句柄=申请本地内存(申请内存大小);
  10.         let 内存地址=锁定本地内存(内存句柄);
  11.         字符串写入内存(操作,内存地址+操作偏移);        //写入内存
  12.         字符串写入内存(程序,内存地址+程序偏移);
  13.         解锁本地内存(内存句柄);
  14.         
  15.         let 结构大小=4*15,菜单项=0xC,普通显示=1,显示=5;
  16.         let 程序操作结构=[结构大小,菜单项,0,内存地址,内存地址+程序偏移,0,0,普通显示,0,0,0,0,0,0,0];
  17.         let 操作结果=执行操作(程序操作结构);        //===具体操作===//
  18.         
  19.         释放本地内存(内存句柄);
  20. }

复制代码

回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
确实厉害,感谢楼主无私的分享。大神。
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层
楼主达人,谢谢
回复

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层

打开目录选定文件可以简化

本帖最后由 cutebe 于 2026-5-11 17:50 编辑

用另一个函数:ShellExecuteA        //打开属性对话框还是需要原来的
  1. function 打开目录选中文件测试(){        //文件浏览器定位到系统目录,选中命令提示符程序
  2.         let 操作="open",程序="explorer",普通显示=1;
  3.         let 参数="/select,C:\\Windows\\System32\\cmd.exe";
  4.         let 操作结果=执行操作(操作,程序,参数,普通显示);
  5.         console.clear();
  6.         if(操作结果>32){console.log("操作成功。");}else{console.log("操作失败!错误码:"+操作结果);}
  7. }
  8. function 打开我的电脑测试(){        //我的电脑/此电脑
  9.         let 操作="open",程序="explorer.exe",显示=5;
  10.         let 参数="::{20d04fe0-3aea-1069-a2d8-08002b30309d};"        //特殊目录用ID
  11.         let 操作结果=执行操作(操作,程序,参数,显示);
  12.         console.clear();
  13.         if(操作结果>32){console.log("操作成功。");}else{console.log("操作失败!错误码:"+操作结果);}
  14. }
  15. function 执行操作(操作,程序文件,参数,显示状态){
  16.         const 执行宏调用=ExecuteExcel4Macro;
  17.         let 执行操作结果=执行宏调用(`CALL("Shell32","ShellExecuteA","JJFFFJJ",0,"${操作}","${程序文件}","${参数}",0,${显示状态})`);        //执行操作
  18.         return 执行操作结果;
  19. }
复制代码


回复

使用道具 举报

发表于 前天 14:35 | 显示全部楼层
真棒啊 谢谢
回复

使用道具 举报

发表于 昨天 14:07 | 显示全部楼层
楼主达人,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1|闽公网安备35020302032614号 )

GMT+8, 2026-5-13 05:52

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表