VB实现可执行文件运行时自删除
有时,为了实现动态更新,我们需要对正处于运行状态的应用程序进行自删除,就像360安全卫士在线升级那样。但是,Windows是不允许删除正处于运行状态的应用程序的,怎么办?一般来说,我们可以使用两个程序来实现,一个专门负责版本检测和删除,一个才是业务需要的主应用程序。能不能将二者合二为一呢?答案是可以的,那就是使用BAT或VBS来进行。使用BAT,由于不能及时判断应用程序是否已经结束,于是人们通过降低其执行优先级别,让其晚于应用程序结束,从而达到删除目的,这种办法有时会造成删除失败,而使用VBS,可以利用Windows内置的COM对象,非常方便地判断应用程序是否结束,从而实现了真正意义上的自删除。不过相对于BAT,VBS也有一些缺点,那就是依赖性较强,而一部分计算机出于安全考虑,屏蔽了WSH功能,从而导致删除失败,从这一点来讲,反倒不及BAT方式了。
本文的实现代码基于VBS,至于使用BAT文件,可以参考张正秋写的《Windows核心编程》一书,俺不再提供实现代码。
'* ******************************************************* *
'* 程序名称:DelMe.bas
'* 程序功能:在VB中实现应用程序自删除
'* 作者:lyserver
'* 联系方式:http://blog.csdn.net/lyserver
'* ******************************************************* *
Sub Main()
Call DelMe
End Sub
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
相关文档:
Option Explicit
Function Delete3(Arr As Variant) As Variant
Dim i As Integer
For i = LBound(Arr) To UBound(Arr)
If i > UBound(Arr) Then Exit For
If Arr(i) = 3 Then
Do
Dim j As Integer
For j = i To UBound(Arr) - 1
......
引言:
做一个控件, 用于 数据采样如示波器, 可以添加,删除曲线, 设置曲线的相关属性: 线型,颜色,等...
过程:
先创建 线 类, 在用户控件里实现 线 对象创建, 并声明一个 集合, 用于 存放建立的线对象.
问题 ......
【函数】
GetFileVersionInfo
【操作系统】
Win9X:Yes
WinNT:Yes
【声明】
GetFileVersionInfo Lib "version.dll" Alias "GetFileVersionInfoA" &n ......
不能直接使用CopyMemoryStr,应该将字符串转为byte数组,然后使用CopyMemory
Property Get item() As String
If h = 0 Then ErrRaise ERROR_INVALID_DATA
'BugAssert p <> pNull
Dim c As Long, ptr0 As Long
Dim ab() As Byte
& ......