VB6.0 怎样在本次打开a.exe时,结束之前进程中已经存在的同样的a.exe进程?

ajunajun 2019-06-29 01:46:43
用vb6.0编写的a.exe程序,怎么在本次运行a.exe时,结束进程中已经存在的a.exe进程?
麻烦您写一下完整的代码,非常感谢!
...全文
317 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
脆皮大雪糕 2019-07-02
  • 打赏
  • 举报
回复
引用 12 楼 脆皮大雪糕 的回复:
其实,VB6在21年前就已经考虑过这个问题了。 App.PrevInstance属性直接搞定 主窗体里面试试下面这段代码。调试环境下你可能不好多开进程,编译成exe看效果。

Option Explicit

Private Sub Form_Load()
    If App.PrevInstance Then
        MsgBox "已开启一个进程,关闭这个"
        End
    End If
    
End Sub

哦,是要关闭之前的进程,好吧,无视我
脆皮大雪糕 2019-07-02
  • 打赏
  • 举报
回复
其实,VB6在21年前就已经考虑过这个问题了。 App.PrevInstance属性直接搞定 主窗体里面试试下面这段代码。调试环境下你可能不好多开进程,编译成exe看效果。

Option Explicit

Private Sub Form_Load()
    If App.PrevInstance Then
        MsgBox "已开启一个进程,关闭这个"
        End
    End If
    
End Sub

舉杯邀明月 2019-07-02
  • 打赏
  • 举报
回复
引用 10 楼 ajunajun 的回复:
不想多开。
因为我的程序是要自动控制的,而且不允许多开,当再次打开时需要自动结束之前的相同a进程(写了个软件看门狗程序,一般都是之前的进程不工作了另一个程序自动打开a.exe)


没有窗体?
1. 采用5楼的方案:用命名管道。
2. 采用我在3楼说的后两种“暴力方式”(任选其一)。

小噤 2019-07-01
  • 打赏
  • 举报
回复
你的目的是不想多开还是想重新打开?
我一般是不让多开,而不是关闭之前的进程。
milaoshu1020 2019-07-01
  • 打赏
  • 举报
回复
引用 7 楼 ajunajun 的回复:
忘了把unload改为end了,但发现如果上一次有a.exe的窗体能结束进程,但如果没有窗体就不会结束,好像解决的还不够彻底

得把所有打开的窗体都unload了:

dim objForm as Form
for each objform in forms
unload objform
next

或者用"End";
ajunajun 2019-07-01
  • 打赏
  • 举报
回复
不想多开。 因为我的程序是要自动控制的,而且不允许多开,当再次打开时需要自动结束之前的相同a进程(写了个软件看门狗程序,一般都是之前的进程不工作了另一个程序自动打开a.exe)
ajunajun 2019-06-30
  • 打赏
  • 举报
回复
而且我现在遇到的情况一般都是没窗体,只有进程,有没有彻底的办法?不管进程里有多少个a.exe都结束,只运行本次的。
ajunajun 2019-06-30
  • 打赏
  • 举报
回复
忘了把unload改为end了,但发现如果上一次有a.exe的窗体能结束进程,但如果没有窗体就不会结束,好像解决的还不够彻底
ajunajun 2019-06-30
  • 打赏
  • 举报
回复
引用 4 楼 milaoshu1020 的回复:
[quote=引用 2 楼 ajunajun 的回复:]
[quote=引用 1 楼 milaoshu1020 的回复:]
既然之前的a.exe是你自己写的,就可以在程序中让它自己退出;
这里给了其中一种解决方式,就是添加一个定时器,定时检查是否有新的实例,如果有就退出:

用您的源程序测试没问题,写到我的程序里怎么就不行,不知道咋回事。。。[/quote]
1.你的定时器间隔是200ms吗?
2.如果是CPU占用高的程序,需要在频繁操作的部分添加DoEvents确保定时器代码会被执行;[/quote]

按照您的方法程序是结束了,但进程里还是有,每次打开a.exe时程序里都会多个进程。。。
现在还是人类 2019-06-29
  • 打赏
  • 举报
回复
Windows中处理这种东西的标准套路是管道通讯,也是进程与进程间通讯的标准套路。 理念很简单,程序启动时,先打开自定义的固有命名管道,然后向命名管道发送一个通知,告诉他让它自己退出进程,然后自己再创建一个相同命名管道的服务,等收到别的程序发来信息,自己就退出程序。 当然,在VB里也有个简化的方式,就是DDE通讯,原理和直接使用命名管道一样。 当然,还有一种思路是和你这个有点区别,第二个进程启动时发信息给第一个进程,然后第一个进程根据信息增加第二个进程的任务,然后第二个进程自己结束自己。 所以判断是否发送信息主要在第二个进程上,判断条件可以用App.PrevInstance来判断是否已经存在相同程序,也可用API来互斥判断。当判断存在相同程序之后,将启动参数 App.Command 发送给之前的进程,然后Exit 就搞定了。这样做相对更加安全稳定。
milaoshu1020 2019-06-29
  • 打赏
  • 举报
回复
引用 2 楼 ajunajun 的回复:
[quote=引用 1 楼 milaoshu1020 的回复:]
既然之前的a.exe是你自己写的,就可以在程序中让它自己退出;
这里给了其中一种解决方式,就是添加一个定时器,定时检查是否有新的实例,如果有就退出:

用您的源程序测试没问题,写到我的程序里怎么就不行,不知道咋回事。。。[/quote]
1.你的定时器间隔是200ms吗?
2.如果是CPU占用高的程序,需要在频繁操作的部分添加DoEvents确保定时器代码会被执行;
舉杯邀明月 2019-06-29
  • 打赏
  • 举报
回复
本来这段时间都没答题了……既然楼主邀请到我,那就简单说下……
我有三个方案: 

1. 通过“消息”方式。
  在进程启动时,检查进程列表中是否有进程实例。
  如果有,给“前一进程”发消息,让其退出即可。

2. 通过“双进程”方式处理。
  当“用户”启动进程a时,由进程a启动“另一进程”b;
  而“进程b”的任务就是:Kill掉“所有的进程a”、然后再重新启动进程a。

3. 在进程启动时,检查系统中“正在运行”的进程列表,
  把“其它同名进程”强制Kill掉(当然理论上最多只有1个“其它同名进程”了)。


 上面的3个方案中:
方案1属于“正规流程”,容易保证“安全操作”;
  缺点是如果前一进程已经“死锁”就不行了。
方案2和3都属于“暴力操作”,都是可以“肯定达成目标”的;
  不过可能在某些特殊场合下,不适合用“暴力”,这时就别轻易用了。
如果要“两全齐美”,可以用“1+[2或3]”的形式:
  如果“温柔操作”在一定时间内(比如3秒钟、或10秒钟等),前一进程没有结束,
 那就给它来个暴力的(此时只有用暴力了,别无选择)……

乍看之下,大家可能会觉得“方案2”的逻辑是不是有点问题……
 那不是成了“a启动b、b又启动a”的死循环了吗!
呵呵,其实……这就要从“命令行参数”来识别了:
 在b进程中用“代码”启动a进程时,给它传递一个特定的“命令行参数”;
 而“进程a”在启动时,则先检测命令行参数:
若是自己设定的特定参数,就进入“正常执行”流程;否则就启动进程b。
如果你把“特定参数”设置得复杂点,那么一般是难以“人为冒充进程b”的。
在“双击运行”时:命令行参数是“空串”;
而“用户”通过其它手段启动时,他不一定知晓你的“特定参数”是什么。
若要“真正防贼”,那也有“足够复杂”的手段来杜绝“李鬼”。

我就简单的说下“理论方法”,代码就不写了。
具体看楼主的需求,自己去实现吧。
ajunajun 2019-06-29
  • 打赏
  • 举报
回复
引用 1 楼 milaoshu1020 的回复:
既然之前的a.exe是你自己写的,就可以在程序中让它自己退出;
这里给了其中一种解决方式,就是添加一个定时器,定时检查是否有新的实例,如果有就退出:

用您的源程序测试没问题,写到我的程序里怎么就不行,不知道咋回事。。。
milaoshu1020 2019-06-29
  • 打赏
  • 举报
回复
既然之前的a.exe是你自己写的,就可以在程序中让它自己退出;
这里给了其中一种解决方式,就是添加一个定时器,定时检查是否有新的实例,如果有就退出:

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Private Sub Form_Load()
SaveSetting App.EXEName, "section", "new", True
Sleep 1000
SaveSetting App.EXEName, "section", "new", False
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
If GetSetting(App.EXEName, "section", "new", False) = True Then
'End 也可以,这里退出程序;
Unload Me
End If
End Sub

下载地址:
链接:https://pan.baidu.com/s/1O1ovVPn80HlLqhyfA06PGg
提取码:fi87

7,785

社区成员

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

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