VFP调用外部程序

来源:互联网 发布:php字符串默认编码 编辑:程序博客网 时间:2024/05/22 08:01

在VFP中如何调用其它程序 
-------------------------------------------------------------

Declare Long WinExec In kernel32 String,Long
=WinExec("notepad.exe",1)
Clear Dlls

WinExec(one.exe,SW_SHOW); 
里面的SW_SHOW意思是什么 
WinExec()函数第二个参数是什么意思 
如果我想以无参数运行one.exe应该怎么办?? 
SW_SHOW表示以当前大小激活运行后的程序窗口并显示它。 
第二个参数是控制程序主窗口的显示方式 
第二个参数可能的取值为 : 
************************* 窗口指定可视性定义 **********************************API函数ShellExecute中最后一个参数及wscript.shell方法中的第2个参数也是这样定义的。
0 SW_HIDE 隐藏窗口,活动状态为原调用窗口 
6 SW_MINIMIZE 最小化窗口,活动状态为原调用窗口 
9 SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
5 SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
3 SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
2 SW_SHOWMINIMIZED 最小化窗口,并将其激活 
7 SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
8 SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
4 SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
1 SW_SHOWNORMAL 与SW_RESTORE相同 
****************************************************************************
一般情况下,第二个参数取SW_SHOWNORMAL即可,这样就是无参数运行App.exe 
WinExec("App.exe -参数" , SW_SHOWNORMAL);第二个参数只是WinExec函数的参数,不是AppName.exe的参数。



ox=Createobject("wscript.shell")  
ox.Run("notepad.exe",1,0) &&第2个参数参考上面《窗口指定可视性定义》,第3个参数0表示调用后马上将控件权返回原调用程序,1表示直接被调用程序结束后才将控件权返回原调用程序(调用外部文件时让系统一直等待,直到运行结束才返回控制权就可以了)。
Release ox

如:

ox=Createobject("wscript.shell")  
ox.Run("cmd /c copy c:\abc\1.txt d:\",0,1)
Release ox
Messagebox('操作完成!',64,'信息提示')

或 

在VFP中我们可以用run来调用由VFP自身生成的.exe文件。命令格式:
run c:\..\*.exe

  当调用非VFP自身生成的.exe文件时,需要加上绝对路径和参数。
一般来说,用VFP运行非VFP自身生成的可执行文件时,会有一个黑色的窗口显示一下。可以通过加上/n来隐藏这个窗口。例如运行Windows下的扫雷游戏,命令格式如下:
RUN/n C:\Windows\Winmine.exe
下面运行一个更复杂一点的程序。用word打开c:\下的一个名为mlx.doc的word文件,命令格式如下:
run /n3 C:\Program Files\Microsoft Office\Office\Winword.exe C:\mlx.doc
  参数:参考上面《窗口指定可视性定义》
n 在运行时隐藏VFP的黑色窗口。
  3 表示以最大化的方式运行程序。1正常方式、2最小化方式、3最大化方式

  在这种情况下,虽然可以通过加上参数使程序程序能够流畅运行,但还是要指定绝对路径,而在实际开发时我们常常无法确定所需要启动的应用程序的文件名及其绝对路径。比如,在上例中,我们无法确定用户的word到底安装在什么地方,如果用户把word安装到了别的地方,上述命令便会出错。再如,一个.gif文件,有的用户喜欢用ACD See来打开,有的用户喜欢用IE来打开,有的用户喜欢用豪杰来打开,……
  为了解这种情况我们可以调用Windows的文件关连来打开文件。即所有的文件都用系统默认的程序来打开。这就要调用Windows的Win32 API函数。调用方式如下:

DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,STRING lpszOP,STRING lpszFile,STRING lpszParams,STRING lpszDir,INTEGER fsshowcmd 
DECLARE INTEGER GetDesktopWindow IN win32api 
HWND = GetDesktopWindow() 
lpszOP = "open" 
* 指定要打开的文件名
lpszFile ="c:\mlx.doc"
lpszParams = "" 
lpszDir = "c:\temp" 
fsshowcmd = 1
* 执行ShellExecute命令 
LNRETURN = ShellExecute(HWND, lpszOP,lpszFile, lpszParams, lpszDir,fsshowcmd)

可以用任意的文件名来替换上文中的 c:\mlx.doc 。如果指定的文件名Windows无法找到相应的关连程序,这时程序将不会做出反应。有关的参数可以自行偿试进行修改,以达到最佳效果。

-------------------------------------------------------------
API函数ShellExecute的使用

ShellExecute
说明 Shellexecute 函数用于对文件执行一个动词(verb). 它通常用于启动一个与特定文件类相关联的应用程序. 例如, 要启动 Word 来读一个 .doc 文件, 或启动 记事本 来编辑一个 .txt 文件. 用于第二个参数中的最常用的动词是 "Open", 但其它可用的动词是 "edit","print","explore" 和 "properties". 有趣的是, 使用 "mailto:" 或 "http://" 前缀, ShellExecute 函数也可用于以一个给定的邮件地址启动默认的邮件阅读器或给定的 URL 启动默认的浏览器.


缩主文件 Shell32.dll

在 VFP 中的定义
Declare Integer ShellExecute In "Shell32.dll" Integer HWnd,String lpVerb,String lpFile,String lpParameters,String lpDirectory,Long nShowCmd

Visual FoxPro 应用示例
* 打开 Word 来编辑文件 "c:\mywordfile.doc"
=Shellexecute(0,"Open","c:\mywordfile.doc","","",1)

* 打开默认的浏览器并定位到天堂论坛
=Shellexecute(0,"Open","http://www.163.com","","",1)

* 打开默认的邮件阅读器来发一封信给天堂版主
=Shellexecute(0,"Open","mailto:njjane@21cn.com","","",1)

* 打印文本文件 "c:\mytextfile.txt"
=Shellexecute(0,"Print","c:\mytextfile.txt","","",1)
  



-------------------------------------------------------------
用过《网络蚂蚁》的朋友都知道,在帮助菜单的对话框里作者留下了他的电子邮件地址,单击该邮件地址我们便能给作者发送电子邮件。这种功能看起来有些神秘,实际上只要利用Windows API的ShellExecute函数,便可轻松地实现该功能。 

  ShellExecute是用来打开特定格式的文件(如WORD文件、EXCEL表格)的函数。该函数存放在Shell32.DLL动态链接库中,通过查阅MSDN,我们能够得到下述帮助: 

  HINSTANCE ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd); 

  其调用参数的含义如下: 

  hwnd:指明打开文件的窗口句柄。 

  lpOperation:指明操作类型,分别是"open"(打开)、"print"(打印)、"explore"(浏览)。 

  lpFile:欲打开文件的文件名。这里应该将文件的含义向更深层次理解。文件可以是本地文件,也可以是远程文件;文件的类型可以是文本文件,也可以是多媒体文件。 

  lpParameters:打开文件时所传递的参数。特别适合打开EXE文件。 

  lpDirectory:文件所在路径。 

  nShowCmd:打开文件时窗口的状态。0表示隐藏,1正常方式、2最小化方式、3最大化方式。 

  如果该函数能够成功打开文件,则该函数的返回值大于32。该函数的返回值能够为你调试程序提供很多有用的信息,具体情况见MSDN内帮助文件。 

  好,有了上述认识之后,我们便能在VFP的程序开发中利用ShellExecute函数来实现发送电子邮件的功能。新建一表单ABOUTME,在该表单上添加下列控件(见表1)。 

  需要说明的是,在Label1中的MouseIcon设为一手型光标,其所对应的图标文件在系统内可以随处找到(利用查找文件功能),本文用的是Windows自带h_move.cur文件。针对Label11的各类设置都是为了将该标签打扮得更象"超文本"。 

  添加完上述控件之后,接下来便是编写控件的CLICK事件代码了。对Label1和Label2的CLICK事件设定相同,其他代码为: 

  *进行声明操作: 

  DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,STRING,STRING lpszFile,STRING,STRING,INTEGER 

  *向kingdom@126.com邮箱内发送一封主题为"你好"的电子邮件。 

  在Label1的CLICK事件里,添加以下代码: 

  ShellExecute(0,"open","mailto:kingdom@126.com?subject=你好",0,0,1) 

  在Label2的CLICK事件里,将上述语句改为: 

  ShellExecute(0,"open","http://NationalTax.home.Chinaren.com",0,0,1) 

  *以最大化窗口方式打开IE,进入作者主页。 

  确认按钮的CLICK事件代码很简单:thisform.release 

  运行上述表单,当鼠标移动到电子邮件或是作者主页区域时,鼠标便会变成一只手,点一下即可进行相应的操作:单击Label1,启动Outlook Express;单击Label2,启动IE,表单真有些像一个小型的IE!其实,在VFP的程序开发中,一些看似不可能的事件只要稍微用到一些Windows API,所有的事件一下子都变得简单多了。"山重水复疑无路,柳暗花明又一村",这可能就是编程的乐趣所在吧

  Windows API简介: 

  Application Program Interface,即应用程序编程接口,它是Windows提供给程序员的一系列函数。这些API函数同一般的函数相似,同样具有输入输出参数,并编译到一个独立的文件中,该文件被称为动态链接库。运用API函数可以实现许多复杂和有趣的功能,如重新启动计算机、跟踪当前激活窗体、收发E-mail等。    


----------------------------------------
VFP中操作多种文件
 
     做为一种数据处理软件,VFP在使用上的简洁是人所共知的。在使用VFP进行应用程序开以时,有时会涉及到一些非数据处理方面的内容,比如在VFP中打开WORD文档、EXCEL图表、利用OE收发电子邮件,这些功能又恰恰是VFP的弱项。通常情况下,我们处理这些问题的方法是使用OLE(现称之为ActiveX)技术来完成。但是,在VFP中要熟练操作OLE对象,又是一件更麻烦的事情。拿用VFP接入互联网来说,你可以在VFP的表单中加入Microsoft Web浏览器控件,但是如果没有专业的技术文档,你要想顺利地使用浏览器控件,这基本上是不可能的。有没有一种更简单的办法来实现上述功能呢?有的。
  VFP提供了在应用程序中调用Windows API函数的功能。如果我们要在VFP程序中使用API函数,只需要在使用前先进行申明,告诉VFP你想调用的函数的基本情况。申明语句的语法如下:
  DECLARE [cFunctionType] FunctionName IN LibraryName [AS AliasName]
   [cParamType1 [@] ParamName1, cParamType2 [@] ParamName2,……]
  其中各参数的具体含义如下:
  cFunctionType:被调用函数的返值。它可以是SHORT、INTEGER、SINGLE、DOUBLE、LONG、STRING六个类型之一。学过VC编程的朋友对这些数据类型肯定不会陌生。
  FunctionName :调用函数的名称。它是大小写敏感的。
  LibraryName:调用函数的所在地。它一般是一DLL文件名。
  cParameterType1 [@] ParamName1, cParameterType2 [@] ParamName2, :当对函数的调用属带参调用时,就应该申明参数的类型及名称。
  其实,使用VFP操作其他类型的文件,你不妨把这项工作交给系统替你来完成。在SHELL32.DLL动态链接库中,有一ShellExecute函数,它负责打开文件的操作,查阅MSDN,我们能够得到下述帮助: 
  HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile,LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd);
  其调用参数的含义如下:
   hwnd:指明打开文件的窗口句柄。
   lpOperation:指明操作类型,分别是"open"(打开)、"print(打印)"、"explore(浏览)"
   lpFile:欲打开文件的文件名。这里应该将文件的含义向更深层次理解。文件可以是本地文件,也可以是远程文件。文件的类型可以要文本文件,也可能是多媒体文件。
   LpParameters:打开文件时所传递的参数。特别适合对EXE文件的打开。
   LpDirectory:文件所在路径。
   NShowCmd:打开文件时窗口的状态。0表示隐藏,1表示最大化,2表示最小化。
  如果该函数打开文件的操作的成功,则该函数的返回值大于32。该函数的返回值能够为你调试程序提供很多有用的信息,详情请见MSDN内帮助文件。
  好,有了上面的认识,我们可以引入正题了。
  一、 在VFP中浏览网页。
  在VFP6.0提供了超级链接控件,使用该控件能够很简单地进入Internet。但是在VFP5中却没有此类控件,如果你想在VFP5中浏览互联网,只需在程序中添加如下代码:
  *进行申明操作:
  DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,STRING, STRING lpszFile, STRING, STRING, INTEGER
  *以最大化窗口方式打开IE,并进入在线影院ShellExecute(0,"open","http://www.163film.com",0,0,1)
  二、 打开、打印WORD文档
  *若要打印文档,则将operate赋值为"print"
  operate="open"
  *打开hello.doc文档
  ShellExecute(0,operate,"c:\my documents\hello.doc",0,0,1)
  三、 带参调用EXE文件
  *下列语句将运行记事本程序,并打config.sys进行编辑
  ShellExecute(0,"open","notepad.exe","config.sys","c:\",1)
  四、 调用资源管理器
  *运行资源管理器查看C:盘内容
  ShellExecute(0,"explore",0,"c:\",0,1)
  五、在VFP中发送电子邮件
  *发送一封主题为新年"进步"的信到abcd@efg.com ShellExecute(0,"open","mailto:abcd@efg.com?subject=新年进步 ",0,0,1)
  以上便是ShellExecute常见的几种具体用途,怎么样,没想到在VFP中也能够这样容易地操作各种各样的文件吧!试试看,你肯定能够找到ShellExecute更加多的用途。

如何在VFP中调用默认关联的程序打开文件?

*----------------------------

怎样在一个菜单中建立一个程序或命令打开一个网页或word,excel等文件??? 
--------------------------------------------------------------- 

打开一个网页与word,excel是不一样. 
1.word,excel要用ACTIVEX的OLECONTROL控件. 
2.打开一个网页要用到HYPERLINK控件. 
  可以在表单上加一个TEXT一个COMMANG控件,还有一个超级链接HYPERLINK控件. 
  COMMAND.CLICK事件: 
  THISFORM.HYPERLINK.NAVIGATETO(THISFORM.TEXT.VALUE) 
 
------------------------------------------------------------- 
在vfp的例子中找到了一个这个问题的解决方法,使用api函数来解决,如下: 
1、声明函数 
  DECLARE INTEGER ShellExecute ; 
  IN SHELL32.DLL ; 
  INTEGER nWinHandle,; 
  STRING cOperation,;  
  STRING cFileName,; 
  STRING cParameters,; 
  STRING cDirectory,; 
  INTEGER nShowWindow 
2、在程序中任何地方调用,包括菜单中,打开一个e:\a.htm文件的调用方法如下, 
=ShellExecute(0,"Open","e:\a.htm","","e:\",1) 

--------------------------------------------------------------- 
   
在VFP中我们可以用run来调用由VFP自身生成的.exe文件。命令格式: 
run c:\..\*.exe 
 
  当调用非VFP自身生成的.exe文件时,需要加上绝对路径和参数。 
一般来说,用VFP运行非VFP自身生成的可执行文件时,会有一个黑色的窗口显示一下。可以通过加上/n来隐藏这个窗口。例如运行Windows下的扫雷游戏,命令格式如下: 
RUN/n C:\Windows\Winmine.exe 
下面运行一个更复杂一点的程序。用word打开c:\下的一个名为mlx.doc的word文件,命令格式如下: 
run /n3 C:\Program Files\Microsoft Office\Office\Winword.exe C:\mlx.doc 
  参数:n 在运行时隐藏VFP的黑色窗口。 
  3 表示以最大化的方式运行程序。0隐藏窗口、1正常方式、2最小化方式、3最大化方式 
 
  在这种情况下,虽然可以通过加上参数使程序程序能够流畅运行,但还是要指定绝对路径,而在实际开发时我们常常无法确定所需要启动的应用程序的文件名及其绝对路径。比如,在上例中,我们无法确定用户的word到底安装在什么地方,如果用户把word安装到了别的地方,上述命令便会出错。再如,一个.gif文件,有的用户喜欢用ACD See来打开,有的用户喜欢用IE来打开,有的用户喜欢用豪杰来打开,…… 
  为了解这种情况我们可以调用Windows的文件关连来打开文件。即所有的文件都用系统默认的程序来打开。这就要调用Windows的Win32 API函数。调用方式如下: 
 
DECLARE INTEGER ShellExecute IN shell32.DLL INTEGER HWND,;  
STRING lpszOP, ;  
STRING lpszFile, ;  
STRING lpszParams, ;  
STRING lpszDir, ;  
INTEGER fsshowcmd  
DECLARE INTEGER GetDesktopWindow IN win32api  
HWND = GetDesktopWindow()  
lpszOP = "open"  
* 指定要打开的文件名 
lpszFile ="c:\mlx.doc" 
lpszParams = ""  
lpszDir = "c:\temp"  
fsshowcmd = 1 
* 执行ShellExecute命令  
LNRETURN = ShellExecute(HWND, lpszOP,lpszFile, lpszParams, lpszDir,fsshowcmd) 
 
可以用任意的文件名来替换上文中的 c:\mlx.doc 。如果指定的文件名Windows无法找到相应的关连程序,这时程序将不会做出反应。有关的参数可以自行偿试进行修改,以达到最佳效果。 
 
 
---------------------------------------------------------------- 
API函数ShellExecute的使用 
 
ShellExecute 
说明 Shellexecute 函数用于对文件执行一个动词(verb). 它通常用于启动一个与特定文件类相关联的应用程序. 例如, 要启动 Word 来读一个 .doc 文件, 或启动 记事本 来编辑一个 .txt 文件. 用于第二个参数中的最常用的动词是 "Open", 但其它可用的动词是 "edit","print","explore" 和 "properties". 有趣的是, 使用 "mailto:" 或 "http://" 前缀, ShellExecute 函数也可用于以一个给定的邮件地址启动默认的邮件阅读器或给定的 URL 启动默认的浏览器. 
 
 
缩主文件 Shell32.dll 
 
在 VFP 中的定义 
DECLARE INTEGER ShellExecute IN "Shell32.dll" ; 
INTEGER hwnd, ; 
STRING lpVerb, ; 
STRING lpFile, ; 
STRING lpParameters, ; 
STRING lpDirectory, ; 
LONG nShowCmd 
 
Visual FoxPro 应用示例 
* 打开 Word 来编辑文件 "c:\mywordfile.doc" 
=Shellexecute(0,"Open","c:\mywordfile.doc","","",0) 
 
* 打开默认的浏览器并定位到天堂论坛 
=Shellexecute(0,"Open","http://www.dbwin.net/bbs/index.asp?boardID=1&page=1","","",0) 
 
* 打开默认的邮件阅读器来发一封信给天堂版主 
=Shellexecute(0,"Open","mailto:njjane@21cn.com","","",0) 
 
* 打印文本文件 "c:\mytextfile.txt" 
=Shellexecute(0,"Print","c:\mytextfile.txt","","",0) 
--------------------------------------------------------------- 
 
其实有两个比较简单的方法 
1、 
run/n explorer "http://....com" 
2、 
ox=createobject("wscript.shell")
ox.run("http:/xxx.com") 
3、
declare integer WinExec in win32api string,integer&&这个INTEGER类型的参数是窗口的显示模式最大化,最小化,普通 
winexec("explorer http://....com",3) 
 
--------------------------------------------------------------- 
 
在OLEContainer1 的 init事件中加入这句话就可以了 
This.navigate("http://www.microsoft.com") 

 

******************************************

1. run 命令 
参考帮助文件

2. API
实例

C/C++ code
DECLARE INTEGER ShellExecute IN shell32.DLL ;INTEGER HWND,; &&指定父窗口句柄STRING lpszOP, ;&&指定动作STRING lpszFile, ; &&指定要打开的文件或程序STRING lpszParams, ;&&给要打开的程序指定参数; 如果打开的是文件这里应该是 nullSTRING lpszDir, ;&&缺省目录INTEGER fsshowcmd && 打开选项,窗口的最大化最小化等DECLARE INTEGER GetDesktopWindow IN WIN32API HWND = GetDesktopWindow() lpszOP = "open" * 指定要打开的路径lpszFile =SYS(5) + SYS(2003) + '\data'lpszParams = ""lpszDir = SYS(5) + SYS(2003) + '\data' fsshowcmd = 3LNRETURN = ShellExecute(HWND, lpszOP,lpszFile, lpszParams, lpszDir,fsshowcmd)
***********************************
调用windows计算器run /n calc.exe调用windows写字板run /n Write.exe
 
原创粉丝点击