ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 浅谈64位excel里面怎么调用32位的dll

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-3-10 12:29 | 显示全部楼层 |阅读模式
本帖最后由 fxl447098457 于 2020-3-10 12:30 编辑

大家应该遇到过64位office在vba里无法调用32位dll的问题。最近看到别人碰到了类似的问题。我就来啰嗦几句。微软公司的官方网站针对这个问题描述如下:
在64位的windows系统中,一个64位进程不能加载一个32位dll,同理一个32位进程也不能加载一个64位dll。但是,64位windows支持64位和32位进程(包括本机或跨机)间进程间通信(RPC)。在64位windows中,一个进程外32位COM服务器能够与64位客户端进行通信,同样一个进程外64位COM服务器也能与32位客户端进行通信。因此,如果你有一个32位COM无法识别的DLL,你可以将它封装到一个进程外COM服务器中并在一个64位进程中用COM配置调用DLL。
上面那一段我自己来理解就是 dll/ocx是个单性恋,而进程外的com服务器是个双性恋,32/64通杀。
就拿之前我自己使用的scriptcontrol(在msscript.ocx里)只能用于32位的excel.今天我们就来解决怎么在64位的excel上使用官方的这个dll.
1.首先用VB6创建一个32位的com服务器。就是Activex exe这玩意。

1.jpg
2.会创建一个类模块。我们将类模块的名称改为js.待会再vba里实例化的时候会用到。我们先引用要调用scriptcontrol这个组件。如图:
1.jpg

3.下面我们就建立一个类型为scriptcontrol的成员sc。注意要外部能调用这个成员需要使用public声明而不能使用dim/private等。代码如下:
401.jpg

4.修改下工程名。在工程菜单下的工程属性里面。改为Comserver
3.jpg
5.点击文件菜单下生成Comserver.exe.现在开始注册了。以管理员权限打开cmd.输入包含路径的Comserver.exe /regserver注册。这个注册和dll的不一样。在64位系统中不需要切换到SysWOW64目录下,直接注册就行.注册成功不会有提示,直接静默跳到下一命令行了。如图:
4.jpg

6.vba的引用里面可以找到刚才注册的Comserver.勾选上我们就能在vba里调用里面的类了。
5.jpg

看我之前的activex exe里面建立的类模块名为js。我在vba里面直接new一个js类型的变量。调用其sc成员就得到了一个scriptcontrol类的变量。后面就是
我们正常写scriptcontrol的代码了。
测试代码:
  1. Sub test()
  2. Dim s As New js
  3. Dim sd As Object
  4. Set sd = s.sc
  5. sd.Language = "javascript"
  6. sd.addcode "var js={'name':'张三'}"
  7. MsgBox sd.eval("js.name")
  8. End Sub
复制代码
0929.jpg

我测试的excel版本为:
25.jpg
写得蛮详细的吧,调用也很简单。要继续使用exe不能删除。你可以放在自己专用的地方。不想用了可以使用 包含路径的exe /unregserver取消注册并删掉exe文件就可以了.就讲到这里吧。

2.jpg

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-3-10 17:08 | 显示全部楼层
补充一下。也可以采用后期绑定调用activex exe.利用createobject("activex exe名称.类模块名称")来调用。这样就省去了上面的在VBA里勾选引用的步骤。代码如下:
  1. Sub test()
  2. Dim s As Object, sd As Object
  3. Set s = VBA.CreateObject("Comserver.js")
  4. Set sd = s.sc
  5. sd.Language = "javascript"
  6. sd.addcode "var js={'name':'张三'}"
  7. Debug.Print sd.eval("js.name")
  8. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2020-3-11 01:39 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
fxl447098457 发表于 2020-3-10 17:08
补充一下。也可以采用后期绑定调用activex exe.利用createobject("activex exe名称.类模块名称")来调用。这 ...

老师!能制作一个可在64位excel中用listview的例子吗?谢谢!

TA的精华主题

TA的得分主题

发表于 2020-3-11 10:20 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-8-24 16:18 | 显示全部楼层
jy03342543 发表于 2020-3-11 10:20
感谢分享希望老师能再弄点实例帮助消化

你成功了吗 我win10 没法成功啊

TA的精华主题

TA的得分主题

发表于 2021-9-28 15:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
实验了一把,是可以实现的,但是程序执行效率很低,不知道为什么。之前在32位office下调用32位dll,程序两三秒可以算完,改进程间通信的方法后得跑个三四分钟。

TA的精华主题

TA的得分主题

发表于 2022-5-14 21:27 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-26 18:28 , Processed in 0.043660 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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