ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[原创] COM加载宏封装自定义函数并全自动安装最简实例

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-5-28 09:06 | 显示全部楼层
本帖已被收录到知识树中,索引项:插件开发
原帖由 baomaboy 于 2011-5-27 16:59 发表
效率低主要还是由于使用regsvr32 /u 造成的,你用过这命令,他本身执行完成的话就有半秒的延迟,而我遍历所有的加载项,我试过多次如果/u后立刻kill file经常会出错,所以我在循环里加入了Sleep ,等待每一个regsvr  ...


添加到加载宏列表也能用API实现的,因为加载宏的列表肯定在注册表中

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-5-28 09:50 | 显示全部楼层
原帖由 wxhnr 于 2011-5-28 09:06 发表
添加到加载宏列表也能用API实现的,因为加载宏的列表肯定在注册表中


是个好方法,而且我在程序里也有这样的应用,只不过是作为备用辅助功能的,为什么不直接操作注册表?
因为直接操作注册表属于非常规的操作,这样就就求你知道dll的详细情况,知道注册表路径的详细位置,但只要重新编译dll的话所有要写入的注册表的值就要相应变化,注册表路径也是个问题,还有先判断excle版本,还有时涉及安装多版本excle的情况,所以用创建excle对象自己的AddIns.Add不用考虑写入注册表路径问题永远不会错。
其实还有一个棘手的问题,也是以前我试验用直接操作注册表的方法添加加载宏列表时遇到的,加载宏列表表在注册表中键值是以open1、open2、open3.....的形式出现的,这就涉及你不能随意的把自己的加载宏添加进去open1的位置,因为你不知道open后的序号被占用到多少了,这又涉及遍历注册表了,如果一个子键下的键值都是open也较容易实现,问题是那个子键下包含的条目繁杂,还要过滤后才行,试验过程中你会知道问题一个连一个,说道最后其实总是有办法实现的,而且我也有代码,只是用那么多行代码替换一句AddIns.Add太不值得了,AddIns.Add是应用程序内部功能,会直接把你的宏添加到正确的位置,其实也是这么个繁琐的过程,这不过这一切都在程序内部实现了。我说用aip添加列表其实是想有个直接可用的方法,就像api注册dll一样,并不是api去写的注册表,他也是调用了dll内部函数DllRegisterServer实现注册的,就几行代码就可以了,根本不用考虑注册表路径和键值的问题,所以我想要的是api添加宏到宏列表的系统功能(程序内置方法),而不是自己去提取dll详情,自己去判断excle版本,自己去确认注册表路径。
我在删除加载宏列表的程序里就利用操作注册表做备用功能的,先用常规方法注销卸载所有插件,然后遍历注册表看是否有残留(如果以前有插件没卸载就把文件删了就会有残留),有则删。
不过不可否认的是仅操作注册表的话执行效率一定比AddIns.Add+regsvr32快多了,只考虑效率的话可以这样做。

[ 本帖最后由 baomaboy 于 2011-5-28 10:04 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-5-28 13:21 | 显示全部楼层
原帖由 baomaboy 于 2011-5-27 16:59 发表
效率低主要还是由于使用regsvr32 /u 造成的,你用过这命令,他本身执行完成的话就有半秒的延迟,而我遍历所有的加载项,我试过多次如果/u后立刻kill file经常会出错,所以我在循环里加入了Sleep ,等待每一个regsvr  ...



附件还可以用getobject改进下,打开excel时也能实现注册。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-5-28 13:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
原帖由 fecmen 于 2011-5-28 13:21 发表



附件还可以用getobject改进下,打开excel时也能实现注册。

这里你说的注册是指添加到宏列表还是指regsvr的效果。

TA的精华主题

TA的得分主题

发表于 2011-5-29 10:32 | 显示全部楼层
原帖由 baomaboy 于 2011-5-28 13:47 发表

这里你说的注册是指添加到宏列表还是指regsvr的效果。


呵呵,之前没说明白。是添加到宏列表。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-5-29 11:58 | 显示全部楼层

回复 117楼 fecmen 的帖子

本贴中的添加到宏列表都是基于CreateObject的
你提出的getobject我没用过,效果是否优于CreateObject?

TA的精华主题

TA的得分主题

发表于 2011-5-29 12:16 | 显示全部楼层
原帖由 baomaboy 于 2011-5-29 11:58 发表
本贴中的添加到宏列表都是基于CreateObject的
你提出的getobject我没用过,效果是否优于CreateObject?


如果Excel打开状态的话,就用getobject(GetObject(, "Excel.Application")),否则就用Createobject。这样可以比较灵活嘛,excel如果出于打开状态的话,用getobject的运行速度要快。你可以测试64楼中的附件在两种状态下的运行速度。

后来研究了下,完全实现API注册Dll函数也是可以的,而且可以做到完全卸载(删除加载宏列表中的相应条目)。

[ 本帖最后由 fecmen 于 2011-5-29 12:18 编辑 ]

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-5-29 12:34 | 显示全部楼层
原帖由 fecmen 于 2011-5-29 12:16 发表
打开状态的话,用getobject的运行速度要快。你可以测试64楼中的附件在两种状态下的运行速度。
后来研究了下,完全实现API注册Dll函数也是可以的,而且可以做到完全卸载(删除加载宏列表中的相应条目)。


说的有道理,所以就不用测试了。

并且,我也试出来另外的注册和注销dll的api函数了,原来各一句就够用了。不过这都是研究你20楼一堆代码的结果,那代码虽然不能直接使用,但是其考虑的还是比较周全的,容错较好,不过就这个帖子里的附件来说,从代码中的的注册和注销两个函数中各提炼一句就已经完全满足安装需要了。

另外如果熟悉了注册表的路径,什么都不用,api都不用,一样完全删除列表,因为列表是excle从注册表里提取的,不用任何api和regsver/u,只是把注册表中open之类的清空不是一样把列表删空了吗?相同的道理,不用api不用regsvr,只用注册表修改就能添加和删除列表。
只不过用api和regsvr是正统,就好比一个软件提供了卸载功能你不用,而是自己直接去删他的文件和目录,再删他在注册表中的信息是一个道理(这是个繁琐的体力活儿,不过不可否认这是个学习的好过程)。

[ 本帖最后由 baomaboy 于 2011-5-29 13:08 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-5-29 12:50 | 显示全部楼层
只有你们两个人会,也不把代码公布一下,请公布用API,注册表修改等方法的代码和步骤

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-5-29 13:05 | 显示全部楼层
原帖由 fecmen 于 2011-5-29 12:16 发表
后来研究了下,完全实现API注册Dll函数也是可以的,而且可以做到完全卸载(删除加载宏列表中的相应条目)。

这一句很给人希望,就是有些模糊,“完全实现API注册Dll函数也是可以的”包含还是不包含添加到宏列表的过程?
因为就目前来说影响效率的就只有这一处了,替换GetObject或者Createobject是目前需要解决的。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-5-11 18:42 , Processed in 0.050564 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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