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

本文介绍在Visual FoxPro (VFP) 中通过注册表查找和利用ShellExecute API函数来调用外部应用程序的方法。提供了两个实用示例:一是通过注册表查找可处理特定文件类型的软件路径;二是直接调用相关联程序打开文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作者:未知 时间: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 lookreg Parameterfiletype&& 文件类型 * 申明要用到的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") Ifallt(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 Parametersdocumentname * 声明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文件
vfp9.0调用API制作照相软件实例 PUBLIC WM_CAP_DRIVER_DISCONNECT PUBLIC hwndc,WM_CAP_SAVEDIB,WM_CAP_FILE_SET_CAPTURE_FILEA,WM_CAP_SEQUENCE,WM_CAP_STOP DECLARE INTEGER capCreateCaptureWindowA IN "AVICAP32.DLL" STRING lpszWindowName ,INTEGER dwStyle , INTEGER x, INTEGER Y, INTEGER nWidth ,INTEGER nHeight,INTEGER ParentWin,INTEGER nId DECLARE INTEGER SendMessage IN "user32" INTEGER HWND, INTEGER wmsg,INTEGER wpar1, INTEGER wpar2 DECLARE INTEGER SendMessage IN "user32" AS SendMessageA INTEGER HWND, INTEGER wmsg,INTEGER wpar1, STRING wpar2 *!* 显示: WM_USER = 1024 WM_CAP_START = WM_USER WM_CAP_STOP = WM_CAP_START + 68 WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10 WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11 WM_CAP_SAVEDIB = WM_CAP_START + 25 WM_CAP_GRAB_FRAME = WM_CAP_START + 60 WM_CAP_SEQUENCE = WM_CAP_START + 62 WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20 WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6 WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2 WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3 WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5 WM_CAP_SET_SCALE=WM_CAP_START+ 53 WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 hWndC = capCreateCaptureWindowA('My Own Capture Window',1342177280,0,0,200,150,THISFORM.HWND ,0) &&显示大小 IF hWndC 0 SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0) SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0) SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0) SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0) SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0) SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0) * THISFORM.ACTIVATE ENDIF
目 录 一、建立WORD应用程序对象,新建、打开、保存WORD文档 5 1、建立对象 5 2、显示WORD窗口 5 3、新建一个WORD文档 5 (1)Count属性 5 (2)Name属性 5 4、打开一个已存在的WORD文档 5 5、激活文档,使文档成为当前激动文档 6 6、保存文档 6 7、页面设置 6 (1)Orientation属性 6 (2)TopMargin属性 6 (3)BottomMargin属性 6 (4)LeftMargin属性 6 (5)RightMargin属性 7 (6)PageWidth属性 7 (7)PageHeight属性 7 8、打印文档 7 9、关闭文档 7 10、退出WORD 8 二、Font对象 8 1、Name 属性 8 2、Size属性 8 3、Bold属性 8 4、Italic属性 8 5、Color属性 8 6、Underline属性 8 7、UnderlineColor属性 8 8、Subscript属性 9 9、Superscript属性 9 10、Spacing属性 9 11、Scaling属性 9 三、Paragraph和Paragraphs集合对象 9 1、添加段落 9 (1) Add方法 10 (2)InsertParagraph方法 10 (3)InsertParagraphAfter 方法 10 (4)InsertParagraphBefore 方法 11 (5)TypeParagraph 方法 11 2、设置段落格式 11 (1)FirstLineIndent属性 11 (2)LeftIndent属性 11 (3)RightIndent属性 11 (4)Alignment属性 11 (5)LineSpacing属性 12 (6)HangingPunctuation属性 12 四、Range 和 Selection 对象 12 (1)Range对象 12 (2)Selection 对象 13 (3)常用属性 13 ①Start属性 13 ②End属性 14 ③Text属性 14 ④Type属性 14 ⑤Information 属性 15 (4)常用方法 18 ①Copy 方法 18 ②Cut 方法 18 ③Paste 方法 18 ④Collapse 方法 18 ⑤InsertBefore 方法 19 ⑥InsertAfter方法 19 ⑦TypeText方法 19 ⑧Delete 方法 20 ⑨移动插入点的方法 20 ㈠Move 方法 20 ㈡MoveDown 方法 20 ㈢MoveEnd 方法 21 ㈣MoveEndUntil 方法 21 ㈤MoveLeft 方法 22 ㈥MoveRight方法 22 ㈦MoveStart 方法 23 ㈧MoveStartUntil 方法 23 ㈨MoveUp 方法 24 五、表格处理 25 1、Table 对象和Tables 集合对象 25 2、添加表格 25 (1)PreferredWidthType 属性 25 (2)AllowAutoFit属性 26 (3)AllowPageBreaks属性 26 3、Border 对象和Borders 集合对象 26 (1)LineStyle属性 26 (2)LineWidth属性 27 (3)Color属性 27 (4)Enable 属性 27 (5)DefaultBorderLineWidth 属性 27 (6)DefaultBorderLineStyle 属性 27 (7)DefaultBorderColor 属性 27 4、Cell 对象和Cells 集合对象 28 5、Row 对象和Rows 集合对象 28 (1)Height 属性 28 (2)Delete 方法 28 (3)SetHeight 方法 28 6、Column 对象和Columns 集合对象 29 (1)Width 属性 29 (2)Delete 方法 29 (3)SetWidth 方法 29 7、合并与拆分单元格 30 (1)合并单元格 30 (2)拆分单元格 30 六、Shape 对象和Shapes 集合对象 32 1、常用方法 32 (1)AddLine 方法 32 (2)AddTextbox 方法 33 (3)AddTextEffect 方法 33 (4)AddPicture 方法 34
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值