明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

在VFP中調(diào)用其他應用程序的實用技術

[摘要]作者: jlhao ---- 在用VFP進行應用程序設計中,經(jīng)常需要調(diào)用其他的應用程序。這時候我們立即會想到RUN命令。使用RUN命令只需知道應用程序的文件名及其路徑即可。 ---- 下面的示例是以最大化方式啟動Windows目錄下的圖畫板程序并同時打開c:\windows\Bubbles.bm...
作者: jlhao  

---- 在用VFP進行應用程序設計中,經(jīng)常需要調(diào)用其他的應用程序。這時候我們
立即會想到RUN命令。使用RUN命令只需知道應用程序的文件名及其路徑即可。


---- 下面的示例是以最大化方式啟動Windows目錄下的圖畫板程序并同時打開c:
\windows\Bubbles.bmp 文件:

---- RUN/n3 C:\Windows\Pbrush.exe c:\windows\Bubbles.bmp 。RUN命令的參
數(shù)用法可以參考Visual FoxPro的幫助文件。 但是令人失望的是,在實際開發(fā)時
我們常常無法確定所需要啟動的應用程序的文件名及其安裝的路徑。比如我們需
要啟動用戶機器上的瀏覽器并連接到某一個網(wǎng)址,該機器可能安裝的是IE,也可
能是NetScape,還有可能是其他的瀏覽器軟件,安裝的路徑更是無從確定。下面
給出我在工作中找到的兩種解決方法,這兩種方法都是通過Win32 API函數(shù)來解決
問題,因此其解決思路也可以用到其他編程語言中去。

---- (一)從注冊表中獲取被調(diào)用軟件的名稱及路徑。

---- 我們只需要提供被調(diào)用的軟件所處理的文件類型(由文件擴展名來確定),
即可通過查找注冊表中該軟件注冊的可以處理的文件類型的數(shù)據(jù)項來得到該軟件
的文件名及安裝路徑 。

*主函數(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

* 關閉注冊表
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

PROCEDURE GetAppPath
        LPARAMETER cExtension,cExtnKey,cAppKey
        LOCAL cOptName
        cOptName = ""

        * 得到要打開的文檔在注冊表中的名稱
        =OpenKey("."+m.cExtension)
        =GetKeyValue(cOptName,@cExtnKey)
        =CloseKey()

        RETURN GetApplication(cExtnKey,@cAppKey)
ENDPROC

* 得到應用程序的安裝路徑及名稱
PROCEDURE GetApplication
        PARAMETER cExtnKey,cAppKey
        LOCAL cOptName
        cOptName = ""
                
        =OpenKey(m.cExtnKey+"\Shell\Open\Command")
        =GetKeyValue(cOptName,@cAppKey)
        =CloseKey()     
ENDPROC
---- 在使用這段程序時,使用如下格式的語句:
---- fullpath=lookreg("doc") && 返回打開doc 文件的軟件名及安裝路徑

---- 靈活運用該段程序,可以大大豐富我們在軟件中的表現(xiàn)能力,例如應用軟件
的菜單中都有一項“關于本軟件”的功能,該功能調(diào)用的表單一般用來顯示有關
系統(tǒng)資源及軟件版權的信息。如果我們要給其中的公司信息加上超文本鏈接使其
可以直接訪問公司主頁。就可以在顯示公司信息的 Label控件的 Click 事件中使
用如下語句:

fullpath=lookreg("htm")
If  allt(fullpath)= =[]
        =messagebox(" 無法找到瀏覽器以
瀏覽公司主頁!",64,"")
        retu
Else
        fullpath=subst(fullpath,1,rat
([.],fullpath)-1)+space(2)+;
                        [www.flysmart.com]  
        RUN/n3  &fullpath
Endif
---- (二)利用Windows 的文檔關聯(lián)特性直接調(diào)用。
---- 我們知道,Windows是一種面向文檔的操作系統(tǒng)。當我們雙擊某個文件時,
Windows就會自動啟動與該文件相關聯(lián)的應用程序來對文件進行處理。在這個過程
中Windows主要使用了一個名為ShellExecute 的Win32 API函數(shù)。我們可以通過這
個函數(shù)來直接調(diào)用其他程序,徹底拋棄Run 命令的方式。

Function shellstart
Parameters  documentname

* 聲明ShellExecute函數(shù)
DECLARE INTEGER ShellExecute IN
      shell32.DLL INTEGER HWND,;
        STRING lpszOP, ;
        STRING lpszFile, ;
        STRING lpszParams, ;
        STRING lpszDir, ;
        INTEGER fsshowcmd

* 指定ShellExecute函數(shù)的輸出指向Windows桌面
DECLARE INTEGER GetDesktopWindow IN win32api
HWND = GetDesktopWindow()

* 指定操作命令為"打開"方式
lpszOP = "open"

* 指定ShellExecute操作的對象為 documentname
lpszFile = documentname
lpszParams = ""

* 指定ShellExecute的缺省目錄為c:\temp
lpszDir = "c:\temp"
fsshowcmd = 0

* 執(zhí)行ShellExecute命令
LNRETURN = ShellExecute(HWND, lpszOP,
lpszFile, lpszParams, lpszDir,fsshowcmd)
Retu

調(diào)用方式:
=shellstart("www.flysmart.com")    
        && 連接到網(wǎng)站www.flysmart.com
=shellstart(“c:\windows\script.doc”)   
        &&  打開c:\windows\script.doc文件