在我的一個項目中有特別的應用,有五個處于不同地方的計算機,有實時數(shù)據(jù)采集文件,我需要定時拔號上去,將上面的數(shù)據(jù)文件下載下來,這些數(shù)據(jù)文件隨時間的不同就有不同,所以沒有辦法做固定的自動文件傳輸,為此我分別研究了軟件提供script與OLE白皮書,最終決定選用OLE。
一、利用OLE進行遠程連接
在OLE白皮書上,將OLE驅動寫得十分明白,我只要將我的連接代碼帖上來,應該十分明白。
1、檢查MODEM是否在使用,由于PCAnyWhere啟動后不能再由程序控制,我們必須檢查MODEM是否是空閑才能確保拔號可以順利外拔。檢查MODEM空閑可能通過打開MODEM所在的串口是否成功來判斷。
2、生成RemoteDataManager對象
3、進入C:/DocumentsandSettings/AllUsers/applicationData/Symantec/pcAnywhere,由于 PCAnyWhere安裝時將配置文件都放在這個目錄下,我們將運行路徑切換到這個目錄下,可以更方便地使用。
4、生成RemoteData對象,這要求在配置文件路徑下有對應CHF文件上,這是在PCAnyWhere中配置的,只要名稱與連接方式相同就可以了。
5、設置拔號的電話號碼,設置登錄的用戶名與密碼,設置進行自動傳輸?shù)腁TF文件,并將RunOnConnect設為TRUE,并將這此配置的修改進行保存。
6、開始拔號并自動傳輸文件。
7、延時,判斷MODEM是否空閑,空閑則這一次拔號、文件傳輸完畢(也有可能失敗)。判斷已下載的文件,如果修改時間已更新,則這次是成功的。否則是失敗的。
8、將RemoteData、RemoteDataManager對象釋放。
9、拔下一個點。
IfcheckMODEMIdleThen
showBegin注釋:顯示開始信息
注釋:CreateCRemoteDataManagerobject
SetRemoteDataManager=CreateObject("WINAWSVR.RemoteDataManager")
RemoteDataManager.ChangeDirectory"C:/DocumentsandSettings/AllUsers/ApplicationData/Symantec/pcAnywhere"
S=RemoteDataManager.CurrentDirectory()
CHFile=xPRofile.GetValue(WatchPoint(nowRunID),"CHFFILE")注釋:用于拔號的配置
SetRemoteData=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
Sleep30000
Do
IfcheckMODEMIdleThenExitDo
DoEvents
Sleep5000
Loop
注釋:取文件結束,要進行轉存處理
moveDBFDatalocalpath
SetRemoteData=Nothing
SetRemoteDataManager=Nothing
nowRunID=nowRunID 1
EndIf
注意:一次完畢后必須將RemoteData、RemoteDataManager對象釋放,不然會出現(xiàn)錯亂的現(xiàn)象。
好了,拔號自動文件傳輸已經(jīng)實現(xiàn)了,但這個文件傳輸是在PCANYWHERE中配置好的不變的自動文件傳輸,不能實現(xiàn)我要的根據(jù)時間不同下載不同文件的要求。
二、動態(tài)生成自動文件傳輸文件
為了動態(tài)生成自動文件傳輸,自然要修改自動文件傳輸文件的配置,可OLE中沒有給出這方面的功能,我不得不另辟蹊徑了。
用文本編輯器打開ATF文件(自動文件傳輸文件),發(fā)現(xiàn)全是亂碼,只有路徑可以識別。靈機一動用UltraEdit-32打開并用十六進制打開,哈,秘密全在其中。
ATF的系統(tǒng)文件格式如下:
04404154460100010100010101010001注釋:第八位:00表示增量下載,01全部重新下載
000000000000000100FFFF0000110043注釋:第八位:00表示文件傳輸完畢后不掛斷,01表示文件傳輸完畢后不掛斷言C
4175746F586665725F436F6D6D616E64AutoXfer_Command 0113453A5C55534242414B5C32303033第一位是傳輸方式:00發(fā)到主機01從主機接收02同步第二位是本地文件路徑長度,后面的是本地文件路徑
312E64626614443A5C71746461746131注釋:第六個主機文件路徑長度,后面的是主機文件路徑
5C32303033312E646266
有了文件的組成格式,生成這么一個文件就不在話下了。只要用二進制方式生成這個文件,就一切OK了。
PublicSubmakeATFFile(ByVallocalpathAsString,ByValremotepathAsString,ByValfilenameAsString)
Dimtx()AsByte
DimiiAsInteger
Dimlen1,len2AsInteger
len1=Len(localpath)
len2=Len(remotepath)
ReDimtx(0To48 len1 len2 2)
注釋:04404154460100010100010101010001注釋:第八位:00表示增量下載,01自然下載
注釋:000000000000000100FFFF0000110043C
注釋:4175746F586665725F436F6D6D616E64AutoXfer_Command
注釋:0113453A5C55534242414B5C32303033第一位是傳輸方式:00發(fā)到主機01從主機接收02同步第二位是本地文件路徑長度
注釋:312E64626614443A5C71746461746131注釋:第六個主機文件路徑長度
注釋:5C32303033312E646266
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
注釋:4175746F586665725F436F6D6D616E64AutoXfer_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
注釋:0113453A5C55534242414B5C32303033第一位是傳輸方式:00發(fā)到主機01從主
tx(48)=&H1
tx(49)=len1
Forii=1Tolen1
tx(49 ii)=Asc(Mid(localpath,ii,1))
Nextii
tx(49 len1 1)=len2
Forii=1Tolen2
tx(49 ii len1 1)=Asc(Mid(remotepath,ii,1))
Nextii
注釋:二進制文件打開
OnErrorResumeNext
OpenfilenameForBinaryAs#1
Forii=0To48 len1 len2 2
Put#1,,tx(ii)
Nextii
Close1
EndSub
輸入本地文件路徑,主機文件路徑,ATF文件名,就可生成這么一個文件,再將RemoteData.AutoXferFile設成新生成的ATF文件,你就可以想傳什么就傳什么文件了,不過,有一點要注意:這兩個文件路徑都是必須存在的,不然會出錯。
結論:
利用VB驅動pcAnyWhere是一件非常簡單的事件,但不是很好,首先它無法完成由程序控制,還有是在拔號與文件傳輸時會出現(xiàn)操作界面,無法將其置為一個后臺程序,而人工的干預也過于容易,不過,在解決我當前的問題方面,它是一個非常好的選擇。
->
|
新聞熱點
疑難解答