首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

VB 與西門子 S7-300 通訊:w95_s7.dll 未找到解決方案

     編輯:程式設計綜合問答

VB 專案調用 w95_s7.dll 與西門子 S7-300 PLC 通訊,運行時提示「找不到 w95_s7.dll」。這是經典的DLL 搜尋路徑問題,而非代碼邏輯錯誤。

錯誤原因

  • Declare Function load_tool Lib "w95_s7.dll" 只指定檔名,不含路徑
  • Windows DLL 搜尋順序:應用程式目錄 → 系統目錄 → PATH 環境變量目錄
  • DLL 未放在上述任一位置,或位數不匹配(32/64 位)

解決方案(按推薦順序)

1. 將 DLL 放入專案輸出目錄(最簡單)

  • 找到 w95_s7.dll(通常在供應商 SDK 安裝目錄)
  • 複製到 VB 專案的 Debug/ 或 Release/ 目錄(.exe 同級)
  • 若用 IDE 運行,放在專案根目錄(.vbp 同級)

2. 註冊到系統目錄(需管理員權限)


copy w95_s7.dll %windir%\system32\      (32位系統)
copy w95_s7.dll %windir%\SysWOW64\      (64位系統運行32位程式)

3. 代碼指定完整路徑(最穩健)


' 模塊頂部
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hModule As Long) As Long

' Form_Load 中
Dim hLib As Long
Dim dllPath As String
dllPath = App.Path & "\w95_s7.dll"  ' 或絕對路徑
hLib = LoadLibrary(dllPath)
If hLib = 0 Then MsgBox "DLL載入失敗: " & dllPath
' 後續用 GetProcAddress 獲取函數指針調用...

或直接在 Declare 中寫全路徑(VB6 不支援,需用上述動態載入)。

4. 位數匹配檢查

  • VB6 編譯為 32 位 → 必須用 32 位 w95_s7.dll
  • 若在 64 位 Windows,確保 DLL 在 SysWOW64 或專案目錄
  • 依賴項檢查:用 Dependency Walker 打開 DLL,確認無缺失依賴

Shell 命令傳遞參數補充

原問題提到的 Shell "cmd /k mkdir %LOGPATH% ..." 中 %LOGPATH% 是批次檔變量,VB 中需拼接字串:


Dim logPath As String
logPath = "C:\MyLogs"
Shell "cmd /k mkdir " & Chr(34) & logPath & Chr(34) & " > nul 2>&1", vbNormalFocus
  • Chr(34) = 雙引號,處理路徑含空格
  • > nul 2>&1 抑制輸出
  • 不要用括號包裹參數

總結

w95_s7.dll 找不到 = DLL 不在搜尋路徑。優先放在 App.Path,或用 LoadLibrary 動態載入指定路徑。並驗證 32/64 位匹配與依賴完整性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved