VBA代码无法访问System32中的DLL

时间:2011-05-20 08:10:56

标签: windows vba windows-7

我的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(未找到)。

Windows XP和Word 2003没有问题。

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:7)

这是一个32位DLL和一个32位进程,在64位Windows上的WOW64仿真器中运行。 File redirection正在运行,因此当system32中的32位进程查找时,它实际上会重定向到32位系统目录SysWOW64

简单快捷的解决方案是将DLL移至C:\Windows\SysWOW64。但是,正如Cody Gray在评论中指出的那样,不建议您将应用程序DLL放在系统目录中。通常的做法是将DLL放在程序文件目录中的应用程序文件夹中,并确保在需要加载DLL时该文件夹位于DLL搜索路径中。

答案 1 :(得分:0)

似乎UAC就是问题所在。尝试以管理员身份运行VBA脚本。它可能对你有帮助。

答案 2 :(得分:0)

最近的开发人员提出了以下修复方案,允许在64位计算机上注册32位.dll

1)打开DOS命令窗口。

2)导航到C:\ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727

3)输入以下内容并按Enter键。 regasm / codebase“C:\ Users \ myname \ Documents \ mydll.dll”

答案 3 :(得分:0)

昨天我遇到了完全相同的问题。程序在我的机器上运行,但在其他机器上运行。 实际上,Excel中的消息是错误的。他显然找到了lll dll文件,但是这个dll正在调用orher dll,在系统中丢失:MSVCR100D.dllNTDLL.dll. 我发现通过使用Dependency Walker免费软件,能够检查dll调用哪个dll。

相关问题