asp调用vb生成的dll文件,执行shell异步变同步的解决方法(带源代码)

vb|解决|源代码|执行|shell|异步|同步

阿里西西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)网站还有更多精彩资源,不要错过,记住我们的网址!

时间: 2024-10-28 17:53:26

asp调用vb生成的dll文件,执行shell异步变同步的解决方法(带源代码)的相关文章

c#-关于C#调用matlab生成的.dll文件时的问题

问题描述 关于C#调用matlab生成的.dll文件时的问题 本人用matlab做了一个海浪波长计算程序,想在C#中调用该程序,自己始终无法调用. 也找了网上一些资料,按他们所说的做,结果发现引用后的.dll文件无法应用(已在注册表添加过注册),希望有经验的前辈帮忙解答一下,谢谢. 解决方案 http://www.jb51.net/article/41034.htm 解决方案二: 我使用的是:VS 2008, matlab R2009a: ? 首先遇到的第一个问题是:**** 类型初始值设定项引

c-关于VB.net调用C生成的dll,遇到的比字符集不匹配还纠结的问题

问题描述 关于VB.net调用C生成的dll,遇到的比字符集不匹配还纠结的问题 升级项目.从6.0到2012.升级后出现调用dll中c的方法:DLLEXPORT BOOL WINAPI InsUpdDel( LPSTR lpSqlStr LPRTNINFO RtnInfo )其中 LPSTR lpSqlStr 是_char × 类型,在API _winnt.h中定义:winnt.h // ANSI (Multi-byte Character) types//typedef Null_termin

mfc-LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错

问题描述 LabView中调用MFC-Wizard生成的DLL实现自定义文件对话框功能出错 VC创建MFC-Wizard生成的Dll,在导出函数MyFileOpen中调用由CFileDialog派生类CMyFileDlg实现自定义文件对话框.再在LabView中引用库函数节点调用MFC生成的DLL,输入输出参数设置输入类型int32.输出为C字符串指针即为文件对话框返回的选中目标文件路径. 如上配置完成后,运行弹出1097错误,用error_out屏蔽后,返回路径没有输出结果.DLL调试执行My

VS2010调用matlab生成的dll, 头文件里面只有对C_API,没有对CPP_API的声明?

问题描述 VS2010调用matlab生成的dll, 头文件里面只有对C_API,没有对CPP_API的声明? 想要的是这种声明:extern LIB_mysvd_CPP_API void MW_CALL_CONV mysvd(int nargout, mwArray& s, mwArray& v, mwArray& d, const mwArray& a); 编译出来的是这种声明:extern LIB_mysvd_C_API void MW_CALL_CONV mlfMy

在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景

背景       在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使用一些第三方通讯组件的时候,通过C#来开发应用软件时,就需要利用DllImport特性进行方法调用.本篇文章将引导你快速理解这个调用的过程.   步骤 1. 创建一个CSharpInvokeCPP的解决方案:   2. 创建一个C++的动态库项目:   3. 在应用程序设置中,选择"DLL",其他按照默认选项: 最后点击完成,得到如图所示项目:       我们可以看到这里有一些文件,其中dllmain.c

C++调用C#写的dll文件出错

问题描述 ,最近在做一项课设,其中用到了C++调用C#的dll文件.不知所措的我上网搜到了很多方法,走了很多方法出现了下面的问题.换了很多方法,都是一样的问题.crl已经改了,多线程也改了.但是还有错,百般无奈之下,于是求助环境:VS2010下面是我的报错问题1>------已启动全部重新生成:项目:TTs,配置:DebugWin32------1>生成启动时间为2015/12/3018:06:41.1>_PrepareForClean:1>正在删除文件"DebugTTs

c++调用matlab生成的Dll动态连接库

点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R2009a)   VC++6.0思路:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器. 2. 编译m文件成dll 3. 设置VC的Include路径和lib链接库的路径 4. 编写C++调用dll步骤:1.    设置matlab的编译器在命令行窗口下,输入并执行如下命令:mex

java调用swt.jar包dll文件的加载问题?

问题描述 java调用swt.jar包dll文件的加载问题? 调用swt.jar时,报错 Exception in thread "AWT-EventQueue-2" java.lang.UnsatisfiedLinkError: no swt-win32-3347 or swt-win32 in swt.library.path, java.library.path or the jar file at org.eclipse.swt.internal.Library.loadLib

如何在NodeJS中调用SS生成的DLL

要想在NodeJS中调用SS生成的DLL, 需要借助EdgeJS. EdgeJS: http://tjanczuk.github.io/edge/ 如果你还不知道如何在SS 中生成DLL, 请查看: Spider Studio 新版本 (x-mas) - 可以引入第三方程序集, 可以将脚本生成为DLL 下面以曾经写过的XML/JSON互转的脚本为例 (C#中 另辟蹊径解决JSON / XML互转的问题) 说明如何在NodeJS中应用SS DLL: 1. 安装edgejs npm install