---- 在用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
---- 下面的示例是以化方式啟動(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

