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
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函数
秦国统一六国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 命名参数有以下这些值:
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 函数不能打开命名的程序,则会
vbHide 0 窗口被隐藏,且焦点会移到隐式窗口。
VbNormalFocus 1 窗口具有焦点,且会还原到它原来的大小和位置。
VbMinimizedFocus 2 窗口会以一个具有焦点的图标来显示。
VbMaximizedFocus 3 窗口是一个具有焦点的最大化窗口。
VbNormalNoFocus 4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。
VbMinimizedNoFocus 6 窗口会以一个图标来显示。而当前活动的的窗口仍然保持活动。
说明
如果 Shell 函数成功地执行了所要执行的文件,则它会返回程序的任务 ID。任务 ID 是一个唯一的数值,用来指明正在运行的程序。如果 Shell 函数不能打开命名的程序,则会
产生错误。
注意 缺省情况下,Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
注意 缺省情况下,Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
二、希望某一 VB 程序利用 Shell 执行某一个外部程序(假设是 )之后,就一直等到此一程序结束执行时, 才回到 VB 程序继续执行, 该怎么办到呢?
当我们调用 Shell 时, 会传回一个数值, 此一数值称为 Process Id, 利用此一 Process Id, 我们可以调用 OpenProcess API 取得 Process Handle, 然后再利用 Process Handle 调用 WaitForSingleObject, 即可等待被 Shell 执行的程序执行完毕, 才继续向下执行。细节如下:
1. API 的声明:
当我们调用 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 变数
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正常运行起来的。如果是这个效果,假设x1,x2在同一文件夹下。则x2的某个按钮的click事件可以这样写:shell app.path & "x1.exe abcdefg",1在x1的form load事件中加入:if command <> "abcdefg" then msgbox "您必需在x2中打开本程序!" endend if其中abcdefg是
随便写的,你可以认为是密码吧。原理:shell函数在打开x1时会携带参数进去,所以只要在x1中检测这个传递进来的参数command,如果是你的密码,那就允许运行,否则给出提示后退出
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论