如何在VB里面检索所有应用程序的hInstance

288794 2004-06-07 10:19:41
我想通过检索hInstance来判断一个程序是否已经运行了,是用GetClasslong获取hInstance,再通过GetModulFile得到的VB程序都是msvbvn60.DLL,根本不是应用程序本身的hInstance,请问如何解决。

  我想在运行一个应用程序的实例时注册DLL部件,在所有的应用程序都卸载后释放(反注册)DLL部件,需要判断是否实例已经完全没有了。通过判断标题等不够严谨,识别hInstance是最好的。

  请赐教,谢谢!
...全文
162 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
288794 2004-06-09
  • 打赏
  • 举报
回复
那么你所说的COM组件的注册和注销是不是说COM对象实例的生成和销毁?
如果你只是在系统中注册(register)和反注册(unregister)对象,那就真是没有什么必要了,不知道你这样做的意图是什么?

我想在所有的应用程序卸载时,卸载掉使用的部件(不注册),这样如果我的部件升级时,就可以直接覆盖就可以了,不用考虑版本兼容问题(在启动是注册部件)

结账了,谢谢星星的帮助!CSDN永远是最好的!
supergreenbean 2004-06-08
  • 打赏
  • 举报
回复
那么你所说的COM组件的注册和注销是不是说COM对象实例的生成和销毁?
如果你只是在系统中注册(register)和反注册(unregister)对象,那就真是没有什么必要了,不知道你这样做的意图是什么?
288794 2004-06-08
  • 打赏
  • 举报
回复
首先谢谢星星们的帮忙!

1、呵呵,不知道你所说的dll部件是否是指COM组件。
是的,就是COM组件。

2、另外,我始终觉得你这个问题还是在设定一个程序实例计数器比较好,每增加一个实例就把计数器加1,在实例结束的时候把计数器减1,如果计数器为0则销毁对象
我是在用COM组件当插件来用,在EXE程序里面引用,但在EXE程序里面设置不了组件的记数器吧?如果是在COM里面设置,我好多插件的,有些使用,有些不使用,在COM里面识别太麻烦吧!

To:zhujiechang(小朱) ( )

那什么方法好?就是获取不到hInstance。
boyzhang 2004-06-07
  • 打赏
  • 举报
回复
up
goodname008 2004-06-07
  • 打赏
  • 举报
回复
' 列出本地所有进程,参考一下吧。

' 添加一个List和三个CommandButton。

Option Explicit
Dim ProcessID() As Long ' 按list1中的进程顺序存储所有进程ID

'---------- API类型声明 -----------
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 * 1024
End Type

Private Type MODULEENTRY32 '模块
dwsize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Byte
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * 1024
End Type

Private Type THREADENTRY32 '线程
dwsize As Long
cntusage As Long
th32threadID As Long
th32OwnerProcessID As Long
tpBasePri As Long
tpDeltaPri As Long
dwFlags As Long
End Type


'----------------------------------------- API声明 -------------------------------------------------------
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long
Private Declare Function Thread32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
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 GetCurrentProcessId Lib "kernel32" () As Long

'---------------------------------------- API常数声明 ------------------------------------------------------
Private Const TH32CS_SNAPHEAPLIST = &H1
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPTHREAD = &H4
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Private Const TH32CS_INHERIT = &H80000000
Private Const PROCESS_TERMINATE = &H1&

Private Sub Command1_Click()
Dim Process As PROCESSENTRY32
Dim ProcSnap As Long
Dim cntProcess As Long
cntProcess = 0
List1.Clear
ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
If ProcSnap Then
Process.dwsize = 1060 ' 通常用法
Process32First ProcSnap, Process
Do Until Process32Next(ProcSnap, Process) < 1 ' 遍历所有进程直到返回值为False
List1.AddItem Trim(Process.szExeFile)
cntProcess = cntProcess + 1
Loop
End If
ReDim ProcessID(cntProcess) As Long
Dim i As Long
i = 0
Process32First ProcSnap, Process
Do Until Process32Next(ProcSnap, Process) < 1 ' 遍历所有进程直到返回值为False
ProcessID(i) = Process.th32ProcessID
i = i + 1
Loop
CloseHandle (ProcSnap)
End Sub

Private Sub Command2_Click()
Dim c As Integer
If List1.ListIndex < 0 Then
MsgBox "请选择进程!", vbOKOnly + vbInformation, "提示"
Else
Dim hProcess As Long
hProcess = OpenProcess(PROCESS_TERMINATE, False, ProcessID(List1.ListIndex))
If hProcess Then TerminateProcess hProcess, 0
c = List1.ListCount
While List1.ListCount = c
Command1_Click
Wend
End If
End Sub

Private Sub Command3_Click()
Unload Me
End Sub
supergreenbean 2004-06-07
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot
->
Module32First
->
Module32Next
->
MODULEENTRY32.hModule

你可以用变通的方式来做吧,比如在内存或硬盘上建一个实例表,或者建一个计数器,当计数器为0的时候反注册。不过,你这样注册又反注册的不知道有什么意义?
zhujiechang 2004-06-07
  • 打赏
  • 举报
回复
2000和xp下的EnumProcesses可以获得所有进程的PID号.
然后OpenProcess和GetModuleBaseName可得名字.和句柄
识别hInstance是最好的?谁说的.
supergreenbean 2004-06-07
  • 打赏
  • 举报
回复
另外,我始终觉得你这个问题还是在设定一个程序实例计数器比较好,每增加一个实例就把计数器加1,在实例结束的时候把计数器减1,如果计数器为0则销毁对象
supergreenbean 2004-06-07
  • 打赏
  • 举报
回复
呵呵,不知道你所说的dll部件是否是指COM组件
288794 2004-06-07
  • 打赏
  • 举报
回复
那不是要用ActiveX DLL了?不想用,注册和反注册就是OLE注册和释放了,和这个无关,我想获取应用程序的hInstance。

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧