VB驅(qū)動(dòng)pcAnyWhere進(jìn)行文件傳輸

字號(hào):

PCAnyWhere的使用非常簡(jiǎn)單,它的使用方法在網(wǎng)上有非常詳細(xì)的介紹,我就不再多說,我介紹一下利用VB驅(qū)動(dòng)PCAnyWhere的方法。
    在我的一個(gè)項(xiàng)目中有特別的應(yīng)用,有五個(gè)處于不同地方的計(jì)算機(jī),有實(shí)時(shí)數(shù)據(jù)采集文件,我需要定時(shí)拔號(hào)上去,將上面的數(shù)據(jù)文件下載下來(lái),這些數(shù)據(jù)文件隨時(shí)間的不同就有不同,所以沒有辦法做固定的自動(dòng)文件傳輸,為此我分別研究了軟件提供script與OLE白皮書,最終決定選用OLE。
    一、利用OLE進(jìn)行遠(yuǎn)程連接
    在OLE白皮書上,將OLE驅(qū)動(dòng)寫得十分明白,我只要將我的連接代碼帖上來(lái),應(yīng)該十分明白。
    1、 檢查MODEM是否在使用,由于PCAnyWhere啟動(dòng)后不能再由程序控制,我們必須檢查MODEM是否是空閑才能確保拔號(hào)可以順利外拔。檢查MODEM空閑可能通過打開MODEM所在的串口是否成功來(lái)判斷。
    2、 生成RemoteDataManager對(duì)象
    3、 進(jìn)入C:\Documents and Settings\All Users\Application Data\Symantec\pcAnywhere,由于 PCAnyWhere安裝時(shí)將配置文件都放在這個(gè)目錄下,我們將運(yùn)行路徑切換到這個(gè)目錄下,可以更方便地使用。
    4、 生成RemoteData對(duì)象,這要求在配置文件路徑下有對(duì)應(yīng)CHF文件上,這是在PCAnyWhere中配置的,只要名稱與連接方式相同就可以了。
    5、 設(shè)置拔號(hào)的電話號(hào)碼,設(shè)置登錄的用戶名與密碼,設(shè)置進(jìn)行自動(dòng)傳輸?shù)腁TF文件,并將RunOnConnect設(shè)為TRUE,并將這此配置的修改進(jìn)行保存。
    6、 開始拔號(hào)并自動(dòng)傳輸文件。
    7、 延時(shí),判斷MODEM是否空閑,空閑則這一次拔號(hào)、文件傳輸完畢(也有可能失?。?。判斷已下載的文件,如果修改時(shí)間已更新,則這次是成功的。否則是失敗的。
    8、 將RemoteData、RemoteDataManager對(duì)象釋放。
    9、 拔下一個(gè)點(diǎn)。
    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") 注釋:用于拔號(hào)的配置
    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
    注釋:取文件結(jié)束,要進(jìn)行轉(zhuǎn)存處理
    moveDBFData localpath
    Set RemoteData = Nothing
    Set RemoteDataManager = Nothing
    nowRunID = nowRunID + 1
    End If 注意:一次完畢后必須將RemoteData、RemoteDataManager對(duì)象釋放,不然會(huì)出現(xiàn)錯(cuò)亂的現(xiàn)象。
    好了,拔號(hào)自動(dòng)文件傳輸已經(jīng)實(shí)現(xiàn)了,但這個(gè)文件傳輸是在PCANYWHERE中配置好的不變的自動(dòng)文件傳輸,不能實(shí)現(xiàn)我要的根據(jù)時(shí)間不同下載不同文件的要求。
    二、動(dòng)態(tài)生成自動(dòng)文件傳輸文件
    為了動(dòng)態(tài)生成自動(dòng)文件傳輸,自然要修改自動(dòng)文件傳輸文件的配置,可OLE中沒有給出這方面的功能,我不得不另辟蹊徑了。
    用文本編輯器打開ATF文件(自動(dòng)文件傳輸文件),發(fā)現(xiàn)全是亂碼,只有路徑可以識(shí)別。靈機(jī)一動(dòng)用UltraEdit-32打開并用十六進(jìn)制打開,哈,秘密全在其中。
    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ā)到主機(jī)01從主機(jī)接收 02同步 第二位是本地文件路徑長(zhǎng)度 ,后面的是本地文件路徑
    31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個(gè)主機(jī)文件路徑長(zhǎng)度, 后面的是主機(jī)文件路徑
    5C 32 30 30 33 31 2E 64 62 66
    有了文件的組成格式,生成這么一個(gè)文件就不在話下了。只要用二進(jìn)制方式生成這個(gè)文件,就一切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ā)到主機(jī)01從主 機(jī)接收 02同步 第二位是本地文件路徑長(zhǎng)度
    注釋:31 2E 64 62 66 14 44 3A 5C 71 74 64 61 74 61 31 注釋:第六個(gè)主機(jī)文件路徑長(zhǎng)度
    注釋: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ā)到主機(jī)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
    注釋:二進(jìn)制文件打開
    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
    輸入本地文件路徑,主機(jī)文件路徑,ATF文件名,就可生成這么一個(gè)文件,再將RemoteData.AutoXferFile設(shè)成新生成的ATF文件,你就可以想傳什么就傳什么文件了,不過,有一點(diǎn)要注意:這兩個(gè)文件路徑都是必須存在的,不然會(huì)出錯(cuò)。
    結(jié)論:
    利用VB驅(qū)動(dòng)pcAnyWhere是一件非常簡(jiǎn)單的事件,但不是很好,首先它無(wú)法完成由程序控制,還有是在拔號(hào)與文件傳輸時(shí)會(huì)出現(xiàn)操作界面,無(wú)法將其置為一個(gè)后臺(tái)程序,而人工的干預(yù)也過于容易,不過,在解決我當(dāng)前的問題方面,它是一個(gè)非常好的選擇。