在VFP中调用其他应用程序的实用技术

来源:互联网 发布:创维电视机看网络直播 编辑:程序博客网 时间:2024/05/16 19:49
作者:未知 时间:2005-08-07 21:03 出处:编程爱好者网站 责编:chinaitpower 摘要:在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 lookregParameterfiletype&& 文件类型* 申明要用到的API 函数DECLARE Integer RegOpenKey IN Win32API ;Integer nHKey, String @cSubKey,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,cAppKey,cAppName,nErrNumLOCAL oReg,regfilecAppKey = ""cAppName = ""nCurrentKey = 0nErrNum =GetAppPath(filetype,@cAppKey,@cAppName)* 确保去掉可执行文件后的参数 (如: C:/EXCEL/EXCEL.EXE /e)IF ATC(".EXE",m.cAppName) #0m.cAppName= ALLTRIM(SUBSTR(m.cAppName,1,ATC(".EXE",m.cAppName)+3))IF ASC(LEFT(cAppName,1))=34&& 去掉长文件名前多出的"字符m.cAppName = SUBSTR(m.cAppName,2)ENDIFENDIFRetu LOWER(m.cAppName)ENDPROC* 打开注册表PROCEDURE OpenKeyLPARAMETER cLookUpKeyLOCAL nSubKey,nErrCodenSubKey = 0m.nRegKey = HKEY_CLASSES_ROOTnErrCode = RegOpenKey(m.nRegKey,m.cLookUpKey,@nSubKey)nCurrentKey = m.nSubKeyENDPROC* 关闭注册表PROCEDURE CloseKey=RegCloseKey(nCurrentKey)nCurrentKey =0 ENDPROC* 查询注册表PROCEDURE GetKeyValueLPARAMETER cValueName,cKeyValueLOCAL lpdwReserved,lpdwType,lpbData,lpcbData,nErrCodeSTORE 0 TO lpdwReserved,lpdwTypeSTORE SPACE(256) TO lpbDataSTORE LEN(m.lpbData) TO m.lpcbDatam.nErrCode=RegQueryValueEx(nCurrentKey,m.cValueName,;m.lpdwReserved,@lpdwType,@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* 得到应用程序的安装路径及名称PROCEDURE GetApplicationPARAMETER cExtnKey,cAppKeyLOCAL cOptNamecOptName = ""=OpenKey(m.cExtnKey+"/Shell/Open/Command")=GetKeyValue(cOptName,@cAppKey)=CloseKey()ENDPROC---- 在使用这段程序时,使用如下格式的语句: ---- fullpath=lookreg("doc") && 返回打开doc 文件的软件名及安装路径 ---- 灵活运用该段程序,可以大大丰富我们在软件中的表现能力,例如应用软件的菜单中都有一项“关于本软件”的功能,该功能调用的表单一般用来显示有关系统资源及软件版权的信息。如果我们要给其中的公司信息加上超文本链接使其可以直接访问公司主页。就可以在显示公司信息的 Label控件的 Click 事件中使用如下语句: fullpath=lookreg("htm")Ifallt(fullpath)= =[]=messagebox(" 无法找到浏览器以浏览公司主页!",64,"")retuElsefullpath=subst(fullpath,1,rat([.],fullpath)-1)+space(2)+;[www.flysmart.com]RUN/n3&fullpathEndif---- (二)利用Windows 的文档关联特性直接调用。 ---- 我们知道,Windows是一种面向文档的操作系统。当我们双击某个文件时,Windows就会自动启动与该文件相关联的应用程序来对文件进行处理。在这个过程中Windows主要使用了一个名为ShellExecute 的Win32 API函数。我们可以通过这个函数来直接调用其他程序,彻底抛弃Run 命令的方式。 Function shellstartParametersdocumentname* 声明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操作的对象为 documentnamelpszFile = documentnamelpszParams = "" * 指定ShellExecute的缺省目录为c:/templpszDir = "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文件
原创粉丝点击