PCAnyWhere的使用非常簡單,它的使用方法在網(wǎng)上有非常詳細的介紹,我就不再多說,我介紹一下利用VB驅動PCAnyWhere的方法。
在我的一個項目中有特別的應用,有五個處于不同地方的計算機,有實時數(shù)據(jù)采集文件,我需要定時拔號上去,將上面的數(shù)據(jù)文件下載下來,這些數(shù)據(jù)文件隨時間的不同就有不同,所以沒有辦法做固定的自動文件傳輸,為此我分別研究了軟件提供script與OLE白皮書,最終決定選用OLE。
一、利用OLE進行遠程連接
在OLE白皮書上,將OLE驅動寫得十分明白,我只要將我的連接代碼帖上來,應該十分明白。
1、 檢查MODEM是否在使用,由于PCAnyWhere啟動后不能再由程序控制,我們必須檢查MODEM是否是空閑才能確保拔號可以順利外拔。檢查MODEM空閑可能通過打開MODEM所在的串口是否成功來判斷。
2、 生成RemoteDataManager對象
3、 進入C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere,由于 PCAnyWhere安裝時將配置文件都放在這個目錄下,我們將運行路徑切換到這個目錄下,可以更方便地使用。
4、 生成RemoteData對象,這要求在配置文件路徑下有對應CHF文件上,這是在PCAnyWhere中配置的,只要名稱與連接方式相同就可以了。
5、 設置拔號的電話號碼,設置登錄的用戶名與密碼,設置進行自動傳輸?shù)腁TF文件,并將RunOnConnect設為TRUE,并將這此配置的修改進行保存。
6、 開始拔號并自動傳輸文件。
7、 延時,判斷MODEM是否空閑,空閑則這一次拔號、文件傳輸完畢(也有可能失?。?。判斷已下載的文件,如果修改時間已更新,則這次是成功的。否則是失敗的。
8、 將RemoteData、RemoteDataManager對象釋放。
9、 拔下一個點。
If checkMODEMIdle Then
showBegin 注釋:顯示開始信息
注釋:Create CRemoteDataManager object
Set RemoteDataManager = CreateObject("WINAWSVR.RemoteDataManager")
RemoteDataManager.ChangeDirectory "C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere"
S = RemoteDataManager.CurrentDirectory()
CHFile = xProfile.GetValue(WatchPoint(nowRunID), "CHFFILE") 注釋:用于拔號的配置
Set RemoteData = RemoteDataManager.RetrieveObject(CHFile, 2, 0)
RemoteData.PhoneNumber = xProfile.GetValue(WatchPoint(nowRunID), "PHONENUM")
RemoteData.AutoXferFile = filename
RemoteData.AutoLoginName = xProfile.GetValue(WatchPoint(nowRunID), "USERNAME")
RemoteData.AutoLoginPassword = xProfile.GetValue(WatchPoint(nowRunID), "PSW")
RemoteData.RunOnConnect = True
RemoteData.WriteObject (0)
S = RemoteData.PhoneNumber
RemoteData.Launch
Sleep 30000
Do
If checkMODEMIdle Then Exit Do
DoEvents
Sleep 5000
Loop
注釋:取文件結束,要進行轉存處理
moveDBFData localpath
Set RemoteData = Nothing
Set RemoteDataManager = Nothing
nowRunID = nowRunID + 1
End If 注意:一次完畢后必須將RemoteData、RemoteDataManager對象釋放,不然會出現(xiàn)錯亂的現(xiàn)象。
好了,拔號自動文件傳輸已經實現(xiàn)了,但這個文件傳輸是在PCANYWHERE中配置好的不變的自動文件傳輸,不能實現(xiàn)我要的根據(jù)時間不同下載不同文件的要求。
二、動態(tài)生成自動文件傳輸文件
為了動態(tài)生成自動文件傳輸,自然要修改自動文件傳輸文件的配置,可OLE中沒有給出這方面的功能,我不得不另辟蹊徑了。
用文本編輯器打開ATF文件(自動文件傳輸文件),發(fā)現(xiàn)全是亂碼,只有路徑可以識別。靈機一動用UltraEdit-32打開并用十六進制打開,哈,秘密全在其中。
ATF的系統(tǒng)文件格式如下:
04 40 41 54 46 01 00 01 01 00 01 01 01 01 00 01 注釋:第八位:00表示增量下載,01全部重新下載
00 00 00 00 00 00 00 01 00 FF FF 00 00 11 00 43 注釋:第八位:00表示文件傳輸完畢后不掛斷,01表示文件傳輸完畢后不掛斷言 C
41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主機接收 02同步 第二位是本地文件路徑長度 ,后面的是本地文件路徑
31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個主機文件路徑長度, 后面的是主機文件路徑
5C 32 30 30 33 31 2E 64 62 66
有了文件的組成格式,生成這么一個文件就不在話下了。只要用二進制方式生成這個文件,就一切OK了。
Public Sub makeATFFile(ByVal localpath As String, ByVal remotepath As String, ByVal filename As String)
Dim tx() As Byte
Dim ii As Integer
Dim len1, len2 As Integer
len1 = Len(localpath)
len2 = Len(remotepath)
ReDim tx(0 To 48 + len1 + len2 + 2)
注釋:04 40 41 54 46 01 00 01 01 00 01 01 01 01 00 01 注釋:第八位:00表示增量下載,01自然下載
注釋:00 00 00 00 00 00 00 01 00 FF FF 00 00 11 00 43 C
注釋:41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
注釋:01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主 機接收 02同步 第二位是本地文件路徑長度
注釋:31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個主機文件路徑長度
注釋:5C 32 30 30 33 31 2E 64 62 66
tx(0) = &H4
tx(1) = &H40
tx(2) = &H41
tx(3) = &H54
tx(4) = &H46
tx(5) = &H1
tx(6) = &H0
tx(7) = &H1
tx(8) = &H1
tx(9) = &H0
tx(10) = &H1
tx(11) = &H1
tx(12) = &H1
tx(13) = &H1
tx(14) = &H0
tx(15) = &H1
tx(16) = &H0
tx(17) = &H0
tx(18) = &H0
tx(19) = &H0
tx(20) = &H0
tx(21) = &H0
tx(22) = &H0
tx(23) = &H1
tx(24) = &H0
tx(25) = &HFF
tx(26) = &HFF
tx(27) = &H0
tx(28) = &H0
tx(29) = &H11
tx(30) = &H0
tx(31) = &H43 注釋:41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
tx(32) = &H41
tx(33) = &H75
tx(34) = &H74
tx(35) = &H6F
tx(36) = &H58
tx(37) = &H66
tx(38) = &H65
tx(39) = &H72
tx(40) = &H5F
tx(41) = &H43
tx(42) = &H6F
tx(43) = &H6D
tx(44) = &H6D
tx(45) = &H61
tx(46) = &H6E
tx(47) = &H64
注釋:01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主
tx(48) = &H1
tx(49) = len1
For ii = 1 To len1
tx(49 + ii) = Asc(Mid(localpath, ii, 1))
Next ii
tx(49 + len1 + 1) = len2
For ii = 1 To len2
tx(49 + ii + len1 + 1) = Asc(Mid(remotepath, ii, 1))
Next ii
注釋:二進制文件打開
On Error Resume Next
Open filename For Binary As #1
For ii = 0 To 48 + len1 + len2 + 2
Put #1, , tx(ii)
Next ii
Close 1
End Sub
輸入本地文件路徑,主機文件路徑,ATF文件名,就可生成這么一個文件,再將RemoteData.AutoXferFile設成新生成的ATF文件,你就可以想傳什么就傳什么文件了,不過,有一點要注意:這兩個文件路徑都是必須存在的,不然會出錯。
結論:
利用VB驅動pcAnyWhere是一件非常簡單的事件,但不是很好,首先它無法完成由程序控制,還有是在拔號與文件傳輸時會出現(xiàn)操作界面,無法將其置為一個后臺程序,而人工的干預也過于容易,不過,在解決我當前的問題方面,它是一個非常好的選擇。
在我的一個項目中有特別的應用,有五個處于不同地方的計算機,有實時數(shù)據(jù)采集文件,我需要定時拔號上去,將上面的數(shù)據(jù)文件下載下來,這些數(shù)據(jù)文件隨時間的不同就有不同,所以沒有辦法做固定的自動文件傳輸,為此我分別研究了軟件提供script與OLE白皮書,最終決定選用OLE。
一、利用OLE進行遠程連接
在OLE白皮書上,將OLE驅動寫得十分明白,我只要將我的連接代碼帖上來,應該十分明白。
1、 檢查MODEM是否在使用,由于PCAnyWhere啟動后不能再由程序控制,我們必須檢查MODEM是否是空閑才能確保拔號可以順利外拔。檢查MODEM空閑可能通過打開MODEM所在的串口是否成功來判斷。
2、 生成RemoteDataManager對象
3、 進入C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere,由于 PCAnyWhere安裝時將配置文件都放在這個目錄下,我們將運行路徑切換到這個目錄下,可以更方便地使用。
4、 生成RemoteData對象,這要求在配置文件路徑下有對應CHF文件上,這是在PCAnyWhere中配置的,只要名稱與連接方式相同就可以了。
5、 設置拔號的電話號碼,設置登錄的用戶名與密碼,設置進行自動傳輸?shù)腁TF文件,并將RunOnConnect設為TRUE,并將這此配置的修改進行保存。
6、 開始拔號并自動傳輸文件。
7、 延時,判斷MODEM是否空閑,空閑則這一次拔號、文件傳輸完畢(也有可能失?。?。判斷已下載的文件,如果修改時間已更新,則這次是成功的。否則是失敗的。
8、 將RemoteData、RemoteDataManager對象釋放。
9、 拔下一個點。
If checkMODEMIdle Then
showBegin 注釋:顯示開始信息
注釋:Create CRemoteDataManager object
Set RemoteDataManager = CreateObject("WINAWSVR.RemoteDataManager")
RemoteDataManager.ChangeDirectory "C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere"
S = RemoteDataManager.CurrentDirectory()
CHFile = xProfile.GetValue(WatchPoint(nowRunID), "CHFFILE") 注釋:用于拔號的配置
Set RemoteData = RemoteDataManager.RetrieveObject(CHFile, 2, 0)
RemoteData.PhoneNumber = xProfile.GetValue(WatchPoint(nowRunID), "PHONENUM")
RemoteData.AutoXferFile = filename
RemoteData.AutoLoginName = xProfile.GetValue(WatchPoint(nowRunID), "USERNAME")
RemoteData.AutoLoginPassword = xProfile.GetValue(WatchPoint(nowRunID), "PSW")
RemoteData.RunOnConnect = True
RemoteData.WriteObject (0)
S = RemoteData.PhoneNumber
RemoteData.Launch
Sleep 30000
Do
If checkMODEMIdle Then Exit Do
DoEvents
Sleep 5000
Loop
注釋:取文件結束,要進行轉存處理
moveDBFData localpath
Set RemoteData = Nothing
Set RemoteDataManager = Nothing
nowRunID = nowRunID + 1
End If 注意:一次完畢后必須將RemoteData、RemoteDataManager對象釋放,不然會出現(xiàn)錯亂的現(xiàn)象。
好了,拔號自動文件傳輸已經實現(xiàn)了,但這個文件傳輸是在PCANYWHERE中配置好的不變的自動文件傳輸,不能實現(xiàn)我要的根據(jù)時間不同下載不同文件的要求。
二、動態(tài)生成自動文件傳輸文件
為了動態(tài)生成自動文件傳輸,自然要修改自動文件傳輸文件的配置,可OLE中沒有給出這方面的功能,我不得不另辟蹊徑了。
用文本編輯器打開ATF文件(自動文件傳輸文件),發(fā)現(xiàn)全是亂碼,只有路徑可以識別。靈機一動用UltraEdit-32打開并用十六進制打開,哈,秘密全在其中。
ATF的系統(tǒng)文件格式如下:
04 40 41 54 46 01 00 01 01 00 01 01 01 01 00 01 注釋:第八位:00表示增量下載,01全部重新下載
00 00 00 00 00 00 00 01 00 FF FF 00 00 11 00 43 注釋:第八位:00表示文件傳輸完畢后不掛斷,01表示文件傳輸完畢后不掛斷言 C
41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主機接收 02同步 第二位是本地文件路徑長度 ,后面的是本地文件路徑
31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個主機文件路徑長度, 后面的是主機文件路徑
5C 32 30 30 33 31 2E 64 62 66
有了文件的組成格式,生成這么一個文件就不在話下了。只要用二進制方式生成這個文件,就一切OK了。
Public Sub makeATFFile(ByVal localpath As String, ByVal remotepath As String, ByVal filename As String)
Dim tx() As Byte
Dim ii As Integer
Dim len1, len2 As Integer
len1 = Len(localpath)
len2 = Len(remotepath)
ReDim tx(0 To 48 + len1 + len2 + 2)
注釋:04 40 41 54 46 01 00 01 01 00 01 01 01 01 00 01 注釋:第八位:00表示增量下載,01自然下載
注釋:00 00 00 00 00 00 00 01 00 FF FF 00 00 11 00 43 C
注釋:41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
注釋:01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主 機接收 02同步 第二位是本地文件路徑長度
注釋:31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個主機文件路徑長度
注釋:5C 32 30 30 33 31 2E 64 62 66
tx(0) = &H4
tx(1) = &H40
tx(2) = &H41
tx(3) = &H54
tx(4) = &H46
tx(5) = &H1
tx(6) = &H0
tx(7) = &H1
tx(8) = &H1
tx(9) = &H0
tx(10) = &H1
tx(11) = &H1
tx(12) = &H1
tx(13) = &H1
tx(14) = &H0
tx(15) = &H1
tx(16) = &H0
tx(17) = &H0
tx(18) = &H0
tx(19) = &H0
tx(20) = &H0
tx(21) = &H0
tx(22) = &H0
tx(23) = &H1
tx(24) = &H0
tx(25) = &HFF
tx(26) = &HFF
tx(27) = &H0
tx(28) = &H0
tx(29) = &H11
tx(30) = &H0
tx(31) = &H43 注釋:41 75 74 6F 58 66 65 72 5F 43 6F 6D 6D 61 6E 64 AutoXfer_Command
tx(32) = &H41
tx(33) = &H75
tx(34) = &H74
tx(35) = &H6F
tx(36) = &H58
tx(37) = &H66
tx(38) = &H65
tx(39) = &H72
tx(40) = &H5F
tx(41) = &H43
tx(42) = &H6F
tx(43) = &H6D
tx(44) = &H6D
tx(45) = &H61
tx(46) = &H6E
tx(47) = &H64
注釋:01 13 45 3A 5C 55 53 42 42 41 4B 5C 32 30 30 33 第一位是傳輸方式:00 發(fā)到主機01從主
tx(48) = &H1
tx(49) = len1
For ii = 1 To len1
tx(49 + ii) = Asc(Mid(localpath, ii, 1))
Next ii
tx(49 + len1 + 1) = len2
For ii = 1 To len2
tx(49 + ii + len1 + 1) = Asc(Mid(remotepath, ii, 1))
Next ii
注釋:二進制文件打開
On Error Resume Next
Open filename For Binary As #1
For ii = 0 To 48 + len1 + len2 + 2
Put #1, , tx(ii)
Next ii
Close 1
End Sub
輸入本地文件路徑,主機文件路徑,ATF文件名,就可生成這么一個文件,再將RemoteData.AutoXferFile設成新生成的ATF文件,你就可以想傳什么就傳什么文件了,不過,有一點要注意:這兩個文件路徑都是必須存在的,不然會出錯。
結論:
利用VB驅動pcAnyWhere是一件非常簡單的事件,但不是很好,首先它無法完成由程序控制,還有是在拔號與文件傳輸時會出現(xiàn)操作界面,無法將其置為一個后臺程序,而人工的干預也過于容易,不過,在解決我當前的問題方面,它是一個非常好的選擇。

