  | 
				VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.   
				 | 
			 
		 
		 
	
		| 上一篇主題 :: 下一篇主題   | 
	 
	
	
		| 發表人 | 
		內容 | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 1 樓
  | 
		
			
				 發表於: 星期三 四月 21, 2004 12:17 pm    文章主題: [原創]網路環境下, 用戶端自動更新程式 | 
				     | 
			 
			
				
  | 
			 
			
				程式功能: 
 
   1.自動判斷SERVER上的主程式版本是否跟本機上的版本不同, 可自動複製一份到本機電腦中.
 
   2.自動建立連線網路磁碟機.
 
   3.主程式放在自己的電腦上, 減低網路資料流量, SERVER上的主程式可以隨時更新.
 
程式參數: 要判別的主程式名稱, 例: 建立捷徑 main.exe trade
 
SERVER的路徑資訊放在程式參數的.ini 檔中.
 
   4.因為原始程式會複製一份在本機, 所以在你的程式一開始要加一段程式碼, 將你的路徑設成 .ini 檔中所設定的路徑.
 
*例:
 
 	  | 代碼: | 	 		  
 
mexe_name = program(0)               &&--執行檔名
 
path_exe=SYS(5) + SYS(2003)      &&--執行檔目錄
 
path_dbf= properties( FILETOSTR(path_exe+'\'+MEXE_NAME+'.ini') ,'DbfPath' )
 
 
If !EMPTY( path_dbf )
 
   Set DEFA TO &path_dbf
 
   Cd &path_dbf
 
Endif
 
 | 	  
 
 
**原始程式碼
 
 	  | 代碼: | 	 		  
 
para MEXE_NAME
 
* ?#123;式?#125;發: 尚易資訊有限公司 史嘉富
 
* 版本: 2.0   2004.04.21
 
Set excl off
 
Set safe off
 
Set dele on
 
Set esca off
 
Set talk off
 
 
if empty( mexe_name)
 
   messagebox( '執行方式:  Main 執行檔名'+cr()+'執行檔名不須在上.exe  , 會產生 執行檔名.ini檔, 其內容中 dbfpath=為?#123;式所顒漸媬?+cr()+'AutoConnect=T: \\ntsrv\trade 可自動建立對印磁碟機' )
 
   quitexe()
 
endif
 
 
*Local MDATA, path_exe      &&--ini資訊
 
 
path_exe=SYS(5) + SYS(2003)      &&--執行檔目錄
 
 
If FILE(path_exe+'\'+MEXE_NAME+'.INI')
 
   MDATA = FILETOSTR(path_exe+'\'+MEXE_NAME+'.ini')
 
Else
 
   MDATA = 'AutoConnect='+cr()+'DbfPath='+cr()+'DefaPRN='+cr()+'TempFilePath='
 
   Strtofile( MDATA , path_exe+'\'+MEXE_NAME+'.ini' )
 
Endif
 
 
path_dbf=''
 
MCAPTION=''
 
 
If empty(path_dbf)
 
   path_dbf = PROPERTIES( MDATA , 'DbfPath')
 
Endif
 
path_tmp = PROPERTIES( MDATA , 'TempFilePath')
 
 
If empty(path_tmp)
 
   path_tmp = GETENV('TEMP')
 
Endif
 
If !empty(path_exe) .and. empty(path_tmp)
 
   path_tmp = path_exe         &&--內定的暫存路徑,跟執行檔是放在一起
 
Endif
 
*!*   *WAIT WINDOW '='+path_dbf+'='
 
 
*!*   *********自動建立連線網路磁碟機
 
local mautoconnect, mdiskid , mdiskpath, mfound
 
mautoconnect = ltrim(PROPERTIES( MDATA , 'AutoConnect'))
 
if !empty( mautoconnect )
 
   mdiskid = upper(left( mautoconnect,1))
 
   if !isdirectory( mdiskid+':\')      &&--沒有建立連線網路磁碟機.
 
      mdiskpath = lower(alltrim(subs( mautoConnect , at(' ', mautoConnect)+1 )))
 
      NetworkInfo('MapDisk', mdiskid+':',mdiskpath )      &&--自動建立連線網路磁碟機.
 
   endif
 
endif
 
 
*********************
 
_SCREEN.VISIBLE=.F.
 
 
if file('autoup.zip')      &&--自動更新?#123;式
 
   zip( 'e', 'autoup.zip' )      &&-- 必須有安裝winzip
 
   dele file autoup.zip
 
endif
 
if file('update.zip')      &&--自動更新?#123;式
 
   zip( 'e' , 'update.zip' )
 
   dele file autoup.zip
 
endif
 
*!*   if file('main.zip')      &&--主機檢查?#123;式
 
*!*      zip( 'e' , 'main.zip' )
 
*!*      dele file main.zip
 
*!*   endif
 
 
If !EMPTY( path_dbf )
 
*內定目錄的地方
 
   If !FILE(path_dbf+'\'+mexe_name+'.exe')
 
      _SCREEN.VISIBLE=.T.
 
      Messagebox('請你確定一下, 是否有正確連上網路(或許主機已經關閉了)'+cr()+'或是 '+MEXE_NAME+'.INI 中網路路徑( '+alltrim(path_dbf)+' )?#93;定有問題')
 
      path_dbf=PADR(PATH_DBF,40)
 
      do inputpath
 
   Endif
 
*!*      Set DEFA TO &path_dbf
 
*!*      Cd &path_dbf
 
else
 
   path_dbf=space(40)
 
   do inputpath
 
 
*!*      Set DEFA TO &path_dbf
 
*!*      Cd &path_dbf
 
Endif
 
 
If !EMPTY(path_dbf) .AND. EMPTY( MCAPTION)
 
   mret =.F.
 
   if !file(path_exe+'\'+MEXE_NAME+'.EXE')
 
         _SCREEN.VISIBLE=.T.
 
         wait windows '更新?#123;式中.'  nowait
 
         * 2004.03.03   修正?#123;式
 
         i=["]+path_dbf+'\'+MEXE_NAME+'.EXE'+["]
 
         j=["]+path_exe+'\'+MEXE_NAME+'.EXE'+["]
 
         copy file &i to &j
 
   else
 
      *If FDATE(path_exe+'\'+MEXE_NAME+'.EXE') # FDATE(MEXE_NAME+'.EXE') .or. Ftime(path_exe+'\'+MEXE_NAME+'.EXE') # Ftime(MEXE_NAME+'.EXE')
 
      If Ftime(path_dbf+'\'+MEXE_NAME+'.EXE') # Ftime(path_exe+'\'+MEXE_NAME+'.EXE')
 
         _SCREEN.VISIBLE=.T.
 
         *Messagebox('請注意 : 你的?#123;式版本日期為:'+DTOC(FDATE(path_exe+'\'+MEXE_NAME+'.EXE'))+' 跟主機上的?#123;式版本:'+DTOC(FDATE(MEXE_NAME+'.EXE'))+' 並不相同, 請確定是否已更新?#123;式了' )
 
         *wait windows '請注意 : 你的?#123;式版本日期為:'+DTOC(FDATE(path_exe+'\'+MEXE_NAME+'.EXE'))+' 跟主機上的?#123;式版本:'+DTOC(FDATE(MEXE_NAME+'.EXE'))+' 並不相同, ?#123;在自動幫你更新?#123;式.'  nowait
 
         wait windows '更新?#123;式中.'  nowait
 
         i=["]+path_dbf+'\'+MEXE_NAME+'.EXE'+["]
 
         j=["]+path_exe+'\'+MEXE_NAME+'.EXE'+["]
 
         copy file &i to &j
 
         wait clear
 
      Endif
 
   endif
 
Endif
 
*run /n &mexe_name
 
runfile(mexe_name)
 
 
*!*   read events      &&--無法read
 
 
quitexe()
 
***********************
 
func inputpath
 
   _SCREEN.VISIBLE=.T.
 
   mread = .t.
 
   clear
 
   mautoconnect = space(60)
 
   @ 12,10 say '請輸入自坅堨葙鵀L磁碟機, 例如:  T:  \\NTSRV\SYS\ ,表示要自動將 \\ntsrv\sys 連線網路磁碟機代號T:'
 
   @ 13,30 get mautoconnect valid chkread2()
 
   @ 15,10 say '請輸入主?#123;式所存放的路徑, 例如:  T:\TRADE  或是 \\NTSRV\SYS\TRADE , 按下[Esc]放棄輸入'
 
   @ 16,30 get path_dbf valid chkread()
 
   read
 
   if empty( path_dbf)
 
      messagebox('請查明主?#123;式所存放的路徑後, 修正'+MEXE_NAME+'.INI, 再來執行')
 
      quitexe()
 
   endif
 
   path_dbf = alltrim( path_dbf)
 
   if lastkey()=27
 
      quitexe()
 
   endif
 
   If !file(path_dbf+'\'+MEXE_NAME+'.EXE')
 
      messagebox('你所輸入的地方找不到主?#123;式:'+path_dbf+'\'+MEXE_NAME+'.EXE  , 無法執行' )
 
      quitexe()
 
   else
 
         mdata = PROPERTIES( MDATA , 'AutoConnect','W', alltrim( mautoconnect ) )
 
         mdata = PROPERTIES( MDATA , 'DbfPath','W', alltrim(path_dbf) )
 
      Strtofile( MDATA , path_exe+'\'+MEXE_NAME+'.ini' )
 
 
*!*   *!*         *quitexe()
 
*!*         * 可能是?#123;式保護的關係, 直接執行會有問題. 只好重RUN一次
 
      messagebox('請重新執行一次就可進入主?#123;式中' )
 
      quitexe()
 
      
 
*!*         runfile('main.exe',mexe_name)
 
*!*         quitexe()
 
*!*   *!*         read events      &&--無法read
 
*!*   *!*         clear events
 
   endif
 
      read events      &&--無法read
 
return
 
*******************
 
func chkread2
 
if !empty( mautoconnect )
 
   mdiskid = upper(left( mautoconnect,1))
 
   if !isdirectory( mdiskid+':\')      &&--沒有建立連線網路磁碟機.
 
      mdiskpath = lower(alltrim(subs( mautoConnect , at(' ', mautoConnect)+1 )))
 
      NetworkInfo('MapDisk', mdiskid+':',mdiskpath )      &&--自動建立連線網路磁碟機.
 
   endif
 
endif
 
 
**************************
 
func chkread
 
local mret
 
if !FILE(alltrim(path_dbf)+'\'+mexe_name+'.exe') .and. lastkey()#27
 
   Messagebox('請你確定一下, 是否有正確連上網路(或許主機已經關閉了)'+cr()+'或是你所指定的網路路徑( '+alltrim(path_dbf)+' )有問題')
 
   mret = .f.
 
else
 
   mret = .t.
 
   clear events
 
endif
 
return mret
 
&&&&&&&&&&&&&&&&&&
 
func cr
 
return chr(13)+chr(10)
 
*****************
 
**********************************************************
 
Func PROPERTIES
 
*傳來 文字內容 , 所要找的 屬性名稱 , ( 內定為讀取R/寫入W/刪除D), 寫入的資料
 
* 傳回內容( 文字型態), 傳回後再用巨集來將資料改成所須的型態
 
*                所以資料如果要為字元型態, 則須在memodata中須在字串兩旁?#91;上 "
 
*   如果為寫入/刪除 資料, 它會傳回已變更資料後的 memodata, 請在自已的?#123;式中寫入
 
* 注意 , 如果要將資料寫入時, 它的值( pro_dat )皆為字串, 所以你的值為字串, 則請再?#91;上 "
 
* mdata = filetostr('legend.ini')
 
* mdata = properties( mdata , 'dbfpath', 'W' , 'c:\stock' )
 
Lpara MEMODATA, PROPERTIES_NAME , R_OR_W , PRO_DAT
 
Local MRET , I , MDATA , LINE_COUNT, MFIND
 
MRET = ''
 
 
*properties_name = upper( alltrim(properties_name ))
 
 
If type('r_or_w')#'C'
 
   R_OR_W = 'R'
 
Endif
 
 
R_OR_W = upper( R_OR_W)
 
 
*susp         &&--如果你要將更改後的資料存入, 請自行write到file中
 
Set MEMO TO 250             &&--將MEMO中的寬度?#93;成250 , 以免MLINE()截成不正確的長度
 
MFIND = .F.
 
LINE_COUNT = MEMLINES( MEMODATA )
 
For I=1 to LINE_COUNT
 
   MDATA = mline( MEMODATA , I )
 
   If upper(ltrim(MDATA)) = upper( alltrim(PROPERTIES_NAME))
 
      MFIND = .T.
 
      If at('=', MDATA) # 0
 
         Do case
 
         Case R_OR_W = 'R'      &&--讀
 
            MRET = subs( MDATA , at( '=', MDATA)+1 )
 
         Case R_OR_W = 'W'      &&--寫
 
            MRET = stuff( MEMODATA  , at(MDATA ,MEMODATA) , len(MDATA) , PROPERTIES_NAME+'='+PRO_DAT )
 
         Case R_OR_W = 'D'      &&--刪
 
            MRET = stuff( MEMODATA  , at(MDATA ,MEMODATA) , len(MDATA) , '' )
 
*WAIT WINDOW MRET
 
*要WRITE 一個FILE , 則須要將FILE刪除後, 再FCREATE(),才會將字串正確的寫入FILE中
 
         Endcase
 
*   wait mret
 
      Endif
 
      Exit
 
   Endif
 
Next
 
 
If !MFIND .and. R_OR_W = 'W'      &&--寫
 
   MRET = MEMODATA+ cr()+ PROPERTIES_NAME+'='+PRO_DAT
 
Endif
 
 
Return MRET
 
*********************
 
func networkinfo      &&--傳來何種類別, 傳回可知道的登入網路資訊
 
* ?#93;可使用 sys(0) 可傳回 : 電腦名稱 # 使用者名稱
 
Lpara mfunc , mdata1, mdata2
 
mfunc=lower( mfunc)
 
 
Local loNetwork
 
loNetwork = NewObject('wscript.network')
 
*使用 WSHom.Ocx
 
local mret
 
do case
 
case mfunc='computername' .or. mfunc='電腦名稱'
 
   mret = loNetwork.ComputerName
 
case mfunc='domain' .or. mfunc='網域'
 
   mret = loNetwork.UserDomain
 
case mfunc='username' .or. mfunc='使用者名稱'
 
   mret = loNetwork.UserName
 
case mfunc='connectdiskid' .or. mfunc='連線磁碟機'
 
   mret =loNetwork.EnumNetworkDrives(iif( empty( mdata1 ),0, mdata1 ) )      &&--第一台, mdata1=0
 
case mfunc='connectdiskpath' .or. mfunc='連線磁碟路徑'
 
   mret =loNetwork.EnumNetworkDrives(iif( empty( mdata1 ),0, mdata1 )+1)
 
case mfunc='connectprnid' .or. mfunc='連線連接埠'
 
   mret =loNetwork.EnumPrinterConnections(iif( empty( mdata1 ),0, mdata1 ) )      &&--第一台, mdata1=0
 
case mfunc='connectprnpath' .or. mfunc='連線連接名稱'
 
   mret =loNetwork.EnumPrinterConnections(iif( empty( mdata1 ),0, mdata1 )+1)
 
case mfunc='mapdisk' .or. mfunc='?#93;定磁碟機'
 
   * exp :      NetworkInfo('MapDisk','T:','\\ntsrv\trade' )
 
   if !empty( mdata2)
 
      mret =loNetwork.MapNetworkDrive( mdata1 , mdata2 )
 
   else
 
      mret =loNetwork.MapNetworkDrive( mdata1 )
 
   endif
 
case mfunc='removedisk' .or. mfunc='中止磁碟機'
 
   * exp :      NetworkInfo('RemoveDisk','T:')
 
   mret =loNetwork.RemoveNetworkDrive( mdata1 )
 
case mfunc='mapprn' .or. mfunc='?#93;定印表機'
 
   * exp :      NetworkInfo('MapPrn','LPT1:','\\ntsrv\Epson' )
 
   if !empty( mdata2)
 
      mret =loNetwork.AddPrinterConnection( mdata1 , mdata2 )
 
   else
 
      mret =loNetwork.AddPrinterConnection( mdata1 )
 
   endif
 
case mfunc='removeprn' .or. mfunc='中止印表機'
 
   * exp :      NetworkInfo('RemovePrn','LPT1:')
 
   mret =loNetwork.RemovePrinterConnection( mdata1 )
 
case mfunc='defaultprn' .or. mfunc='預?#93;印表機'
 
   * exp :      NetworkInfo('DefaultPrn','\\ntsrv\Epson')      &&--無法用 LPT1:
 
   mret =loNetwork.SetDefaultPrinter( mdata1 )
 
endcase
 
return mret
 
*****************
 
func isdirectory      &&--?#93;為某些中文目錄名稱用DIRECTORY("c:\蓋") 會無法辦識
 
lpara mdir
 
DECLARE INTEGER PathIsDirectory IN shlwapi STRING pszPath
 
mret =!empty(PathIsDirectory(mdir))
 
clear dlls shlwapi.dll
 
return mret
 
**********************
 
func runfile      &&--執行某一個檔案, 可以自行判斷副檔名(透過檔案總管來執行)
 
* exp : runfile( "c:\temp\myxls.xls" )   &&--?#125;啟 xls 檔
 
* exp: runfile( "c:\temp\myxls.xls",,,'print')   &&--直接列印
 
* 可以在列印前先?#125;那個物件, 先?#93;定印表機, 再來runfile , 就可以不會印到預?#93;印表機了.
 
* 在word中, 改印表機:    .ActivePrinter = "Epson LQ-300 ESC/P 2"
 
* 在Excel中, 改印表機:    .Application.ActivePrinter = pub_faxExceldriver
 
* mwindowstype = 0(內定)不顯示?#123;式畫面, 1 為顯示原畫面 , 3=最大化
 
 
lpara mfile , mparament , mpath , mactive , mwindowstype
 
if empty(mfile)
 
   mfile=''
 
endif
 
if empty( mparament )
 
   mparament = ''
 
endif
 
if empty(mpath)
 
   mpath = ''
 
endif
 
 
if empty(mactive) .or. type('mactive')#'C'
 
   mactive = 'open'
 
endif
 
if empty(mwindowstype)
 
   mwindowstype=0
 
endif
 
 
local mret
 
* 請注意 shellExecute 之大小寫 
 
*declare integer ShellExecute in shell32.dll integer hWnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, integer nShowCmd
 
declare integer ShellExecute in shell32.dll integer, string, string, string, string, integer
 
mret =shellExecute( 0, mactive , mfile , mparament , mpath , mwindowstype )
 
*mret =shellExecute( 0, 'open' , .text1.value , "" , "" ,0 )
 
*mret=ShellExecute(0, 'open', 'XCOPY32.EXE','C:\TEST C:\TEMP\TEST1 /E /I /Q /Y', 'C:\TEMP', 0)
 
if mret<=31
 
   messagebox('這個檔案 '+trim(mfile)+' 並不支援動作('+mactive+')')
 
endif
 
*clear dlls shell32.dll
 
return mret
 
********************************************
 
proc quitexe         &&--利用強迫中止?#123;式
 
close table all
 
Close Data all
 
Clear DLLs 
 
clear events
 
quit
 
Declare ExitThread in Win32API 
 
ExitThread() 
 
return
 
********************************
 
func zip
 
lpara mfunc , mzipfile , mtagfile
 
* mfunc = 'a'   append
 
*      ='e'   extract
 
* mzipfile 例:   c:\backup\20011231
 
* mtagfile 例:   c:\myprg\*.*      或將要ZIP之檔案清單,建立文字檔, 用@清單檔名
 
local mret
 
mret = ''
 
mfunc=lower( mfunc )
 
do case
 
case mfunc = 'a'
 
   mfunc='-a'
 
case mfunc = 'e' .or. mfunc='x'
 
   mfunc='-e -o'
 
endcase
 
mret = zipexepath()
 
if isnull( mret )
 
   messagebox('請先安裝WINZIP 才能執行資料壓縮及解壓縮的功能')
 
else
 
   mret = runfile( mret , mfunc+' '+mzipfile+' '+mtagfile )
 
endif
 
return mret
 
******************************
 
func zipexepath
 
#Define HKEY_LOCAL_MACHINE -2147483646
 
return  readregs(HKEY_Local_machine, 'Software\Microsoft\windows\CurrentVersion\App Paths\winzip.exe\' ,'' )
 
**************************************************
 
***  讀取字串值 ReadRegistryString
 
***  傳回值:字串或.NULL.表無此機碼
 
**************************************************
 
Func ReadRegs
 
LPARAMETERS HKey, Subkey, Entry
 
LOCAL nHandle, nResult, nSize, cDataBuffer, nType
 
nHandle=0
 
 
Declare INTEGER RegOpenKey IN Win32API INTEGER nHKey,STRING cSubKey,INTEGER @nHandle
 
*//?#125;啟機碼
 
nResult=RegOpenKey(HKey,SubKey,@nHandle)
 
IF nResult#ERROR_SUCCESS
 
   RETURN .NULL.
 
ENDIF   
 
 
*// 使用RegQueryValueEx決定資料型態
 
DECLARE INTEGER RegQueryValueEx  IN Win32API  INTEGER nHKey,;
 
   STRING lpszValueName,INTEGER dwReserved,;
 
   INTEGER @lpdwType, STRING @lpbData, INTEGER @lpcbData
 
 
*//將值傳回 buffer
 
cDataBuffer=space(256)
 
nSize=LEN(cDataBuffer)
 
nType=0
 
nResult= RegQueryValueEx(nHandle,Entry,0,@nType,@cDataBuffer,@nSize)
 
 
Declare INTEGER RegCloseKey IN Win32API INTEGER nHKey
 
=RegCloseKey(nHandle)
 
 
IF nResult#ERROR_SUCCESS 
 
   RETURN .NULL.
 
ENDIF   
 
 
IF nSize <2
 
   RETURN ""       &&//空字串 
 
ENDIF             &&//去除空白字元及字串後的 NULL 
 
RETURN SUBSTR(CHRTRAN(cDataBuffer,CHR(0),""),1,nSize-1)
 
 | 	 
  _________________ 利用>>搜尋<<的功能會比問的還要快得到答案.
  garfield 在 星期一 五月 03, 2004 2:42 pm 作了第 3 次修改 | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		Ruey
 
 
  註冊時間: 2003-03-12 文章: 1698 來自: tunglo
  第 2 樓
  | 
		
			
				 發表於: 星期三 四月 21, 2004 4:00 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				這麼好的文章又實用的範例.  
 
 
garfield 不會自己置頂嗎? _________________ #############################
 
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
 
 
學會VFP使用者社區的搜尋,Code才會更有趣~
 
############################# | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 3 樓
  | 
		
			
				 發表於: 星期三 四月 21, 2004 4:40 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				好吧, 既然你認為不錯, 那就給他置頂一陣子好了. 本來想說如果有人回覆他就自己會頂到上面去了, 以免置頂太多後, 想看到最新的文章還得翻頁, 因為我比較賴.  8-P
 
 
* 補充說明: 程式內有幾行 判斷某些zip 檔是否存在的也是為了自動更新另外的程式用的, 像是運用在利用FTP下載後,在進入程式前自行解壓縮, 另外程式內使用的ZIP解壓縮程式是採用winzip並不是很理想 , 當然你們也可以改用本論壇上其它解ZIP的工具. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		梅子
 
 
  註冊時間: 2003-08-12 文章: 11
 
  第 4 樓
  | 
		
			
				 發表於: 星期日 四月 25, 2004 2:00 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				没有实验成功,能给个详细的示例吗? _________________ 欢迎光临梅子VFP论坛,http://meizibbs.3322.org | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 5 樓
  | 
		
			
				 發表於: 星期一 四月 26, 2004 10:56 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				附加檔中有三個檔案:
 
原始程式: main.prg
 
用VFP6編譯的執行檔: main.exe
 
給你們參考用的參數檔: trade.ini
 
***********
 
如果要使用這個工具原則上須要了解幾件事.
 
1.不是只有執行main.exe , 而是須要給他一個參數, 這個參數就是你的實際執行檔的名稱, 就是執行檔名而已, 不須要加上路徑. 例: 建立一個捷徑 main.exe trade
 
2.main.exe 在第一次執行時, 如果在放置main.exe 的那個地方的目錄沒有你要更新的那個執行檔.ini , 會要求你輸入二個資訊:
 
   A.自動建立對映磁碟機:如果你不須要建立一個在本機電腦上有一個磁碟機代號的話, 這個地方可以保持空白, 如果須要做連線網路磁碟機, 它的原則是" 磁碟機代號:  \\網路主機名\資源分享名" ,例如:" T:  \\ntsrv\sys ", 但你前提是要已經確定可以連線到這台網路主機上才行.
 
   B.執行檔(主程式)是放在網路主機上的那個位置, 例如: \\網路主機名\資源分享名\主程式所在目錄, 因為在你輸入這一行資料的同時, main.exe 會同時去做檢查你輸入的路徑有沒有存在你的主程式, 所以你必須在windows下先將連線網路這個動作先做好.
 
3.main.exe 依參數檔(.ini) 去主機路本機比對主程式執行檔的日期時間一不一樣, 以便複製一份主程式在本機上, 如果一切動作皆已OK, main.exe 就會去執行放在本機裡的主程式, 並且結束main的程式.
 
4.就因為是複製一份主程式在本機上, 但實際上的資料是放在主機上, 所以你必須要在你的主程式的開頭要設定path , 可以將以下的程式碼加你的程式開頭的地方
 
mexe_name = program(0)               &&--執行檔名 
 
path_exe=SYS(5) + SYS(2003)      &&--執行檔目錄 
 
path_dbf= properties( FILETOSTR(path_exe+'\'+MEXE_NAME+'.ini') ,'DbfPath' )      &&--利用.ini檔讀出所設定的server路徑.properties( ) 這個函數請參考main.prg
 
If !EMPTY( path_dbf ) 
 
   Set DEFA TO &path_dbf 
 
   Cd &path_dbf 
 
Endif _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		朱育興
 
 
  註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
  第 6 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 7 樓
  | 
		
			
				 發表於: 星期二 四月 27, 2004 12:28 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				看了之後有幾個感想.
 
1.內地用VFP的人還真多.
 
2.以後應該提供簡體版的程式才對, 可以省下轉貼者修改的時間.
 
3.以後轉貼"梅子論壇"的文章, 應注意是否忘了加上原始出處.    <== 酸. _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		朱育興
 
 
  註冊時間: 2003-08-25 文章: 661 來自: 台中市大里區
  第 8 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		Ruey
 
 
  註冊時間: 2003-03-12 文章: 1698 來自: tunglo
  第 9 樓
  | 
		
			
				 發表於: 星期二 四月 27, 2004 2:13 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | garfield 寫到: | 	 		  看了之後有幾個感想.
 
1.內地用VFP的人還真多.
 
2.以後應該提供簡體版的程式才對, 可以省下轉貼者修改的時間.
 
3.以後轉貼"梅子論壇"的文章, 應注意是否忘了加上原始出處.    <== 酸. | 	  
 
 
   
 
至少他有標上台灣網站拉!!下次你最好在程式底下..
 
 
加註.若要轉貼,請著名來源出處.. _________________ #############################
 
快樂媽咪系列幸福宅配,喝十全雞湯~原來幸福那麼簡單!!
 
 
學會VFP使用者社區的搜尋,Code才會更有趣~
 
############################# | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		梅子
 
 
  註冊時間: 2003-08-12 文章: 11
 
  第 10 樓
  | 
		
			
				 發表於: 星期二 四月 27, 2004 8:30 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				TO garfield
 
   真不对不起,我已经改了!谢谢! _________________ 欢迎光临梅子VFP论坛,http://meizibbs.3322.org | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		garfield Site Admin
  
  註冊時間: 2003-01-30 文章: 2160
 
  第 11 樓
  | 
		
			
				 發表於: 星期二 四月 27, 2004 10:09 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				梅子你可不要介意啊, 本來開放程式碼就是要讓越多人用越好, 請看到的人知道文章是打那裡來的, 可以順便到那裡看看有沒有其它對自己有幫助的資料. 就像我們的ruey版主會造訪各大論壇搜集好的文章, 我們只要做享其成就好了, 但有時看到的文章只是擷取重點而已, 還是會想到原始出處看看, 這樣可以得到更多的資料. 有像你們這麼熱心的人真好, 便宜了我們這裡"懶人", 有現成的文章寶藏可以看, 不用四處去挖寶, 所以, 有你們真好 ^^ _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		tch888
 
 
  註冊時間: 2004-04-27 文章: 1
 
  第 12 樓
  | 
		
			
				 發表於: 星期二 四月 27, 2004 3:45 pm    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				调试通过了,太好用了.
 
可惜有一点,需要通过输入用户名和密码,先登录主机.才能用.不够"傻瓜式"
 
不知道是不是我用法不对,请老大指教.
 
再有一点,如果主机没有开等无法连通的时候,个人认为应该增加一个"忽略"之类的选项,以便可以执行已经下载在本地的程序. | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		TIM001
 
 
  註冊時間: 2004-04-29 文章: 4
 
  第 13 樓
  | 
		
			
				 發表於: 星期四 四月 29, 2004 10:54 am    文章主題:  | 
				     | 
			 
			
				
  | 
			 
			
				| 呵呵,這個提議的确不錯! | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		goto-dream
 
 
  註冊時間: 2004-05-11 文章: 909
 
  第 14 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		goto-dream
 
 
  註冊時間: 2004-05-11 文章: 909
 
  第 15 樓
  | 
		 | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |