ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8058|回复: 6

shell调用的外部程序没有运行完就自动结束?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-11-6 10:56 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:脚本语言应用

Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
    Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Const Process_Query_Information = &H400
    Public Const Still_Active = 259

Sub 按钮186_单击()


Dim strWinDir As String
    Dim pid As Long
    Dim hProcess As Long
    Dim a As String
  
    a = ThisWorkbook.Path 'Excell文件所在路径。
 
    strWinDir = Environ("windir") '系统目录。
   
    'pid = Shell(strWinDir & "\system32\cmd.exe", 1)
    pid = Shell(a & "\cuihuatiaohe.exe", 1)
    hProcess = OpenProcess(Process_Query_Information, False, pid)
   
    Do
    GetExitCodeProcess hProcess, lngexitcode
    DoEvents
    Loop While lngexitcode = Still_Active
End Sub

以上语句,我执行pid = Shell(strWinDir & "\system32\cmd.exe", 1)
时该cmd窗口可以长时间存在,而我执行pid = Shell(a & "\cuihuatiaohe.exe", 1) 则cuihuatiaohe.exe运行很短的时间马上就自动终止,并没有执行完。我不用VBA调用,直接运行该程序cuihuatiaohe.exe没有任何问题,可以正常运行(大约10秒)。

这是为什么呢?感觉好像是cuihuatiaohe.exe被调用后显示出一行字后就自动中断了。

点评

知识树内容索引:2楼  发表于 2013-11-8 12:20

TA的精华主题

TA的得分主题

发表于 2007-11-6 11:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

Shell只会调用程序,调用后就会继续执行后面代码。下面代码可让代码等待调用程序结束后再继续执行后面代码,试试:

Private Declare Function OpenProcess Lib "kernel32" _
                        (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
                        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Const INFINITE = &HFFFFFFFF
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const SYNCHRONIZE = &H100000

Sub test()
    Dim ReturnValue&, hProcess&

    ReturnValue = Shell("Notepad.exe ", vbMaximizedFocus)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION + SYNCHRONIZE, 0, ReturnValue)
    WaitForSingleObject hProcess, INFINITE

    MsgBox "您结束了记事本"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-6 11:18 | 显示全部楼层

Private Declare Function OpenProcess Lib "kernel32" _
                        (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessID As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
                        (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

Private Const INFINITE = &HFFFFFFFF
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const SYNCHRONIZE = &H100000

Sub 按钮186_单击()


Dim strWinDir As String
    Dim pid As Long
    Dim a As String
   
   
   Dim ReturnValue&, hProcess&
  
    a = ThisWorkbook.Path 'Excell文件所在路径。
 
    'strWinDir = Environ("windir") '系统目录。
   
    'pid = Shell(strWinDir & "\system32\cmd.exe", vbNormalFocus)
    'pid = Shell(a & "\cuihuatiaohe.exe", 1)
   
    ReturnValue = Shell(a & "\cuihuatiaohe.exe", vbMaximizedFocus)
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION + SYNCHRONIZE, 0, ReturnValue)
    WaitForSingleObject hProcess, INFINITE
       
End Sub

根据您的指点修改了程序,但是运行的结果还是一样,cuihuatiaohe.exe程序只是运行很短的时间就马上停止了。应该还有别的原因吧。调用Notepad.exe 确实没有问题。但是调用我自己写的这个程序就不行了,而我自己写的这个程序独立运行的时候没有这个问题,可以很好的运行完。

为什么呢?请您指教。

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-6 11:31 | 显示全部楼层

我用单步执行的方式运行VBA也是一样,在读到该shell语句,还没有往下运行的时候,cuihuatiaohe程序也不是运行完,只是运行很短的时间就自动关闭了。

是不是和我所写的程序某些特征有关系?我在独立运行这个程序的时候没有任何问题啊。

TA的精华主题

TA的得分主题

发表于 2007-11-6 11:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

是否方便上传cuihuatiaohe.exe

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-11-6 11:54 | 显示全部楼层
QUOTE:
以下是引用BobPan在2007-11-6 11:44:52的发言:

是否方便上传cuihuatiaohe.exe

我刚才测试了一下,发现是我的程序的问题,我的程序在调用的时候需要链接到库,但是用VBA调用的时候无法识别库。

我试了好几次,终于抓图成功,知道原因了,谢谢。

出错原因,可参见图片。

我的程序运行需要安装一个库,所以发给您您也打不开的。

[此贴子已经被作者于2007-11-6 11:55:25编辑过]

TA的精华主题

TA的得分主题

发表于 2013-11-8 10:46 | 显示全部楼层
huruigege 发表于 2007-11-6 11:54
QUOTE:以下是引用BobPan在2007-11-6 11:44:52的发言:是否方便上传cuihuatiaohe.exe我刚才测试了一下,发现 ...

你好,我现在使用VBA调用外部exe失败,也是窗口出现一会儿就消失,exe也需要调用DLL,跟你遇到的问题一模一样,请问你是怎么解决的啊?很着急,求指导,求指导,很着急,非常感谢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-8 07:29 , Processed in 0.042377 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表