在VFP中調(diào)用其他應(yīng)用程序的實(shí)用技術(shù)

字號:

---- 在用VFP進(jìn)行應(yīng)用程序設(shè)計(jì)中,經(jīng)常需要調(diào)用其他的應(yīng)用程序。這時(shí)候我們立即會想到RUN命令。使用RUN命令只需知道應(yīng)用程序的文件名及其路徑即可。
    ---- 下面的示例是以化方式啟動(dòng)Windows目錄下的圖畫板程序并同時(shí)打開c:
    \windows\Bubbles.bmp 文件:
    ---- RUN/n3 C:\Windows\Pbrush.exe c:\windows\Bubbles.bmp 。RUN命令的參數(shù)用法可以參考Visual FoxPro的幫助文件。 但是令人失望的是,在實(shí)際開發(fā)時(shí)我們常常無法確定所需要啟動(dòng)的應(yīng)用程序的文件名及其安裝的路徑。比如我們需要啟動(dòng)用戶機(jī)器上的瀏覽器并連接到某一個(gè)網(wǎng)址,該機(jī)器可能安裝的是IE,也可能是NetScape,還有可能是其他的瀏覽器軟件,安裝的路徑更是無從確定。下面給出我在工作中找到的兩種解決方法,這兩種方法都是通過Win32 API函數(shù)來解決問題,因此其解決思路也可以用到其他編程語言中去。
    ---- (一)從注冊表中獲取被調(diào)用軟件的名稱及路徑。
    ---- 我們只需要提供被調(diào)用的軟件所處理的文件類型(由文件擴(kuò)展名來確定),即可通過查找注冊表中該軟件注冊的可以處理的文件類型的數(shù)據(jù)項(xiàng)來得到該軟件的文件名及安裝路徑 。
    *主函數(shù)
    PROCEDURE lookreg
    Parameter filetype && 文件類型
    * 申明要用到的API 函數(shù)
    DECLARE Integer RegOpenKey IN Win32API ;
     Integer nHKey, String @cSubKey,
    Integer @nResult
    DECLARE Integer RegCloseKey IN Win32API ;
     Integer nHKey
    DECLARE Integer RegQueryValueEx IN Win32API ;
     Integer nHKey, String lpszValueName,
    Integer dwReserved,;
     Integer @lpdwType, String @lpbData,
    Integer @lpcbData
    #DEFINE HKEY_CLASSES_ROOT
     -2147483648
    #DEFINE C_EXTNOFOUND_LOC "查找失?。?
    LOCAL cExtn,cAppKey,cAppName,nErrNum
    LOCAL oReg,regfile
    cAppKey = ""
    cAppName = ""
    nCurrentKey = 0
    nErrNum =GetAppPath
    (filetype,@cAppKey,@cAppName)
    * 確保去掉可執(zhí)行文件后的參數(shù)
    (如: C:\EXCEL\EXCEL.EXE /e)
    IF ATC(".EXE",m.cAppName) #0
     m.cAppName= ALLTRIM(SUBSTR
    (m.cAppName,1,ATC(".EXE",m.cAppName)+3))
     IF ASC(LEFT(cAppName,1))=34
     && 去掉長文件名前多出的"字符
     m.cAppName = SUBSTR(m.cAppName,2)
     ENDIF
    ENDIF
    Retu LOWER(m.cAppName)
    ENDPROC
    * 打開注冊表
    PROCEDURE OpenKey
     LPARAMETER cLookUpKey
     LOCAL nSubKey,nErrCode
     nSubKey = 0
     m.nRegKey = HKEY_CLASSES_ROOT
     nErrCode = RegOpenKey
    (m.nRegKey,m.cLookUpKey,@nSubKey)
     nCurrentKey = m.nSubKey
    ENDPROC
    * 關(guān)閉注冊表
    PROCEDURE CloseKey
     =RegCloseKey(nCurrentKey)
     nCurrentKey =0
    ENDPROC
    * 查詢注冊表
    PROCEDURE GetKeyValue
     LPARAMETER cValueName,cKeyValue
     LOCAL lpdwReserved,lpdwType,
    lpbData,lpcbData,nErrCode
     STORE 0 TO lpdwReserved,lpdwType
     STORE SPACE(256) TO lpbData
     STORE LEN(m.lpbData) TO m.lpcbData
     m.nErrCode=RegQueryValueEx
    (nCurrentKey,m.cValueName,;
     m.lpdwReserved,@lpdwType,@lpbData,@lpcbData)
     m.cKeyValue = LEFT(m.lpbData,m.lpcbData-1)
    ENDPROC