1、VFP 中调用其他应用程序的方法在用 VFP 进行应用程序设计中,经常需要调用其他的应用程序。这时候我们立即会想到 RUN 命令。使用 RUN 命令只需知道应用程序的文件名及其路径即可。下面的示例是以最大化方式启动 Windows 目录下的图画板程序并同时打开 c:windowsBubbles.bmp 文件:RUN/n3 C:WindowsPbrush.exe c:windowsBubbles.bmpRUN 命令的参数用法可以参考 Visual FoxPro 的帮助文件。但是令人失望的是,在实际开发时我们常常无法确定所需要启动的应用程序的文件名及其安装的路径。比如我们需要启动用户机器上的浏览器
2、并连接到某一个网址,该机器可能安装的是 IE,也可能是NetScape,还有可能是其他的浏览器软件,安装的路径更是无从确定。下面给出我在工作中找到的两种解决方法,这两种方法都是通过Win32 API 函数来解决问题,因此其解决思路也可以用到其他编程语言中去。(一)从注册表中获取被调用软件的名称及路径。我们只需要提供被调用的软件所处理的文件类型(由文件扩展名来确定) ,即可通过查找注册表中该软件注册的可以处理的文件类型的数据项来得到该软件的文件名及安装路径。*主函数PROCEDURE lookregParameter filetype Integer nHKey, String cSubKey,
3、Integer nResultDECLARE Integer RegCloseKey IN Win32API ;Integer nHKeyDECLARE 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,c
4、AppKey,cAppName,nErrNumLOCAL oReg,regfilecAppKey = “cAppName = “nCurrentKey = 0nErrNum =GetAppPath(filetype,cAppKey,cAppName)* 确保去掉可执行文件后的参数(如: C:EXCELEXCEL.EXE /e)IF ATC(“.EXE“,m.cAppName) #0m.cAppName= ALLTRIM(SUBSTR(m.cAppName,1,ATC(“.EXE“,m.cAppName)+3)IF ASC(LEFT(cAppName,1)=34m.lpdwReserved,lp
5、dwType,lpbData,lpcbData)m.cKeyvalue = LEFT(m.lpbData,m.lpcbData-1)ENDPROCPROCEDURE GetAppPathLPARAMETER cExtension,cExtnKey,cAppKeyLOCAL cOptNamecOptName = “* 得到要打开的文档在注册表中的名称=OpenKey(“.“+m.cExtension)=GetKeyvalue(cOptName,cExtnKey)=CloseKey()RETURN GetApplication(cExtnKey,cAppKey)ENDPROC* 得到应用程序的安装
6、路径及名称PROCEDURE GetApplicationPARAMETER cExtnKey,cAppKeyLOCAL cOptNamecOptName = “=OpenKey(m.cExtnKey+“ShellOpenCommand“)=GetKeyvalue(cOptName,cAppKey)=CloseKey()ENDPROC- 在使用这段程序时,使用如下格式的语句:- fullpath=lookreg(“doc“) RUN/n3 STRING lpszOP, ;STRING lpszFile, ;STRING lpszParams, ;STRING lpszDir, ;INTEGER
7、 fsshowcmd* 指定 ShellExecute 函数的输出指向 Windows 桌面DECLARE INTEGER GetDesktopWindow IN win32apiHWND = GetDesktopWindow()* 指定操作命令为“打开“方式lpszOP = “open“* 指定 ShellExecute 操作的对象为 documentnamelpszFile = documentnamelpszParams = “* 指定 ShellExecute 的缺省目录为 c:templpszDir = “c:temp“fsshowcmd = 0* 执行 ShellExecute 命令LNRETURN = ShellExecute(HWND, lpszOP,lpszFile, lpszParams, lpszDir,fsshowcmd)Retu调用方式:=shellstart(““)& 连接到网 =shellstart(“c:windowsscript.doc”)& 打开 c:windowsscript.doc 文件- 以上程序已经在 VFP6.0 中文版,Pwin 97 中调试通过。