2011-05-20 49 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調用。