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
to tztz 能详细解释一下吗?GetCurrentProcessId ExitProcess 运行时说这2个函数未定义
关闭的时候别用unload me 药用end
首先通过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
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)
to online(龙卷风V3.0--笑傲江湖) 如何关闭呢?是con.close吗?
close 打开数据库执行完操作后,请记住关闭数据库!
在每个窗体的unload事件中写上: set 窗体名=nothing
conn.Close If Not conn Is Nothing Then Set conn = Nothing End If
在每个窗体的unload事件中写上: set 窗体名=nothing这个我写了还是一样有 刚刚试过了 end 关闭可以结束进程。问题暂时解决了, 不过不知道用end 会有什么优缺点,还是要找找资料,大家知道的也可以说说, 多谢各位的帮助~~~~~! 结帖
to zyg0(影子(努力吃饭中)) 我另外再开贴 散分给你
可能有些窗体hide了,而没有 unload
其实大家说的都对,你的主要原因是有对象没有关闭,造成的对象占用进程,这些对象可能是 窗体,记录集,连接 具体是什么我们大家都不知道,只有你自己知道,要慢慢查程序的 避免这样的事情发生主要要注意饮用的对象在使用完后要关闭,像 online(龙卷风V3.0--笑傲江湖) 老大说的 set 对象=nothing 如果实在没办法用end也行,他会把程序开的全部对象和资源都释放
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
to tztz 能详细解释一下吗?GetCurrentProcessId
ExitProcess
运行时说这2个函数未定义
药用end
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)
打开数据库执行完操作后,请记住关闭数据库!
If Not conn Is Nothing Then
Set conn = Nothing
End If
窗体,记录集,连接
具体是什么我们大家都不知道,只有你自己知道,要慢慢查程序的
避免这样的事情发生主要要注意饮用的对象在使用完后要关闭,像 online(龙卷风V3.0--笑傲江湖) 老大说的
set 对象=nothing
如果实在没办法用end也行,他会把程序开的全部对象和资源都释放