2011-05-20 65 views
4

我的VBA代码无法访问Windows 7 64位和Word 2010 32位上的C:\ Windows \ System32文件夹中的DLL。VBA代码无法访问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:\用户\ MYNAME \文档,我的帐户中的文档文件夹,MyFuncTest成功执行。

在声明中将“mydll.dll”更改为“C:\ Windows \ System32 \ mydll.dll”无效。我尝试在同一个VBA环境中使用FileSystemObject#FileExists方法访问C:\ Windows \ System32 \ mydll.dll,但它返回了False(未找到)。

Windows XP和Word 2003没有问题。

任何人都可以帮忙吗?

+0

这是一个类似的问题,具有相同的根本原因。 http://stackoverflow.com/questions/29886297/whats-special-about-c-windows-system32-in-the-path – smwikipedia 2015-04-27 05:53:34

回答

7

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

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

+2

嗯,你打我回答这一个。但我非常不同意将DLL放在Windows系统目录中的建议。你不应该混淆这些目录。 – 2011-05-20 08:15:33

+0

@Cody嗯,我同意你的看法。我会更新。 – 2011-05-20 08:16:28

+0

+1为**不要把文件放在系统文件夹**位,以及WOW64 gubbins – Rob 2011-05-20 08:27:39

0

看起来像UAC是问题所在。尝试以管理员身份运行VBA脚本。它可能会帮助你。

+0

是什么让你觉得UAC是这里的问题? – 2011-05-20 08:15:56

+0

UAC不太可能会阻止脚本调​​用DLL。文件系统重定向是个问题,他试图从32位进程调用它。 – 2011-05-20 08:16:30

+0

我以为这可能是因为UAC阻止访问系统目录的脚本。 – Anuraj 2011-05-20 08:16:49

0

最近显影剂建议以下修复程序,其允许在64位计算机

1)打开DOS命令窗口注册一个32位的.dll。

2)导航到C:\ WINDOWS \ Microsoft.NET \ Framework64 \ V2.0.50727

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

0

昨天我的问题完全一样。程序在我的机器上运行,但不在其他机器上运行。实际上,Excel中的信息是错误的。他显然找到了DLL文件,但这个DLL调用orher DLL,在系统中缺失:MSVCR100D.dllNTDLL.dll. 我发现通过使用Dependency Walker自由软件,能够检查哪个DLL由dll调用。