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

wils
wils

创作者俱乐部成员

起因是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的文档更具有误导性,只能不断试错,文档贴到这里:

https://support.microsoft.com/en-us/office/using-the-call-and-register-functions-06fa83c1-2869-4a89-b665-7e63d188307f

之后运行方法,如果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什么了,日常操作表格好用,偶尔需要调用系统接口麻烦,但能用,数据库走另一条路也不错

海南省
浏览 290
1
11
分享
11 +1
4
1 +1
全部评论 4
 
wps新路
wps新路

WPS函数专家

学习
· 重庆
回复
 
王禹成
王禹成

创作者俱乐部成员

完了看不懂了
· 浙江省
1
回复
 
『峰格』
厉害
· 山东省
回复
 
十一年
最好再把 JSA有哪些细节需要完善,勇敢的指出来,并进行反馈 这样有利于 JSA 无限接近 VBA
· 黑龙江省
回复