ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4627|回复: 24

[原创] ExcelDna不改变源码,原生兼容个人版WPS,Ribbon和CTP面板

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-5-27 18:45 | 显示全部楼层 |阅读模式
WPS:    最新个人版WPS夏季更新(11744版)

EXCELDNA:原生Nuget包1.5和1.1版本测试,未修改源码


原理很简单,有点像网抓逆向的思路,找到源码逻辑,模拟出和源码一样的数据就可以实现。
主要就是Ribbon和CTP的注册,EXCELDNA生成的PROGID其实是“不变的随机数”。
程序调用前自动生成这个随机数后写入WPS的白名单即可,无需修改源码,测试图如下:
wps.gif



TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-27 21:44 | 显示全部楼层
第一步:不论RIbbon还是CTP面板都和COM有关,根据大佬们得研究,WPS个人版有个白名单机制,所有要加载得COM组件都得在里面注册,这个不多说,照办就是了,网上有很多介绍,如下图:

image.jpg
第二步:上面注册表中写入的是ProgID,至于什么是ProgID,GUID, CLSID,暂且都理解为一个唯一的编号,通过这个编号可以找到对应的组件就可以了,那这些ProgID,GUID什么的从那来呢?最简单的就是自己标一个,可以像这样使用特性标注在对应的类上:
image.jpg
第三步:记得图一那几个已dna开头的progid吗?那些是哪来的,也没用在代码里标标注过,这就是解决这个问题的关键,是DNA的代码自动生成的一组“固定的随机数”,但为什么自己标Progid和由DNA自动生成Proid都可以呢?看源码,如下图:
image.jpg
第四步:知道了上面一步,大方向就有了,EXCELDNA在用户没用显式标注progid的情况下会使用自己的一套逻辑来生成,而这些ID值就是用来注册Ribbon和CTP的,只要知道计算规则,就可以将其先算出来写入WPS的AddinsWl中完成注册。上图可以看出progid是由clsId生成的,而这个clsid又是由
ExcelDnaUtil.XllGuid得到的,就可以跳转到ExcelDnaUtil这个静态类里去看看了,这里就要找出关键的生成函数了,如下图:
image.jpg
关键部分已经找到了,下面的事情就简单多了,待续。。。。。。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-28 00:34 | 显示全部楼层


详细说一下这个公式 progId = "Dna." + clsId.ToString("N") + "." + loadedComAddIns.Count;

1. 首先说一下两个固定的字符串 “Dna.”和“.”, 也行很多人像,这个是个常量有啥好说的,确实如此,但要注意的一点就是版本问题,在EXCELDNA1.1.0之前的版本都是用这种表示方法,但之后改成了“Dna_”和“_”,所以为了兼容前后版本,生成的时候要么判断下版本号,要么两个都生成即可。

2. 再说下loadedComAddIns.Count,loadedComAddIns是一个List列表,根据字面意思就知道这是加载的Com插件的数量,Ribbon和CTP使用的是一套生成方案,都是这个公式,但区别就是这个数量,所以在第一个图中的_0和_1分别代表的就是Ribbon和CTP,而“.”代表的是1.1.0版本,"_"代表的是1.1-1.5版本。

3.最后就剩下一个 clsId.ToString("N"),clsid是这么获取到的 clsId = ExcelDnaUtil.XllGuid; 而 XllGuid= GuidFromXllPath(XllPath); 而 GuidFromXllPath(XllPath)是由GuidUtility.Create(_excelDnaNamespaceGuid, path.ToUpperInvariant())这个函数返回的;这个函数的第一参数_excelDnaNamespaceGuid是一个常量{306D016E-CCE8-4861-9DA1-51A27CBE341A},path 是上面传过来的,XllPath=DnaLibrary.XllPath;就这样一层一层的嵌套,反推,变量就一个xllpath,就是一个地址字符串(是ExcelDnaUtil的一个属性,可在代码中直接获取),所以每次xll文件卸载或或地方了,就会触发DNA重新注册ribbon和ctp值。


4.根据上面的步骤,可以封装一个类来完成这些步骤,大体结构如下:
image.jpg

5. 使用时只需在实现IExceladdin接口时,调用注册和反注册二个方法,应该就能兼容WPS个人版了,当然EXCEL也是没问题的。
image.png

6. 关键参数和步骤已经全部讲完了,WPS之前没接触过,最近刚好有用到,感觉还不错,个人版还有个JS可以玩,也可以切换到VB,还是32位的,这样对装了office64位的机子正好也是个补充。最后附上WPSReg.cs供参考(c#),使用时在ExcelDNa项目中导入,然后按第5点实现下IExcelAddin接口即可,也可以按自己的实际需求自己实现,附件只是个参考而已。

RegWps.rar

2.62 KB, 下载次数: 126

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-5-28 08:28 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-5-28 21:35 | 显示全部楼层
EH2003 发表于 2022-5-28 08:28
能附上一个标准示例就更好了

谢谢关注,感觉没什么必要,关键是思路吧?如果你用的是C#,直接放到自己项目里,实现插件接口时直接调用就可以了。玩DNA的不可能不会搭建DNA的框架,不玩DNA的这个东西一点用没有,语言有用C#的,有用VB.Net的,IDE有用2017,2019,2022,DNA有用Nuget的,有用插件生成的,各种环境搭建不一定兼容,试过2019用插件搭建的在2022里就不兼容,得改.csproj文件,等等。

TA的精华主题

TA的得分主题

发表于 2022-5-29 20:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个厉害了

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-6-7 00:14 | 显示全部楼层
前面说了自定义Ribbon和CustomerPane任务窗格的处理方法,还有个Command没说,也就是加载项。同样可以不改源码,用原始的Nuget包安装EXCELDNA后运行。只是这个和前面的COM注册有点不一样。。。





继续看源码:这里有一个条件判断来决定到底使用那种MenuManager,而参数是SafeIsExcelVersionPre15,对于wps的加载项Command,主流版本用Excel15MenuManager来生成没问题,而不能是Pre15会报错.
image.jpg
ExcelDNA根据当前运行程序的磁盘可执行文件(Excel.exe或ET.exe)版本来判断启用那种MenuManager,而wps版本和office的版本不可能通用,所以就会使得wps在使用ExcelDna时,因为WPS主版本号目前最新的也就是11,所以下图的这个判断一直为True,导致使用了Pre15出错。
image.jpg

所以,解决的方向就有了,版本号或改变menumanerger的值。。。


改版本号貌似不太友好也不好改,即使改了好像会出现另外一个错误,所以这里用的方法是判断程序是WPS后直接将menumanerge的值设为可运行的Excel15MenuManager。运行时修改加载的程序集,首先想到的就是反射
最核心的就是下面这一段了,读取元数据,动态生成一个MeunManger,在WPS注册之前将_menuManager的值设为Excel15MenuManager即可。
image.jpg
然后在程序中,ExcelDna注册前,先运行这段代码,ExcelDna就会用Excel15MenuManager来生成加载项了,下面是测试结果:
wps.gif
先这样吧。。。

TA的精华主题

TA的得分主题

发表于 2022-6-20 13:35 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-8-13 08:16 | 显示全部楼层
之前试了下在excel里面正常运转的xll在wps里面在卸载的时候会出现报错弹窗,有空的时候可以试试。

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-8-13 09:43 | 显示全部楼层
fxl447098457 发表于 2022-8-13 08:16
之前试了下在excel里面正常运转的xll在wps里面在卸载的时候会出现报错弹窗,有空的时候可以试试。

难道有大佬回复这个帖子,时间有点长了,具体记不太清了,不知道大佬的插件是什么方式做的,但你说的问题,之前写这个帖子的时候好像遇到过,貌似和C-API的反注册有关,一个简单的解决方法就是在反注册时,删除注册表项后,直接退出WPS程序,可以屏蔽错误。
3.gif


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

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-4 13:13 , Processed in 0.053372 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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