-
vfp教程之在VFP中调用其他应用程序的实用技术
作者: jlhao
---- 在用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
* 查询注册表
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 文件的软件名及安装路径
---- 灵活运用该段程序,可以大大丰富我们在软件中的表现能力,例如应用软件
的菜单中都有一项“关于本软件”的功能,该功能调用的表单一般用来显示有关
系统资源及软件版权的信息。如果我们要给其中的公司信息加上超文本链接使其
可以直接访问公司主页。就可以在显示公司信息的 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 的文档关联特性直接调用。
---- 我们知道,Windows是一种面向文档的操作系统。当我们双击某个文件时,
Windows就会自动启动与该文件相关联的应用程序来对文件进行处理。在这个过程
中Windows主要使用了一个名为ShellExecute 的Win32 API函数。我们可以通过这
个函数来直接调用其他程序,彻底抛弃Run 命令的方式。
Function shellstart
Parameters documentname
* 声明ShellExecute函数
DECLARE INTEGER ShellExecute IN
shell32.DLL INTEGER HWND,;
STRING lpszOP, ;
STRING lpszFile, ;
STRING lpszParams, ;
STRING lpszDir, ;
INTEGER fsshowcmd
* 指定ShellExecute函数的输出指向Windows桌面
DECLARE INTEGER GetDesktopWindow IN win32api
HWND = GetDesktopWindow()
* 指定操作命令为"打开"方式
lpszOP = "open"
* 指定ShellExecute操作的对象为 documentname
lpszFile = documentname
lpszParams = ""
* 指定ShellExecute的缺省目录为c:\temp
lpszDir = "c:\temp"
fsshowcmd = 0
* 执行ShellExecute命令
LNRETURN = ShellExecute(HWND, lpszOP,
lpszFile, lpszParams, lpszDir,fsshowcmd)
Retu
调用方式:
=shellstart("www.flysmart.com")
&& 连接到网站www.flysmart.com
=shellstart(“c:\windows\script.doc”)
&& 打开c:\windows\script.doc文件
---- 在用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
* 查询注册表
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 文件的软件名及安装路径
---- 灵活运用该段程序,可以大大丰富我们在软件中的表现能力,例如应用软件
的菜单中都有一项“关于本软件”的功能,该功能调用的表单一般用来显示有关
系统资源及软件版权的信息。如果我们要给其中的公司信息加上超文本链接使其
可以直接访问公司主页。就可以在显示公司信息的 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 的文档关联特性直接调用。
---- 我们知道,Windows是一种面向文档的操作系统。当我们双击某个文件时,
Windows就会自动启动与该文件相关联的应用程序来对文件进行处理。在这个过程
中Windows主要使用了一个名为ShellExecute 的Win32 API函数。我们可以通过这
个函数来直接调用其他程序,彻底抛弃Run 命令的方式。
Function shellstart
Parameters documentname
* 声明ShellExecute函数
DECLARE INTEGER ShellExecute IN
shell32.DLL INTEGER HWND,;
STRING lpszOP, ;
STRING lpszFile, ;
STRING lpszParams, ;
STRING lpszDir, ;
INTEGER fsshowcmd
* 指定ShellExecute函数的输出指向Windows桌面
DECLARE INTEGER GetDesktopWindow IN win32api
HWND = GetDesktopWindow()
* 指定操作命令为"打开"方式
lpszOP = "open"
* 指定ShellExecute操作的对象为 documentname
lpszFile = documentname
lpszParams = ""
* 指定ShellExecute的缺省目录为c:\temp
lpszDir = "c:\temp"
fsshowcmd = 0
* 执行ShellExecute命令
LNRETURN = ShellExecute(HWND, lpszOP,
lpszFile, lpszParams, lpszDir,fsshowcmd)
Retu
调用方式:
=shellstart("www.flysmart.com")
&& 连接到网站www.flysmart.com
=shellstart(“c:\windows\script.doc”)
&& 打开c:\windows\script.doc文件
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式