我用vb作了两个程序(exe),我想让一个程序(exe1)结束另一个程序(exe2).
a=shell("c:\2.exe")
call ExitProcess(a)
用这个办法发现没有把2.exe结束反而把自己(exe1)给干掉了
因为2.exe是一个循环所以不能通过发送close消息给他的办法来解决
还有就是call ExitProcess(exe2的app.threadid) 也是把自己(exe1)给干掉了
我该这么办呢?

解决方案 »

  1.   

    先找到相应进程,再用TerminateProcess关闭他
      

  2.   

    你给mail,我给你发个程序过来
      

  3.   

    【函数】
    ExitProcess【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    ExitProcess Lib "kernel32" Alias "ExitProcess" (ByVal uExitCode As Long)As  Boolean 【说明】  中止一个进程 【返回值】
    【其它】
    【参数表】
      uExitCode ------  Long,指定想中断的那个进程的一个退出代码
      在VB中使用
      应尽量避免用该函数来关闭进程。不要在自己的VB程序中使用它。此时,应试着向要关闭的那个程序的主窗口投递一条WM_CLOSE消息【函数】
    TerminateProcess【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    TerminateProcess Lib "kernel32" Alias "TerminateProcess" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long【说明】  结束一个进程 
      在VB里使用 
      可以使用,但尽量不用 【返回值】  Long,非零表示成功,零表示失败。会设置GetLastError 【其它】
    【参数表】
      hProcess -------  Long,指定要中断的一个进程的句柄  uExitCode ------  Long,进程的一个退出代码
      

  4.   

    Const SYNCHRONIZE = &H100000
    Const INFINITE = &HFFFFFFFF
    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 Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As LongPrivate Sub Command1_Click()
    Dim pId As Long, pHnd As Long ' 分别声明 Process Id 及 Process Handle 变数
    pId = Shell("c:\winnt\system32\notepad.exe", vbNormalFocus) ' Shell 传回 Process Id
    pHnd = OpenProcess(SYNCHRONIZE, 0, pId) ' 取得 Process Handle
    Call TerminateProcess(pHnd, 0)   ' TerminateProcess 所传入的是 Process Handle
    Call CloseHandle(pHnd)
    End Sub
      

  5.   

    使用DDE吧,反正都是你写的程序
    程序A的窗体属性DDESOURCE设为TRUE,加一个LABEL
    程序B的窗体上也加一个LABEL,设置它的LINKTOPIT,LINKITEM,LINKMODE。
    当程序A将LABEL的CAPTION设为任何一个字符串,B窗体上的LABEL也会显示相同的字符串,程序B只要判断自己窗体上LABEL的CAPTION就可以收到消息了。
      

  6.   

    请看:有效,也有点意思。Dim FHandle As Variant '(儲存視窗代碼的變數)Private Sub Command1_Click()
    FHandle = Shell("C:\WIND98\CALC.EXE", 1) '(開啟外部執行檔)
    End SubPrivate Sub Command2_Click()
    AppActivate FHandle '讓先前開啟的視窗取得焦點。
    SendKeys "%{f4}", True '送出 [Alt]+[F4] Windows 系統的關閉組合鍵。
    End Sub改寫成能處理錯誤的呼叫函數則如下:開啟 Windows 應用程式
    'varAppName 是程式路徑及名稱之傳遞參數
    'varWinState 是應用程式視窗開啟狀態,設定方式請參考 Shell
    '的 WindowsStyle 說明
    Private Function OpenApp(ByVal varAppName As String, _
    Optional ByVal varWinState As Integer)
    '傳回應用程式之視窗代碼
    Dim varWinTitle As Variant'錯誤處理
    On Error GoTo OpenAppErrvarWinTitle = Shell(varAppName, varWinState)
    OpenApp = varWinTitle
    Exit FunctionOpenAppErr:
    Select Case Err.Number
    Case 53
    MsgBox "程式路徑或名稱錯誤", vbOKOnly, "開啟應用程式"
    End Select
    End Function'關閉 Windows 應用程式
    'varWinTitle 是開啟程式時 Windows 系統給的代碼
    Private Sub CloseApp(ByVal varWinTitle As Variant)'錯誤處理
    On Error GoTo CloseAppErrAppActivate varWinTitle
    '用 SendKeys 陳述模擬鍵盤 [ALT]+[F4]
    SendKeys "%{F4}"
    Exit SubCloseAppErr:
    Select Case Err.Number
    Case 5
    MsgBox "程式視窗已被關閉", vbOKOnly, "關閉應用程式"
    End Select
    End Sub'上面是改寫 Shell 和 AppActivate 的兩個函數,呼叫方式如下:'宣告一個儲存視窗代碼的變數
    Private WinTitle As Variant'開程式
    Private Sub Command1_Click()
    Dim AppName As StringAppName = "你的程式路徑及名稱"
    WinTitle = OpenApp(AppName)
    End Sub'關程式
    Private Sub Command2_Click()
    CloseApp WinTitle
    End Sub
      

  7.   

    用findwindow函数找到你要关的程序句柄,再用sendmessage发WM_CLOSE 消息
      

  8.   

    Option Explicit
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    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 Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) As Boolean
    Const PROCESS_TERMINATE = 1Dim ProID As LongPrivate Sub Form_Load()
        ProID = Shell("notepad.exe", vbNormalFocus)
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        Dim hProcess As Long
        hProcess = OpenProcess(PROCESS_TERMINATE, False, ProID)
        TerminateProcess hProcess, 1
        CloseHandle hProcess
    End Sub
      

  9.   

    其实启动程序标准的作法是调用CreateProcess,因为shell也是这样做的。
    这样做可以在函数的返回信息中直接获得进程句柄,不用再OpenProcess。