接下來要介紹winscp COM Library在excel vba的簡單使用方式
如果照抄範例,有修改連線主機跟帳密,程式還是會出錯的
猜測是版本問題,否則放一個錯誤的範例,真的是搞死人
因為我遇到的問題幾乎都有人問過,不過大部分得不到答案
而歸根究柢其實是程式碼錯誤,但是為了除錯卻跑錯方向
先說這個範例的錯誤,假設DLL已經正確登錄到系統的前提
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
Option Explicit Sub Example() Dim mySession As New Session ' Enable custom error handling On Error Resume Next Upload mySession ' Query for errors If Err.Number <> 0 Then MsgBox "Error: " & Err.Description ' Clear the error Err.Clear End If ' Disconnect, clean up mySession.Dispose ' Restore default error handling On Error GoTo 0 End Sub Private Sub Upload(ByRef mySession As Session) ' Setup session options Dim mySessionOptions As New SessionOptions With mySessionOptions .Protocol = Protocol_Sftp .HostName = "example.com" .UserName = "user" .Password = "mypassword" .SshHostKeyFingerprint = "ssh-rsa 2048 xxxxxxxxxxx..." End With ' Connect mySession.Open mySessionOptions ' Upload files Dim myTransferOptions As New TransferOptions myTransferOptions.TransferMode = TransferMode_Binary Dim transferResult As TransferOperationResult Set transferResult = _ mySession.PutFiles("d:\toupload\*", "/home/user/", False, myTransferOptions) ' Throw on any error transferResult.Check ' Display results Dim transfer As TransferEventArgs For Each transfer In transferResult.Transfers MsgBox "Upload of " & transfer.Filename & " succeeded" Next End Sub |
連線主機跟帳密當然根據實際情況來修改設定
因為我連線的ftp主機採用外顯TLS加密協定
#33 .Protocol的值要改成Protocol_Ftp
#37 要改成 .TlsHostCertificateFingerprint,值是TLS的SHA碼
再新增一個屬性 .FtpSecure ,值為FtpSecure.FtpSecure_Explicit
這個屬性值在網站上的寫法是 FtpSecure.Explicit,所以程式在這邊會產生錯誤
光是排除錯誤就花了好幾個晚上
因為搜尋到的討論,會直接將問題導向是否為DLL本身無法支援
而這個猜測其實是合理的,原因在excel vba使用瀏覽物件功能,來檢視物件的屬性跟方法
確實會發現有些物件的屬性跟方法不存在,或者只有物件名稱,沒有任何的屬性跟方法
例如:session裡只有屬性,沒有方法
session.option裡面空白
所以一直走偏,一度用dnSpy來反編譯DLL
但其實是程式本身的錯誤,DLL在C#、VB.net、PowerShell都能正常使用
備註:如果DLL突然無法創建物件
我是因為安裝了6.3版,也安裝過6.4 beta,可能造成版本衝突
winscp論壇提供一個程式自身的清理功能 winscp.com /comregistration
可以把所有的DLL登錄刪除
刪除之後再重新登錄跟視窗程式的版本一樣的DLL應該就可以正常執行