浅谈64位excel里面怎么调用32位的dll/OCX

大家应该遇到过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这玩意。

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

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

4.修改下工程名。在工程菜单下的工程属性里面。改为Comserver

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

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

看我之前的activex exe里面建立的类模块名为js。我在vba里面直接new一个js类型的变量。调用其sc成员就得到了一个scriptcontrol类的变量。后面就是我们正常写scriptcontrol的代码了。

测试代码:

Sub test()
Dim s As New js
Dim sd As Object
Set sd = s.sc
sd.Language = "javascript"
sd.addcode "var js={'name':'张三'}"
MsgBox sd.eval("js.name")
End Sub

我测试的excel版本为:

写得蛮详细的吧,调用也很简单。要继续使用exe不能删除。你可以放在自己专用的地方。不想用了可以使用 包含路径的exe /unregserver取消注册并删掉exe文件就可以了.。

补充一下。也可以采用后期绑定调用activex exe.利用createobject("activex exe名称.类模块名称")来调用。这样就省去了上面的在VBA里勾选引用的步骤。代码如下:

Sub test()
Dim s As Object, sd As Object
Set s = VBA.CreateObject("Comserver.js")
Set sd = s.sc
sd.Language = "javascript"
sd.addcode "var js={'name':'张三'}"
Debug.Print sd.eval("js.name")
End Sub

猜你喜欢

转载自blog.csdn.net/qq_24499417/article/details/104771705