VB 调用EXE文件
                    VB 调用EXE文件
一、调用方法
有三种方法  :)
ShellExecute函数
WinExec函数
Shell函数


1.ShellExecute 

VB声明 
Declare  Function  ShellExecute  Lib  "shell32.dll "  Alias  "ShellExecuteA "  (ByVal  hwnd  As  Long,  ByVal  lpOperation  As  String,  ByVal  lpFile  As  String,  ByVal  lpParameters  As  String,  ByVal  lpDirectory  As  String,  ByVal  nShowCmd  As  Long)  As  Long


一撇划了三寸长打一字说明 
        查与指定文件关联在一起的程序的文件名

返回值 
        Long,非零表示成功,零表示失败。会设置GetLastError

[参数表]
参数  类型及说明 
hwnd  Long,指定一个窗口的句柄,有时候,windows程序有必要在创建自己的主窗口前显示一个消息框 
lpOperation  String,指定字串open”来打开lpFlie文档,或指定Print”来打印它 
lpFile  String,想用关联程序打印或打开一个程序名或文件名 
lpParameters  String,如lpszFlie是可执行文件,则这个字串包含传递给执行程序的参数 
lpDirectory  String,想使用的完整路径 
nShowCmd  Long,定义了如何显示启动程序的常数值。参考ShowWindow函数的nCmdShow参数


秦国统一六国2.WinExec 

VB声明 
Declare  Function  WinExec  Lib  "kernel32 "  Alias  "WinExec "  (ByVal  lpCmdLine  As  String,  ByVal  nCmdShow  As  Long)  As  Long

说明 
        运行指定的程序

返回值 
        Long,大于32表示成功,请参考FindExecutable函数 


[油价为什么上涨这么快参数表]
参数  类型及说明 
lpCmdLine  String,包含要执行的命令行 
nCmdShow  Long,定义了以怎样的形式启动程序的常数值。参考ShowWindow函数的nCmdShow参数 
注解 
请参考对CreateProcess函数的说明,了解在目录中查指定文件的顺序


3.Shell函数 

执行一个可执行文件,返回一个空调不制冷的原因  Variant  (Double),如果成功的话,代表这个程序的任务  ID,若不成功,则会返回  0

语法

Shell(pathname[,windowstyle])

Shell  函数的语法含有下面这些命名参数:

部分  描述 
pathname  必要参数。Variant  (String),要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。 
Windowstyle  可选参数。Variant  (Integer),表示在程序运行时窗口的样式。如果  windowstyle  省略,则程序是以具有焦点的最小化窗口来执行的。 


windowstyle  命名参数有以下这些值:

常量    描述 
vbHide  0  窗口被隐藏,且焦点会移到隐式窗口。 
VbNormalFocus  1  窗口具有焦点,且会还原到它原来的大小和位置。 
VbMinimizedFocus  2  窗口会以一个具有焦点的图标来显示。 
VbMaximizedFocus  3  窗口是一个具有焦点的最大化窗口。 
VbNormalNoFocus  4  窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。 
VbMinimizedNoFocus  6  窗口会以一个图标来显示。而当前活动的的窗口仍然保持活动。 


说明

如果  Shell  函数成功地执行了所要执行的文件,则它会返回程序的任务  ID。任务  ID  是一个唯一的数值,用来指明正在运行的程序。如果  Shell  函数不能打开命名的程序,则会
产生错误。

注意  缺省情况下,Shell  函数是以异步方式来执行其它程序的。也就是说,用  Shell  启动的程序可能还没有完成执行过程,就已经执行到  Shell  函数之后的语句。
二、希望某一  VB  程序利用  Shell  执行某一个外部程序(假设是  )之后,就一直等到此一程序结束执行时,  才回到  VB  程序继续执行,  该怎么办到呢?

  当我们调用  Shell  时,  会传回一个数值,  此一数值称为  Process  Id  利用此一  Process  Id  我们可以调用  OpenProcess  API  取得  Process  Handle  然后再利用  Process  Handle  调用  WaitForSingleObject  即可等待被  Shell  执行的程序执行完毕,  才继续向下执行。细节如下:

  1.  API  的声明:

  Const  SYNCHRONIZE  =  &H100000
  Const  INFINITE  =  &HFFFFFFFF
  Private  Declare  Function  OpenProcess  Lib  "kernel32 "  (ByVal  dwDesiredAccess  As  Long,  ByVal     bInheritHandle  As  Long,  ByVal  dwProcessId  As  Long)  As  Long
  Private  Declare  Function  CloseHandle  Lib  "kernel32 "  (ByVal  hObject  As  Long)  As  Long
  Private  Declare  Function  WaitForSingleObject  Lib  "kernel32 "  (ByVal  hHandle  As  Long,  ByVal    dwMilliseconds  As  Long)  As  Long

  注:如果以上的声明放在「一般模块」底下,  应将  Declare  之前的  Private  保留字去掉,  并且在  Const  之前加上  Public  保留字。

  2.  程序范例:(以执行  Notepad  程序为例)

  Dim  pId  As  Long,  pHnd  As  Long  '  分别声明  Process  Id  高空安全带及  Process  Handle  变数


  pId  =  Shell( "Notepad ",  vbNormalFocus)  '  Shell  传回  Process  Id

  pHnd  =  OpenProcess(SYNCHRONIZE,  0,  pId)  '  取得  Process  Handle
  If  pHnd  <>  0  Then
关于雨的谚语  Call  WaitForSingleObject(pHnd,  INFINITE)  '  无限等待,直到程序结束
  Call  CloseHandle(pHnd)
  End  If
三、假设有两个标准EXE程序。一个名为X1.exe 一个名为x2.exe。单击x1是无法独立运行的并给出提示。运行x2.exe后在exe窗体上增加按钮 可以调用x1.exe
不能直接运行x1,给出提示后就退出x1。然后在x2程序中,调用x1程序才能让x1正常运行起来的。如果是这个效果,假设x1x2在同一文件夹下。则x2的某个按钮的click事件可以这样写:shell app.path & "x1.exe abcdefg",1x1form load事件中加入:if command <> "abcdefg"  then      msgbox "您必需在x2中打开本程序!"      endend if其中abcdefg
随便写的,你可以认为是密码吧。原理:shell函数在打开x1时会携带参数进去,所以只要在x1中检测这个传递进来的参数command,如果是你的密码,那就允许运行,否则给出提示后退出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。