小小的重大突破——ExecuteExcel4Macro读取网卡信息

创作者俱乐部成员
起因是EH论坛上,最近有朋友发ExecuteExcel4Macro读取剪贴板的例子
https://club.excelhome.net/thread-1710410-1-1.html
突然想起曾有人问过,能否通过纯JS宏读取本机网卡信息,于是就试了一下
🔔 | function test() { let a = 10240 const b = ExecuteExcel4Macro(`CALL("Kernel32", "VirtualAlloc", "JJJJJ", 0, ${a}, ${0x00001000 | 0x00002000}, 4)`) ExecuteExcel4Macro(`REGISTER("Iphlpapi", "GetAdaptersInfo", "2JN", "GetAdaptersInfo")`) console.log(Run("GetAdaptersInfo", b, a)) console.log(ExecuteExcel4Macro(`CALL("Kernel32", "lstrcpynW", "CFJJ", "", ${b + 268}, 128)`)) ExecuteExcel4Macro(`CALL("Kernel32", "VirtualFree", "JJJJ", ${b}, 0, ${0x00008000})`) } |
其中,a先是设定了准备用多少字节来保存GetAdaptersInfo返回的网卡信息,你的网卡越多,这个应该越大;
b是用VirtualAlloc开辟了一块内存空间,大小是a;
第三句注册GetAdaptersInfo方法,其中2JN很重要,这里严重怀疑文档是微软的三哥程序员写的,简直比wps的文档更具有误导性,只能不断试错,文档贴到这里:
之后运行方法,如果a设定的大小不够,这里会返回所需要的字节数
然后用lstrcpynW,从开辟的空间的偏移量是268的位置读取第一块网卡的描述
最后是释放开辟的空间
不用在意那些细节
关键是可以读取结构体的信息,表示说ExecuteExcel4Macro这条路在JS宏里彻底走通了😁
从VBA转到JSA的朋友差不多都感觉:
平常操作表格里的数据,JSA比VBA好用很多
但是VBA可以declare声明winapi里的方法,JSA不行
另外VBA可以用createobject操作别的com对象,JSA很有限
现在,第二条,JSA虽然用起来不方便,但确实可以用ExecuteExcel4Macro操作winapi里的结构体了,也就不存在JSA不行啦👌
第三条里,其实常用的com对象就那几个,JSA里既有字典也有网络请求,64位版本也在逐步加入文字、ppt的com对象,剩下的似乎只有ado操作access数据库了,不过说实在的,与其还要安装accessdatabaseengine,不如直接装上xloil,sqlite和python就都能用了
长吁一口气,满意了。。。
起码在我看来JSA除了很多细节需要完善,已经不差VBA什么了,日常操作表格好用,偶尔需要调用系统接口麻烦,但能用,数据库走另一条路也不错
WPS函数专家
创作者俱乐部成员