自定义64位CompPl32.dll用于Excel VBA需注册吗?32位Office无法测试
64位自定义DLL在64位Office VBA中的使用答疑
嘿,我来帮你拆解这个问题里的几个核心点,帮你理清这个方案的可行性:
命名与系统目录的注意事项
你打算把64位DLL命名为CompPl32.dll并放到System32目录?这里有个小细节要注意:64位Windows里,System32是专门给64位程序预留的目录,而32位程序访问这个目录会被系统自动重定向到SysWOW64。你的目标是给64位Office用,所以放System32本身是正确的位置,但名字叫CompPl32.dll有点反直觉——毕竟通常带32后缀的是32位库,不过Windows不会靠文件名判断DLL位数,只要你的DLL实际是64位编译的就没问题。如果可能的话,建议改成CompPl64.dll,后续维护的时候不容易搞混。注册的必要性分情况讨论
这完全取决于你的DLL类型:- 如果是COM类型的DLL:那必须注册才能在VBA里通过
CreateObject或者添加引用的方式使用。64位系统下注册64位DLL要用System32目录下的regsvr32.exe,命令是:regsvr32.exe "C:\Windows\System32\CompPl32.dll"。 - 如果是普通Win32 DLL(非COM):也就是你通过VBA的
Declare语句直接导入函数的情况,那不需要注册!只要DLL在系统的搜索路径里(比如System32),或者你的Declare语句指定了完整路径,就能被64位Office的VBA找到。不过要特别注意:64位VBA的Declare语句必须加上PtrSafe关键字,而且涉及指针、句柄的参数类型要换成LongPtr(代替32位里的Long),否则会调用失败。
- 如果是COM类型的DLL:那必须注册才能在VBA里通过
额外的测试与适配提醒
- 即使DLL放对了目录,64位VBA的函数声明必须是64位兼容的。比如原来32位的声明:
在64位VBA里要改成:Declare Function Compress Lib "CompPl32.dll" (ByVal input As String, ByVal output As String) As Long
具体参数类型要根据你的DLL函数实际情况调整。Declare PtrSafe Function Compress Lib "CompPl32.dll" (ByVal input As String, ByVal output As String) As LongPtr - 你用32位Office没法测试64位场景的话,可以找一台装了64位Office的同事机器,或者用虚拟机搭个64位Office环境来验证。测试前可以先用Dependency Walker这类工具确认你的DLL确实是64位的,避免因为编译错误导致的问题。
- 即使DLL放对了目录,64位VBA的函数声明必须是64位兼容的。比如原来32位的声明:
内容的提问来源于stack exchange,提问作者Maury Markowitz
相关产品推荐
相关产品推荐

