VB6 运行完毕之后如何删除自己
--------------------编程问答-------------------- 在临时文件夹生成一个exe或者其它可执行文件,然后运行临时文件夹内的这个可执行文件,删除你要删除的文件。 --------------------编程问答-------------------- 但是临时文件夹里就留下了个小尾巴了 --------------------编程问答-------------------- 程序自杀啊,嘿嘿。方法很多的说。因为VB不支持嵌入汇编。可以找一个别的语言写的自杀程序捆绑在VB程序里面。
或者使用批处理。 --------------------编程问答--------------------
Private Sub Form_Unload(Cancel As Integer)--------------------编程问答-------------------- 方法一,使用API函数ExitProcess:
With CreateObject("Scripting.FileSystemObject").CreateTextFile("a.vbs", True)
.WriteLine "With CreateObject(""Scripting.FileSystemObject"")"
.WriteLine " .DeleteFile WSH.ScriptFullName"
.WriteLine " .DeleteFile """ & App.Path & "\" & App.EXEName & ".exe"""
.WriteLine "End With"
End With
CreateObject("WScript.Shell").Run "a.vbs", 0
End Sub
ExitProcess lngfrmMainPID
方法二,使用DOS命令ntsd:
Shell "ntsd -c q -p " & CStr(lngfrmMainPID)
进程的PID在启动该进程时可以取得:
lngfrmMainPID = GetCurrentProcessId --------------------编程问答--------------------
还是留下了个小尾巴了
谁能想出不留尾巴的方案来啊? --------------------编程问答-------------------- 问题如果解决之后就及时结帖啊~ --------------------编程问答--------------------
Option Explicit
'*************************************************************************
'**模 块 名:ModKillMe
'**说 明:自杀模块(使用BAT文件法)
'**创 建 人:嗷嗷叫的老马
'**日 期:2003年11月17日
'**描 述:千万不要在IDE里调用本函数,不然会删除VB6.EXE
'**版 本:V1.0
'*************************************************************************
Public Sub KillMe()
Dim mPath As String
On Error GoTo InIDE
Debug.Print 1 / 0 '触发IDE错误,上个保险算了
If Right$(App.Path, 1) = "\" Then
mPath = App.Path
Else
mPath = App.Path & "\"
End If
Open mPath & "Demon.bat" For Output As #1
Print #1, ":Repeat" & vbCrLf & _
"del """ & mPath & App.EXEName & ".exe""" & vbCrLf & _
"if exist """ & mPath & App.EXEName & ".exe""" & " goto Repeat" & vbCrLf & _
"del %0"
Close #1
Shell mPath & "Demon.bat", vbHide
InIDE:
End Sub
BAT大法.
既然是在用VB6编程,那就没必要整得太复杂.
太复杂了,还用VB6干嘛..........
退出前调用这个BAT,会将自己删除干净. --------------------编程问答--------------------
Private Sub Form_Unload(Cancel As Integer)--------------------编程问答-------------------- 老问题了,一般也就是运行一个批处理或捆绑一个别的东西,-------还是要让其它程序动手才行. --------------------编程问答-------------------- 老马的不错 --------------------编程问答-------------------- 这个功能用DOS外部命令实现起来很方便。一行代码解决问题。 --------------------编程问答-------------------- 最简单方法!在关闭时候运行批处理删除自己!在批处理写延时2秒再删除! --------------------编程问答-------------------- TOP --------------------编程问答-------------------- 还是用批处理方便吧. --------------------编程问答-------------------- 不需要生成任何文件也不需要注入
Shell "cmd /cdel """ & App.EXEName & ".exe""", vbHide
End Sub
Option Explicit
Dim strTmp As String
Private Sub Form_Load()
strTmp = App.Path & "\" & App.EXEName & ".exe"
End Sub
Private Sub Form_Terminate()
Shell "cmd /c del /q """ & strTmp & """", vbNormalFocus
End Sub
--------------------编程问答-------------------- 来学习一下 --------------------编程问答--------------------
这个方法,好像不一定行 --------------------编程问答-------------------- 保险一点的话在cmd中做个延迟或检查进程的步骤 然后再杀 --------------------编程问答-------------------- Option Explicit
Dim strTmp As String
Private Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
Private Sub Form_Load()
strTmp = App.Path & "\" & App.EXEName & ".exe"
End Sub
Private Sub Form_Terminate()
WinExec "cmd /c ping 127.0.0.1 -n 2 && del /q """ & strTmp & """", vbHide
End Sub
--------------------编程问答-------------------- 我的那个BAT里是检测删除是否失败.......失败了后再继续删除,直到成功. --------------------编程问答--------------------
顶,太有创意了 --------------------编程问答-------------------- Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
'定義結 構安全類型
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Boolean
End Type
'用于創建文件
Const CONNECT_UPDATE_PROFILE = &H1
Const RESOURCE_GLOBALNET As Long = &H2&
Const RESOURCETYPE_ANY = &H0
Const RESOURCEDISPLAYTYPE_SHARE As Long = &H3&
Const RESOURCEDISPLAYTYPE_SERVER As Long = &H2&
Const RESOURCEDISPLAYTYPE_GROUP As Long = &H5&
Const RESOURCEDISPLAYTYPE_GENERIC As Long = &H0&
Const RESOURCEDISPLAYTYPE_FILE As Long = &H4&
Const RESOURCEDISPLAYTYPE_DOMAIN As Long = &H1&
Const RESOURCEUSAGE_ALL As Long = &H0&
Const ERROR_EXTENDED_ERROR = 1208&
Const RESOURCEUSAGE_CONNECTABLE As Long = &H1&
Const CREATE_NEW = 1
Const GENERIC_ALL = &H10000000
Const GENERIC_EXECUTE = &H20000000
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_ALWAYS = 2
Const OPEN_ALWAYS = 4
Const OPEN_EXISTING = 3
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_COMPRESSED = &H800
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const FILE_FLAG_BACKUP_SEMANTICS = &H2000000
Const FILE_FLAG_DELETE_ON_CLOSE = &H4000000
Const FILE_FLAG_NO_BUFFERING = &H20000000
Const FILE_FLAG_OVERLAPPED = &H40000000
Const FILE_FLAG_POSIX_SEMANTICS = &H1000000
Const FILE_FLAG_RANDOM_ACCESS = &H10000000
Const FILE_FLAG_SEQUENTIAL_SCAN = &H8000000
Const FILE_FLAG_WRITE_THROUGH = &H80000000
Const OFS_MAXPATHNAME = 128
Const OF_CANCEL = &H800
Const OF_CREATE = &H1000
Const OF_DELETE = &H200
Const OF_EXIST = &H4000
Const OF_PARSE = &H100
Const OF_PROMPT = &H2000
Const OF_READ = &H0
Const OF_READWRITE = &H2
Const OF_REOPEN = &H8000
Const OF_SHARE_COMPAT = &H0
Const OF_SHARE_DENY_NONE = &H40
Const OF_SHARE_DENY_READ = &H30
Const OF_SHARE_DENY_WRITE = &H20
Const OF_SHARE_EXCLUSIVE = &H10
Const OF_VERIFY = &H400
Const OF_WRITE = &H1
Private Sub Form_Unload(Cancel As Integer)
'生成bat文件
Dim strMsg As String
Dim strPath As String
strPath = App.Path & IIf(Right(App.Path, 1) = "\", "", "\")
strMsg = "DEL " & strPath & App.EXEName & ".exe"
strMsg = strMsg & vbCrLf
strMsg = strMsg & "del c:\del.bat"
'創建bat文件
Call WriteLog(strMsg, "c:\del.bat")
Shell "c:\del.bat", vbHide
End Sub
'加入日志文件
Sub WriteLog(ByVal lpstrlog As String, ByVal lpFile As String)
Dim hFile As Long
Dim oFile As SECURITY_ATTRIBUTES
Dim strLog As String
'如果文件不存在,則創建文件
If FileExists(lpFile) = False Then
hFile = CreateFile(lpFile, GENERIC_ALL, FILE_SHARE_READ + FILE_SHARE_WRITE, oFile, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0&)
Call CloseHandle(hFile)
End If
'文件存在時,保存信息
If FileExists(lpFile) Then
hFile = FreeFile()
Open lpFile For Append As #hFile
Print #hFile, lpstrlog
Close #hFile
End If
End Sub
Private Function FileExists(ByVal lpFileName As String) As Boolean
Dim lRe As Long
'函數返回值為-1時表示文件不存在
lRe = GetFileAttributes(lpFileName)
FileExists = (lRe <> -1)
End Function
在一個Form中,拷貝上面代碼,編譯可以達到你的要求。我試過可以,你可以優化一下。 --------------------编程问答-------------------- 都别唧唧了,老马正解。 --------------------编程问答-------------------- 那个BAT运行完之后自己都消失的。。以前偶尔对一个软件的批处理发生兴趣时看到的,呵呵呵 --------------------编程问答-------------------- 写一个bat:
***bat***
@echo off
rem 假设程序名是a.exe,批处理文件是b.bat
rem 先把两个保存在同一文件夹下
taskkill /f /im a.exe
del /f /q a.exe
del /f /q b.bat
*********
再在From_Unload里写:
***VB***
shell "cmd.exe " & app.path & "\b.bat",vbHide
******** --------------------编程问答-------------------- Public Sub DelMe()
Dim fn As Integer
On Error Resume Next
If App.LogMode Then
fn = FreeFile()
Open "del.tmp.vbs" For Output As fn
SetAttr "del.tmp.vbs", vbHidden
Print #fn, "Dim FSO,WMI"
Print #fn, "Set WMI=GetObject(" & Chr(34) & "winmgmts:\\." & Chr(34) & ")"
Print #fn, "Set FSO=CreateObject(" & Chr(34) & "Scripting.FileSystemObject" & Chr(34) & ")"
Print #fn, "Do While WMI.ExecQuery(" & Chr(34) & _
"SELECT * FROM WIN32_PROCESS WHERE NAME='" & App.EXEName & ".EXE'" & Chr(34) & ").Count"
Print #fn, "WScript.Sleep 1"
Print #fn, "Loop"
Print #fn, "FSO.DeleteFile " & Chr(34) & App.Path & "\" & App.EXEName & ".EXE" & Chr(34)
Print #fn, "FSO.DeleteFile " & Chr(34) & App.Path & "\del.tmp.vbs" & Chr(34)
Print #fn, "Set FSO=Nothing"
Print #fn, "Set WMI=Nothing"
Close #fn
Shell "WScript.Exe del.tmp.vbs", vbHide
End If
End Sub
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyserver/archive/2009/05/07/4158484.aspx --------------------编程问答-------------------- 如果你的程序不是什么见不得人的怕暴露的话,没必要这么麻烦,你完全可以放一条删除命令在windows注册表里,等下次启动电脑时删除。 --------------------编程问答-------------------- MARK --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 老马的代码收藏了, --------------------编程问答-------------------- #16的我试过,可以的。引用如下:
Option Explicit
Dim strTmp As String
Private Sub Form_Load()
strTmp = App.Path & "\" & App.EXEName & ".exe"
End Sub
Private Sub Form_Terminate()
Shell "cmd /c del /q """ & strTmp & """", vbNormalFocus
End Sub --------------------编程问答--------------------
呃……引用一下自己写的……
其实也可以直接在vb中创建一个文件,然后往里写入我说的命令并更改后缀名为bat。 --------------------编程问答-------------------- 程序在运行时冰刃可以删除文件 利用这个技术自己删除自己试试 --------------------编程问答--------------------
求VB版代码(我觉得好像不可以……) --------------------编程问答-------------------- BAT也是不可靠的
有时候你的程序执行到END了,BAT启动,但OS还来得及清完你的进程,还是干不掉的。
最干净的做法是调MoveFileEx()
缺点是要等到下次重启系统的时候才会被OS干掉
你的程序还得有管理员的权限
补充:VB , API