---- 在用VFP进行应用程序设计中,经常需要调用其他的应用程序。这时候我们立即会想到RUN命令。使用RUN命令只需知道应用程序的文件名及其路径即可。
---- 下面的示例是以最大化方式启动Windows目录下的图画板程序并同时打开c:
\windows\Bubbles.bmp 文件:
---- RUN/n3 C:\Windows\Pbrush.exe c:\windows\Bubbles.bmp 。RUN命令的参数用法可以参考Visual FoxPro的帮助文件。 但是令人失望的是,在实际开发时我们常常无法确定所需要启动的应用程序的文件名及其安装的路径。比如我们需要启动用户机器上的浏览器并连接到某一个网址,该机器可能安装的是IE,也可能是NetScape,还有可能是其他的浏览器软件,安装的路径更是无从确定。下面给出我在工作中找到的两种解决方法,这两种方法都是通过Win32 API函数来解决问题,因此其解决思路也可以用到其他编程语言中去。
---- (一)从注册表中获取被调用软件的名称及路径。
---- 我们只需要提供被调用的软件所处理的文件类型(由文件扩展名来确定),即可通过查找注册表中该软件注册的可以处理的文件类型的数据项来得到该软件的文件名及安装路径 。
*主函数
PROCEDURE lookreg
Parameter filetype && 文件类型
* 申明要用到的API 函数
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)
* 确保去掉可执行文件后的参数
(如: 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
责任编辑:小草