会员登录 - 用户注册 - 网站地图 Office中国(office-cn.net),专业Office论坛
当前位置:主页 > 技巧 > Access技巧 > API > 正文

[技巧分享]多条Shell语句执行导致判断出错的解决办法

时间:2013-07-04 23:21 来源:Office中国 作者:Access中国tmtony 阅读:
问题:
_________________________________________________________________

我在一个模块中的一个过程中写了以下几句代码
Shell "net use z: \\qmxmaster\D$ "
  Shell "xcopy  w:\bakData     z:\pxsystem\bakData\ /e /c /y", 0
      Shell "net use z: /del"
w:是局域网中A计算机本来就设置的一个网络驱动器,映射B计算机的一个
共享文件夹。z:是通过代码临时在A机器建立的另一个网络驱动器,指向B
计算机的d盘。
          在A计算机运行这个过程,把w:\bakData文件夹中全部文件拷贝到B计算机
(机器名pxmaster) 的D盘 bakData文件夹中。
        现在前两步都做到了,可以建立文件夹并拷贝,但是第3句却不起作用,驱动
器z总是不能消失,可是 我把第3句放到命令行是能够正常执行的。何故?
        是不是考贝时间过长(5-6秒),代码不执行?是否可以让代码执行有一个等待
过程?


解决(tmtony Office中国/Access中国):
_____________________________________________________________
应该是等待时间过长. 两种方法

1.Shell("命令", vbHide, True)  最后参数为true 这个可选参数设为True就可以让Shell执行完才接着Shell下边的代码
2.使用API来判断 建立以下的代码

Option Explicit
'等待shell执行完成后才执行下一条代码
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STATUS_PENDING = &H103
Private Const SYNCHRONIZE = &H100000

Private Const INFINITE = &HFFFFFFFF
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

'执行Shell命令并等待程序执行完毕 再返回控制权才继续执行下一句代码
Private Sub Command1_Click()

    Dim pId As Long, pHnd As Long    ' 分别声明 Process Id 及 Process Handle 变数
    pId = Shell("http://www.office-cn.net")   ' Shell 传回 Process Id

    pHnd = OpenProcess(SYNCHRONIZE, 0, pId)    ' 取得 Process Handle
    DoEvents  ' doevents
    If pHnd <> 0 Then
        Call WaitForSingleObject(pHnd, INFINITE)    ' 无限等待,直到程序结束
        Call CloseHandle(pHnd)
    End If
    MsgBox "执行完毕 "

End Sub

(责任编辑:admin)

顶一下
(3)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价: