设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1795|回复: 3
打印 上一主题 下一主题

[模块/函数] 请教各位老师:断开网络驱动器的代码在模块里失效!

[复制链接]
跳转到指定楼层
1#
发表于 2013-7-4 19:50:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 bjcompass 于 2013-7-4 20:10 编辑

我在一个模块中的一个过程中写了以下几句代码:
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秒),代码不执行?是否可以让代码执行有一个等待
过程?


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2013-7-4 21:05:50 | 只看该作者
补充:上面那3句代码。
试验了一下:如果先在计算机中建立好网络驱动器z。然后只在过程中执行第3句,就可以删除驱动器Z。看来第三句失效是与前两句的影响有关。请问怎样解决呢?

点击这里给我发消息

3#
发表于 2013-7-4 23:15:45 | 只看该作者
应该是等待时间过长. 两种方法
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("F:\1.bat")   ' 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

4#
 楼主| 发表于 2013-7-6 13:16:55 | 只看该作者
谢谢admin网友的热情帮助,您的API代码方式有点复杂,我下载了好好研究。您的第一种方式代码简洁,我非常希望采用,可是代码中加上括号就报错,要求有“=”号,我也不知道该怎样写,希望能给写个例子。
      经过试验,我在第2句和3句之间加了一个消息提示框,写成:
Shell "net use z: \\qmxmaster\D$ "
  Shell "xcopy  w:\bakData     z:\pxsystem\bakData\ /e /c /y", 0
  MsgBox "备份已经完成!。", 0, "系统提示"
      Shell "net use z: /del"
利用消息框制造了一个等待时间,就可以删除Z盘了,但是按消息框“确定”键的速度不能太快了,还是感觉不爽。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-7 03:28 , Processed in 0.104039 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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