ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 解决shell异步执行外部程序问题的代码

解决shell异步执行外部程序问题的代码

作者:绿色风 分类: 时间:2022-08-18 浏览:57
楼主
omnw
我们经常会使用Shell来执行外部程序,由于Shell是按照异步方式执行程序,会使我们的程序出现错误,而且查询原因也很复杂。下面的代码可以Shell实现同步执行的效果。
  1. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredaccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
  2. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpexitcode As Long) As Long
  3. Const STILL_ACTIVE = &H103
  4. Const PROCESS_QUERY_INFORMATION = &H400
  5. Sub Shell_T()
  6.     Dim hShell As Long
  7.     Dim hProc As Long
  8.     Dim lExit As Long
  9.     hShell = Shell("RunExeFile", 1)
  10.     hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
  11.     If hShell = 0 Then MsgBox "程序执行失败"
  12.     Do
  13.         GetExitCodeProcess hProc, lExit
  14.         DoEvents
  15.     Loop While lExit = STILL_ACTIVE
  16.     MsgBox "Shell 语句执行完毕"
  17. End Sub

注:RunExeFile代表要执行的程序名,以及任何必需的参数或命令行变量,可能还包括目录或文件夹,以及驱动器。
2楼
omnw
Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。这样就会造成实际的结果与设计不相符,如下代码:
  1.         Shell "cmd.exe /c del " & ThisWorkbook.Path & "\结果.txt"
  2.         Open ThisWorkbook.Path & "\结果.txt" For Binary As #1
  3.         Put #1, , Join(s, vbCrLf)
  4.         Close #1
就会出现open语句生成的“结果.txt”文件被Shell删除的结果。
为了解决“异步”问题,可以借助API函数来监测Shell进程是否已经运行结束,然后再运行下面的代码,达到“同步”的效果。这样将上面的代码改造如下:
  1. Option Explicit
  2. Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredaccess&, ByVal bInherithandle&, ByVal dwProcessid&) As Long
  3. Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpexitcode As Long) As Long
  4. Sub DelFile()
  5.     Dim i As Integer
  6.     Dim cmd As String
  7.     Const STILL_ACTIVE = &H103
  8.     Const PROCESS_QUERY_INFORMATION = &H400
  9.     Dim hShell As Long
  10.     Dim hProc As Long
  11.     Dim lExit As Long
  12.    
  13.     cmd = "cmd.exe /c del " & ThisWorkbook.Path & "\结果.txt"
  14.     hShell = Shell(cmd, 0)
  15.     hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
  16.     If hShell = 0 Then
  17.         MsgBox "error"
  18.     Else
  19.         Do
  20.             GetExitCodeProcess hProc, lExit
  21.             DoEvents
  22.         Loop While lExit = STILL_ACTIVE
  23.         Open ThisWorkbook.Path & "\结果.txt" For Binary As #1
  24.         ' Put #1, , Join(s, vbCrLf)
  25.         Close #1
  26.     End If
  27. End Sub
3楼
yinxingshu
居然还有这个问题,不可思议!
4楼
水星钓鱼
学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap