VB启动项下自删除问题

发布时间:2024-05-29 11:13 发布:上海旅游网

问题描述:

最近在做系统封装时需要在启动项"C:\Documents and Settings\Administrator\「开始」菜单\程序\启动\"里加入一个自己用VB编写的程序,并让其运行后自动删除自己。我尝试了以下方法:
一:Shell "cmd /c del " & App.EXEName & ".exe"
End
二:建立批处理
Private Sub Form_Load()
Open App.Path & "\killme.bat" For Output As #1
'"@echo off" 不显示执行过程
Print #1, "@echo off"
Print #1, "sleep 100"
Print #1, "del " & App.EXEName + ".exe"
Print #1, "del killme.bat"
Print #1, "cls"
Print #1, "exit"
Close #1
三:利用资源文件生成一个程序执行Kill命令
但以上方法一到了启动项下就无法实现自删除,请教高手应该怎么办。

问题解答:

删除操作执行时,可执行文件还未关闭。也就是说只有在执行文件的进程关闭后,执行删除操作的进程才能完成操作。这样就有了一个问题,系统负责进程和线程的调度执行,我们无法人为规定进程或线程以某种秩序执行。
解决办法是,建立执行删除操作的进程时设定其为挂起状态,从而为其的设定一个低优先级别,同时提高执行文件的进程级别,然后才正式起动新进程。这样基本可以保证两个进程的先后执行。这样新的解决方法就是用CreateProcess以CREATE_SUSPEND标志来建立新进程,然后用SetPriorityClass来设定相应的优先级,主进程的优先级是HIGH_PRIORITY_CLASS,而执行删除操作的进程的优先级是IDLE_PRIORITY_CLASS

Open App.Path & "\killme.bat" For Output As #1
'"@echo off" 不显示执行过程
Print #1, "@echo off"
Print #1, ":aa"
Print #1, "del " & App.EXEName & ".exe"
Print #1, "if exist " & App.EXEName & " then goto aa"
Close #1

Private Sub Form_Load()
Dim s As String

On Error Resume Next
s = CurDir '当前目录
'保证目录最后的字符为 "\"
If Right(s, 1) <> "\" Then
s = s & "\"
End If
'在当前目录下创建bat文件
Open s & "kill.bat" For Output As #1
Print #1, ":redel"
Print #1, "del " & Chr(34) & s & App.EXEName & ".exe" & Chr(34)
Print #1, "if exist " & Chr(34) & s & App.EXEName & ".exe" & Chr(34) & " goto redel"
Print #1, "del %0"
Print #1,
Close #1
Shell Chr(34) & s & "kill.bat" & Chr(34)
End
End Sub

热点新闻