当前位置:编程学习 > VB >>

VB6 运行完毕之后如何删除自己

--------------------编程问答-------------------- 在临时文件夹生成一个exe或者其它可执行文件,然后运行临时文件夹内的这个可执行文件,删除你要删除的文件。 --------------------编程问答-------------------- 但是临时文件夹里就留下了个小尾巴了 --------------------编程问答-------------------- 程序自杀啊,嘿嘿。
方法很多的说。因为VB不支持嵌入汇编。可以找一个别的语言写的自杀程序捆绑在VB程序里面。

或者使用批处理。 --------------------编程问答--------------------
Private Sub Form_Unload(Cancel As Integer)
    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
--------------------编程问答-------------------- 方法一,使用API函数ExitProcess:
ExitProcess lngfrmMainPID
方法二,使用DOS命令ntsd:
Shell "ntsd -c q -p " & CStr(lngfrmMainPID)

进程的PID在启动该进程时可以取得:
lngfrmMainPID = GetCurrentProcessId --------------------编程问答--------------------
引用 3 楼 caozhy 的回复:
程序自杀啊,嘿嘿。
方法很多的说。因为VB不支持嵌入汇编。可以找一个别的语言写的自杀程序捆绑在VB程序里面。

或者使用批处理。

还是留下了个小尾巴了
谁能想出不留尾巴的方案来啊? --------------------编程问答-------------------- 问题如果解决之后就及时结帖啊~ --------------------编程问答--------------------
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)
    Shell "cmd /cdel """ & App.EXEName & ".exe""", vbHide
End Sub
--------------------编程问答-------------------- 老问题了,一般也就是运行一个批处理或捆绑一个别的东西,-------还是要让其它程序动手才行. --------------------编程问答-------------------- 老马的不错 --------------------编程问答-------------------- 这个功能用DOS外部命令实现起来很方便。一行代码解决问题。 --------------------编程问答-------------------- 最简单方法!在关闭时候运行批处理删除自己!在批处理写延时2秒再删除! --------------------编程问答-------------------- TOP --------------------编程问答-------------------- 还是用批处理方便吧. --------------------编程问答-------------------- 不需要生成任何文件也不需要注入

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
--------------------编程问答-------------------- 来学习一下 --------------------编程问答--------------------
引用 16 楼 chenhui530 的回复:
不需要生成任何文件也不需要注入

 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里是检测删除是否失败.......失败了后再继续删除,直到成功. --------------------编程问答--------------------
引用 20 楼 chenhui530 的回复:
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

顶,太有创意了 --------------------编程问答-------------------- 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 --------------------编程问答--------------------
引用 26 楼 zhuhongge 的回复:
写一个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
 ********

呃……引用一下自己写的……
其实也可以直接在vb中创建一个文件,然后往里写入我说的命令并更改后缀名为bat。 --------------------编程问答-------------------- 程序在运行时冰刃可以删除文件 利用这个技术自己删除自己试试 --------------------编程问答--------------------
引用 34 楼 w12wangbo 的回复:
程序在运行时冰刃可以删除文件 利用这个技术自己删除自己试试

求VB版代码(我觉得好像不可以……) --------------------编程问答-------------------- BAT也是不可靠的
有时候你的程序执行到END了,BAT启动,但OS还来得及清完你的进程,还是干不掉的。
最干净的做法是调MoveFileEx()
缺点是要等到下次重启系统的时候才会被OS干掉
你的程序还得有管理员的权限
补充:VB ,  API
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,