接下來要介紹winscp COM Library在excel vba的簡單使用方式
如果照抄範例,有修改連線主機跟帳密,程式還是會出錯的
猜測是版本問題,否則放一個錯誤的範例,真的是搞死人
因為我遇到的問題幾乎都有人問過,不過大部分得不到答案
而歸根究柢其實是程式碼錯誤,但是為了除錯卻跑錯方向
先說這個範例的錯誤,假設DLL已經正確登錄到系統的前提
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
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應該就可以正常執行
0 comments:
張貼留言