我的VBA代码无法在Windows 7 64位和Word 2010 32位的C:\ Windows \ System32文件夹中访问我的DLL。
Private Declare Function my_func Lib "mydll.dll" (ByVal param As String) As Long Public Sub MyFuncTest n = my_func("a") End
我将mydll.dll复制到C:\ Windows \ System32并调用MyFuncTest,但得到错误消息,如“错误53:找不到mydll.dll”。
但是,我将代码中的声明更改为:
Private Declare Function my_func Lib "C:\Users\myname\Documents\mydll.dll" (ByVal param As String) As Long
然后我将mydll.dll复制到C:\ Users \ myname \ Documents,我的帐户的Documents文件夹和MyFuncTest成功执行。
在声明中将“mydll.dll”更改为“C:\ Windows \ System32 \ mydll.dll”不起作用。 我尝试在同一个VBA环境下使用FileSystemObject#FileExists方法访问C:\ Windows \ System32 \ mydll.dll,但它返回了False(未find)。
Windows XP和Word 2003没有问题。
谁能帮忙?
这是在64位Windows上的WOW64仿真器上运行的32位DLL和32位进程。 文件重定向是在玩,所以当一个32位进程在system32
中查找时,它实际上被重定向到32位系统目录SysWOW64
。
简单和快速的解决方案是将DLL移动到C:\Windows\SysWOW64
。 但是,正如Cody Gray在评论中指出的那样,不建议您将应用程序DLL放在系统目录中。 通常的做法是将DLL放在程序文件目录中的应用程序文件夹中,并确保当需要加载DLL时该文件夹位于DLL搜索路径中。
看起来像UAC是问题。 尝试以管理员身份运行VBA脚本。 它可以帮助你。
最近的开发人员提出了下面的修复方案,允许在64位机器上注册32位.dll文件
1)打开一个DOS命令窗口。
2)导航到C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727
3)输入以下内容并按回车。 regasm / codebase“C:\ Users \ myname \ Documents \ mydll.dll”
昨天我也有同样的问题。 该程序运行在我的机器上,但不在其他人。 事实上,Excel的信息是错误的。 他明显地发现DLL文件,但这个DLL调用orher DLL,缺少在系统中: MSVCR100D.dll
和NTDLL.dll.
我发现通过使用Dependency Walker自由软件,能够检查哪个dll是由dll调用的。