手头上有一个数据库程序(VB+SQL),没开一次关闭后,打开任务管理器发现有他的进程,再次打开完成后关闭,任务管理器重又出了一个该程序的进程, 我试着开了n次,关闭后任务管理器中就有n个进程。 各位帮帮我分析一下原因

解决方案 »

  1.   

    数据库连接开始就打开,结束整个程序时再Close
      

  2.   

    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)Private Sub Form_Unload(Cancel As Integer)'在主窗体退出的事件中彻底关闭程序
    Dim ProcessID  As Long
    ProcessID = GetCurrentProcessId()
    ExitProcess (ProcessID)
    End Sub
      

  3.   


    to tztz 能详细解释一下吗?GetCurrentProcessId
    ExitProcess
    运行时说这2个函数未定义
      

  4.   

    关闭的时候别用unload me
    药用end
      

  5.   

    首先通过CreateToolhelp32Snapshot函数创建一个进程的快照,然后通过调用Process32First使用快照返回的句柄对进程进行遍历,相关的信息存放在PROCESSENTRY32结构类型的实例中,然后显示出来。 Winxp+vb6+sp6代码如下:Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As LongPrivate Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPrivate Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As LongPrivate Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, _    ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, _    ByVal uExitCode As Long) As Long Private Type PROCESSENTRY32    dwSize As Long    cntUsage As Long    th32ProcessID As Long    th32DefaultHeapID As Long    th32ModuleID As Long    cntThreads As Long    th32ParentProcessID As Long    pcPriClassBase As Long    dwFlags As Long    szExeFile As String * 1024End Type Const TH32CS_SNAPHEAPLIST = &H1Const TH32CS_SNAPPROCESS = &H2Const TH32CS_SNAPTHREAD = &H4Const TH32CS_SNAPMODULE = &H8Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)Const TH32CS_INHERIT = &H80000000'添加listview控件,3个按钮'删除listview中选定的进程Private Sub Command2_Click()    If MsgBox("你想删除 " & ListView1.SelectedItem.SubItems(2) & " 进程?", vbYesNo + vbQuestion) <> vbYes Then        Exit Sub    End If        Dim mProcID As Long    mProcID = OpenProcess(1&, -1&, ListView1.SelectedItem)    TerminateProcess mProcID, 0&    DoEvents    ListView1.ListItems.Remove (ListView1.SelectedItem.Index)    ListView1.RefreshEnd Sub'得到进程填充listviewPrivate Sub Command1_Click()  Dim my As PROCESSENTRY32  Dim l As Long  Dim l1 As Long  Dim mlistitem As ListItem  '  List1.Clear  l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)  If l Then    my.dwSize = 1060    If (Process32First(l, my)) Then '遍历第一个进程      Do       Set mlistitem = ListView1.ListItems.Add(, , my.th32ProcessID)             mlistitem.SubItems(1) = my.th32ParentProcessID             mlistitem.SubItems(2) = my.szExeFile      Loop Until (Process32Next(l, my) < 1) '遍历所有进程知道返回值为False    End If    l1 = CloseHandle(l)  End IfEnd Sub Private Sub Form_Load()    ListView1.ListItems.Clear    ListView1.ColumnHeaders.Clear    ListView1.FullRowSelect = True    ListView1.ColumnHeaders.Add , , "Process ID", 1500    ListView1.ColumnHeaders.Add , , "Process Parent ID", (1500)    ListView1.ColumnHeaders.Add , , "Name", (Me.Width - 3200)    ListView1.View = lvwReportEnd Sub '循环检测进程中是否有指定进程,如果有,关闭,如果没有,启动一个程序Private Sub Command3_Click()  Dim my As PROCESSENTRY32  Dim l As Long  Dim l1 As Long  Dim flag As Boolean  Dim mName As String  Dim i As Integer   l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)  If l Then    my.dwSize = 1060    If (Process32First(l, my)) Then '遍历第一个进程      Do             i = InStr(1, my.szExeFile, Chr(0))             mName = LCase(Left(my.szExeFile, i - 1))        If mName = "winword.exe" Then             PID = my.th32ProcessID             pname = mName             MsgBox "找到word"              If MsgBox("你想删除 " & mName & " 进程?", vbYesNo + vbQuestion) <> vbYes Then                    Exit Sub                End If                 Dim mProcID As Long             mProcID = OpenProcess(1&, -1&, PID)             TerminateProcess mProcID, 0&                          flag = True             Exit Sub         Else             flag = False         End If      Loop Until (Process32Next(l, my) < 1) '遍历所有进程知道返回值为False    End If    l1 = CloseHandle(l)  End If    If flag = False Then    MsgBox "没有找到word"    Shell "c:\Program Files\Microsoft Office\Office\WINWORD.EXE", vbNormalFocus  End IfEnd Sub
      

  6.   

    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)如果在窗口中的通用模块中定义就用private,也可以定义在模块中,用public,如:
    public Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    public Declare Sub ExitProcess Lib "kernel32" (ByVal uExitCode As Long)
      

  7.   

    to  online(龙卷风V3.0--笑傲江湖)     如何关闭呢?是con.close吗?
      

  8.   

    close
    打开数据库执行完操作后,请记住关闭数据库!
      

  9.   

    在每个窗体的unload事件中写上: set 窗体名=nothing
      

  10.   

    conn.Close
    If Not conn Is Nothing Then
       Set conn = Nothing
    End If
      

  11.   

    在每个窗体的unload事件中写上: set 窗体名=nothing这个我写了还是一样有  刚刚试过了  end 关闭可以结束进程。问题暂时解决了, 不过不知道用end 会有什么优缺点,还是要找找资料,大家知道的也可以说说, 多谢各位的帮助~~~~~! 结帖
      

  12.   

    to  zyg0(影子(努力吃饭中)) 我另外再开贴 散分给你
      

  13.   

    可能有些窗体hide了,而没有 unload
      

  14.   

    其实大家说的都对,你的主要原因是有对象没有关闭,造成的对象占用进程,这些对象可能是
    窗体,记录集,连接
    具体是什么我们大家都不知道,只有你自己知道,要慢慢查程序的
    避免这样的事情发生主要要注意饮用的对象在使用完后要关闭,像  online(龙卷风V3.0--笑傲江湖) 老大说的
    set 对象=nothing
    如果实在没办法用end也行,他会把程序开的全部对象和资源都释放