写了个小东西,中间想调用另一个exe程序,我知道可以用shell,问题是这个样子就必须打包的时候把那个exe打在外面,有没有办法把这个exe封装到我自己生成的exe文件里?
如果不行,用shell函数我有什么办法知道外部的这个exe运行结束了呢?

解决方案 »

  1.   

    '用shell调用程序并判断是否结束.Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpExitCode As Long) As Long
    Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
    Private Const PROCESS_QUERY_INFORMATION As Long = (&H400)
    Private Const STILL_ACTIVE As Long = &H103Sub ShellWait(FileName As String)
    Dim hShell As Long
    Dim hProc As Long
    Dim lExit As Long
    hShell = Shell(FileName, vbNormalFocus)
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
    Do
        GetExitCodeProcess hProc, lExit
        DoEvents
    Loop While lExit = STILL_ACTIVE
    End Sub
    Private Sub Command1_Click()
    ShellWait "C:\WINNT\system32\calc.exe"
    MsgBox "运行完毕!"
    End Sub
      

  2.   

    方法一:
    Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    Public Declare Function ShellExecuteEx Lib "shell32.dll" (SEI As SHELLEXECUTEINFO) As LongPublic Const SEE_MASK_NOCLOSEPROCESS = &H40
    Public 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 Long
        hInstApp As Long
        lpIDList As Long
        lpClass As String
        hkeyClass As Long
        dwHotKey As Long
        hIcon As Long
        hProcess As Long
    End TypePublic Const INFINITE = &HFFFFFFFF
    方法一:Dim pId As Long, pHnd As Long
    pId = Shell("PathFileName.exe")
    pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
    If pHnd <> 0 Then
       WaitForSingleObject pHnd, INFINITE '等待结束
       CloseHandle pHnd
    End If
    方法二:
    Dim SEI As SHELLEXECUTEINFO
    With SEI
      .cbSize = Len(SEI)
      .fMask = SEE_MASK_NOCLOSEPROCESS
      .hwnd = 0
      .lpVerb = vbNullChar
      .lpFile = "PathFileName.*"
      .lpParameters = vbNullChar
      .lpDirectory = vbNullChar
      .nShow = 0
      .hInstApp = 0
      .lpIDList = 0
    End With
    If ShellExecuteEx(SEI) <> 0 Then
      WaitForSingleObject SEI.hProcess, INFINITE '等待结束
      CloseHandle SEI.hProcess
    End If
      

  3.   

    可以将调用的exe文件放到执行的exe文件的资源中,当调用是在资源
    中释放。
      

  4.   

    一定要把这个EXE文件一起打包,当然,你也可以给它换个名字
      

  5.   

    tztz520(午夜逛街) 的代码我看懂了,
    XunBaian(蓝水晶) 的我不是很明白,你可以把后面的帮我写一些注释吗?WaitForSingleObjectAPI我没有用过,也没有找到相关的资料。谢谢
    LPan008() 我没有在VB中使用过资源文件,你能说的详细点吗?谢谢你
      

  6.   

    如果你不关闭这个被你启动的外部exe程序,那么你的程序就会在 WaitForSingleObject 处死等,无法操作你自已的程序。understand ?
      

  7.   

    换句话说,只有你关闭了你启动的外部exe,WaitForSingleObject 的调用才会返回。
      

  8.   

    http://community.csdn.net/Expert/topic/3882/3882424.xml?temp=.5110285我刚刚回复的,是把控件打包在EXE内部的...建议你以后多看看别人的相关帖子^_^
      

  9.   

    TalentLi(▁▂▃▄▅ 天才的我 ▆▅▄▃▂▁) 
    我的问题不是把控件打包在EXE中,是把exe打到exe内部如果解决不了我就用XunBaian(蓝水晶) 的方法了
    顺便在问一问,用shell或者shellExecute可以打开别的程序没有问题,但是比如我要用记事本打开个名为123.txt文档,用shell怎么写?也就是说我不仅要打开notepad还要传递参数给他告诉他打开123.txt
    ,解决后在开一贴放100分,呵呵好久没有散分了
      

  10.   

    第一种方法:pId = Shell("notepad 123.txt", vbNormalFocus)用第二种方法打开txt,会自动定位到关联的应用程序,如下:
    SEI.lpFile = "123.txt"
      

  11.   

    '用记事本打开.Private Sub Command1_Click()
    Shell "notepad.exe " & "F:\ABC.TXT", vbNormalFocus
    End Sub
      

  12.   

    蓝水晶你说的是因为txt和记事本已经建立了关联,如果没有关联呢?比如我想打开txt用word打开呢?
     tztz520(午夜逛街)说的也只是限于记事本上吧,其他程序行吗?比如播放器?
      

  13.   

    Shell "word的路径" & "F:\ABC.TXT", vbNormalFocus将路径写成你想打开的程序就可以
      

  14.   

    都到这个份上了,想不到你还是没弄清楚第二种方法通吃!(呵呵,有点偏激),这样回答够了吗?    ^_^如:
    SEI.lpFile = "应用程序.exe 应用程序要打开的文件.* 所有其它参数"   //路径名、程序名、要打开的文件名(即参数)都在这里写,同时适合于用Shell或:
    SEI.lpFile = "应用程序.exe "  //如果非可执行程序,则自动找关联的程序打开。
    SEI.lpParameters = "应用程序要打开的文件.*"
    SEI.lpDirectory = "路径"
      

  15.   

    呵呵麻烦大家了,马上结贴,另外以100分我开贴后会通知XunBaian(蓝水晶) ,tztz520(午夜逛街)