VB 專案調用 w95_s7.dll 與西門子 S7-300 PLC 通訊,運行時提示「找不到 w95_s7.dll」。這是經典的DLL 搜尋路徑問題,而非代碼邏輯錯誤。
Declare Function load_tool Lib "w95_s7.dll" 只指定檔名,不含路徑w95_s7.dll(通常在供應商 SDK 安裝目錄)Debug/ 或 Release/ 目錄(.exe 同級).vbp 同級)
copy w95_s7.dll %windir%\system32\ (32位系統)
copy w95_s7.dll %windir%\SysWOW64\ (64位系統運行32位程式)
' 模塊頂部
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 不支援,需用上述動態載入)。
w95_s7.dllSysWOW64 或專案目錄原問題提到的 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 位匹配與依賴完整性。