阿里西西web开发团队在开发一个asp系统,需要同步调用vb(dll)执行的shell操作,asp->vb(dll)->shell->rar.exe同步执行exe文件。
由于shell是异步处理,这个问题让我们头疼了很久,最终还是通过百度找到了几个不错的函数,调试过,效果还不错,建议可以先用vb建exe来调试好了,再放入DLL编译给ASP调用。
代码如下:
以下是用vb制作一个exe文件进行调试,打开记事本和计算器示例: Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Long hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal _ hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function CreateProcessA Lib "kernel32" (ByVal _ lpApplicationName As String, ByVal lpCommandLine As String, ByVal _ lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, _ ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, _ ByVal lpEnvironment As Long, ByVal lpCurrentDirectory As String, _ lpStartupInfo As STARTUPINFO, lpProcessInformation As _ PROCESS_INFORMATION) As Long Private Declare Function CloseHandle Lib "kernel32" _ (ByVal hObject As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" _ (ByVal hProcess As Long, lpExitCode As Long) As Long Private Const NORMAL_PRIORITY_CLASS = &H20& Private Const INFINITE = -1& Public Function ExecCmd(cmdline$) Dim proc As PROCESS_INFORMATION Dim start As STARTUPINFO ’ Initialize the STARTUPINFO structure: start.cb = Len(start) ’ Start the shelled application: ret& = CreateProcessA(vbNullString, cmdline$, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, vbNullString, start, proc) ’ Wait for the shelled application to finish: ret& = WaitForSingleObject(proc.hProcess, INFINITE) Call GetExitCodeProcess(proc.hProcess, ret&) Call CloseHandle(proc.hThread) Call CloseHandle(proc.hProcess) ExecCmd = ret& End Function Sub Form_Click() Dim retval As Long retval = ExecCmd("notepad.exe") MsgBox "notepad Process Finished, Exit Code " & retval retval = ExecCmd("calc.exe") MsgBox "calc Process Finished, Exit Code " & retval End Sub |
以下是引用片段: Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long 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 Private Const SYNCHRONIZE = &H100000 Private Const INFINITE = &HFFFF ’ Infinite timeout Private Const WAIT_TIMEOUT = &H102& Public Function ShellForWait(sAppName As String, Optional ByVal lShowWindow As VbAppWinStyle = vbMinimizedFocus, Optional ByVal lWaitTime As Long = 0) As Boolean Dim lID As Long, lHnd As Long, lRet As Long On Error Resume Next lID = Shell(sAppName, lShowWindow) If lID > 0 Then lHnd = OpenProcess(SYNCHRONIZE, 0, lID) If lHnd <> 0 Then Do lRet = WaitForSingleObject(lHnd, lWaitTime) DoEvents Loop While lRet = WAIT_TIMEOUT CloseHandle lHnd ShellForWait = True Else ShellForWait = False End If Else ShellForWait = False End If End Function ShellForWait("notepad.exe",,&HFFFF) |
方法三:
以下是引用片段: Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Const SYNCHRONIZE = &H100000 ’进程同步 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 Private Const INFINITE = &HFFFFFFFF Private Sub cmdOpen_Click() OpenFileWait "C;/windows/HH.exe ", "Help.chm" End Sub Private Sub OpenFileWait(tkShellFile As String, tkFileName As String) wndID = Shell(tkFileName, vbNormalFocus) wnd = OpenProcess(SYNCHRONIZE, 0, wndID) WaitForSingleObject wnd, INFINITE CloseHandle wnd End Sub |
如果你觉得不错,阿里西西(Alixixi.com)网站还有更多精彩资源,不要错过,记住我们的网址!