加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB 调用EXE文件

(2011-04-12 10:16:31)
标签:

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   执行某一个外部程序(假设是   notepad.exe)之后,就一直等到此一程序结束执行时,   才回到   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正常运行起来的。如果是这个效果,假设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,如果是你的密码,那就允许运行,否则给出提示后退出

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有