vb中shell 函数的困扰 20
我编了一个vb程序,其中调用了一个批处理,我用的是shell函数,但纵所周知,shell函数是异步执行的,既用shell函数调用的批处理还未执行完,vb就执行下面的语句了...
我编了一个vb程序,其中调用了一个批处理,我用的是shell函数,但纵所周知,shell函数是异步执行的,既用shell函数调用的批处理还未执行完,vb就执行下面的语句了。我想的是等这批处理执行完后,用msgbox函数弹出已完成的窗口。下面是我的代码:
Private Sub Command1_Click()
Shell "cmd /c c:\temp.bat", 0
msgbox "已完成"
End Sub
请高手针对我这段代码,加以更正,(越详细越好)使得“temp.bat”这个批处理运行完后再弹出“已完成”的窗口。(或者是用一个 进度条 监视 批处理 的执行进度也可以)
下面是“temp.bat”的内容
del /f /s /q "C:\Program Files\KK\MyReceiveFiles\HeadImage\*.*"
del /f /s /q "C:\WINDOWS\Temp\tmp00004f13\*.*"
del /f /s /q "E:\Program Files\UserData\Temp\Streamer\AD\*.*"
谢谢了!
忘了问了,vb中除了shell函数可以调用批处理文件外,还有别的函数吗?如果有,请详细介绍一下它的语法。 展开
Private Sub Command1_Click()
Shell "cmd /c c:\temp.bat", 0
msgbox "已完成"
End Sub
请高手针对我这段代码,加以更正,(越详细越好)使得“temp.bat”这个批处理运行完后再弹出“已完成”的窗口。(或者是用一个 进度条 监视 批处理 的执行进度也可以)
下面是“temp.bat”的内容
del /f /s /q "C:\Program Files\KK\MyReceiveFiles\HeadImage\*.*"
del /f /s /q "C:\WINDOWS\Temp\tmp00004f13\*.*"
del /f /s /q "E:\Program Files\UserData\Temp\Streamer\AD\*.*"
谢谢了!
忘了问了,vb中除了shell函数可以调用批处理文件外,还有别的函数吗?如果有,请详细介绍一下它的语法。 展开
2个回答
展开全部
冷汗……
凭我的能力可能不能用进度条监视进度,但我能同步执行……
使用 ShellExecuteEx 函数(在 SHELL32.DLL 里面)。这个函数的原型如下:
Declare Function ShellExecuteEx Lib "shell32" (ByRef ShellExecInfo As SHELLEXECUTEINFO) As Long
C++ 语言格式(经过我的改写):
#define SEE_MASK_NOASYNC 0x100000
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "xxx.exe"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
从 C++ 移过来是这样的:
Const SEE_MASK_NOASYNC = &H100000
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Integer
hInstApp As Long
lpIDList As Any
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hMonitor As Long
End Type
Dim ShExecInfo As SHELLEXECUTEINFO
With ShExecInfo
.cbSize = Len(SHELLEXECUTEINFO)
.fMask = SEE_MASK_NOASYNC 'fMask 的取值见第二个参考网址
.hwnd = Me.hWnd
.lpVerb = "OPEN" 'lpVerb 的取值见第二个参考网址
.lpFile = "{FILENAME}"; '指定文件名,可以是任意存在的文件
.lpParameters = ""
.lpDirectory = ""
.nShow = 1 '显示出来
.hInstApp = 0
End With
ShellExecuteEx(ShExecInfo)
调用完成后进程的句柄由 hProcess 返回,可使用 TerminateProcess 关闭。
有关这个函数,参考网址中有很详细的说明,在此不再赘述。
调用之后这个进程就是同步的了,进程结束后才会执行之后的语句。
再回答补充的问题。VB 的 VBRUN、VB、VBA 库(msvbvm60.dll)里面也就 Shell 函数可以打开文件了。注意一下,Shell 调用的还是 WinExec 函数(见 kernel32.dll):
Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long。
是不是很亲切呢?对比一下 Shell 就知道了。同样返回 PID,除了参数传递不同(ByVal 和 ByRef),没有不一样的,包括 nCmdShow,和 Shell 的第二个参数取值都一样。
用“原装”的不行,就来“外援”:ShellExecute 和 ShellExecuteEx。这两个函数其实参考网址里面已经讲得很详细了,网上也有很多用法之类的东西。
凭我的能力可能不能用进度条监视进度,但我能同步执行……
使用 ShellExecuteEx 函数(在 SHELL32.DLL 里面)。这个函数的原型如下:
Declare Function ShellExecuteEx Lib "shell32" (ByRef ShellExecInfo As SHELLEXECUTEINFO) As Long
C++ 语言格式(经过我的改写):
#define SEE_MASK_NOASYNC 0x100000
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS ;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "xxx.exe"; //can be a file as well
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
从 C++ 移过来是这样的:
Const SEE_MASK_NOASYNC = &H100000
Type SHELLEXECUTEINFO
cbSize As Long
fMask As Long
hwnd As Long
lpVerb As String
lpFile As String
lpParameters As String
lpDirectory As String
nShow As Integer
hInstApp As Long
lpIDList As Any
lpClass As String
hkeyClass As Long
dwHotKey As Long
hIcon As Long
hMonitor As Long
End Type
Dim ShExecInfo As SHELLEXECUTEINFO
With ShExecInfo
.cbSize = Len(SHELLEXECUTEINFO)
.fMask = SEE_MASK_NOASYNC 'fMask 的取值见第二个参考网址
.hwnd = Me.hWnd
.lpVerb = "OPEN" 'lpVerb 的取值见第二个参考网址
.lpFile = "{FILENAME}"; '指定文件名,可以是任意存在的文件
.lpParameters = ""
.lpDirectory = ""
.nShow = 1 '显示出来
.hInstApp = 0
End With
ShellExecuteEx(ShExecInfo)
调用完成后进程的句柄由 hProcess 返回,可使用 TerminateProcess 关闭。
有关这个函数,参考网址中有很详细的说明,在此不再赘述。
调用之后这个进程就是同步的了,进程结束后才会执行之后的语句。
再回答补充的问题。VB 的 VBRUN、VB、VBA 库(msvbvm60.dll)里面也就 Shell 函数可以打开文件了。注意一下,Shell 调用的还是 WinExec 函数(见 kernel32.dll):
Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long。
是不是很亲切呢?对比一下 Shell 就知道了。同样返回 PID,除了参数传递不同(ByVal 和 ByRef),没有不一样的,包括 nCmdShow,和 Shell 的第二个参数取值都一样。
用“原装”的不行,就来“外援”:ShellExecute 和 ShellExecuteEx。这两个函数其实参考网址里面已经讲得很详细了,网上也有很多用法之类的东西。
参考资料: http://blog.csdn.net/jiangsok/archive/2009/07/22/4368965.aspx;http://hi.baidu.com/653701wwww
展开全部
'放一个模块里(StillRun.bas)
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'检测是否还在运行
Public Function StillRun(ByVal ProgramID) As Boolean
Dim lHProgram As Long
Dim lReturn As Long
Dim hProgram As Long
hProgram = 0
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
StillRun = True
Else
StillRun = False
End If
CloseHandle hProgram
End Function
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'窗体代码:
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Private Sub Command1_Click()
Dim pID As Double
pID = Shell("cmd /c c:\temp.bat", 0)
While StillRun(pID) = True '返回True表示还在运行
DoEvents '加上这句不会太卡
Wend
MsgBox "已完成"
End Sub
好久没用了,不知道行不行,你试试把。
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'检测是否还在运行
Public Function StillRun(ByVal ProgramID) As Boolean
Dim lHProgram As Long
Dim lReturn As Long
Dim hProgram As Long
hProgram = 0
hProgram = OpenProcess(0, False, ProgramID)
If Not hProgram = 0 Then
StillRun = True
Else
StillRun = False
End If
CloseHandle hProgram
End Function
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'窗体代码:
'>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Private Sub Command1_Click()
Dim pID As Double
pID = Shell("cmd /c c:\temp.bat", 0)
While StillRun(pID) = True '返回True表示还在运行
DoEvents '加上这句不会太卡
Wend
MsgBox "已完成"
End Sub
好久没用了,不知道行不行,你试试把。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询