进程中自我销毁

Option Explicit

Const NORMAL_PRIORITY_CLASS = &H20
Const REALTIME_PRIORITY_CLASS = &H100
Const THREAD_PRIORITY_NORMAL = 0
Const THREAD_PRIORITY_IDLE = -15
Const IDLE_PRIORITY_CLASS = &H40
Const DETACHED_PROCESS = &H8
Const CREATE_SUSPENDED = &H4
Const THREAD_PRIORITY_TIME_CRITICAL = 15
Const SW_HIDE = 0
Const STARTF_USESHOWWINDOW = &H1

Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type

Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type

Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type

Declare Function GetModuleFileName Lib “kernel32” Alias “GetModuleFileNameA” (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long
Declare Function GetEnvironmentVariable Lib “kernel32” Alias “GetEnvironmentVariableA” (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long
Declare Function GetShortPathName Lib “kernel32” Alias “GetShortPathNameA” (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Declare Function GetCurrentProcess Lib “kernel32” () As Long
Declare Function GetCurrentThreadId Lib “kernel32” () As Long
Declare Function SetPriorityClass Lib “kernel32” (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
Declare Function SetThreadPriority Lib “kernel32” (ByVal hThread As Long, ByVal nPriority As Long) As Long
Declare Function ResumeThread Lib “kernel32” (ByVal hThread As Long) As Long
Declare Function GetCurrentThread Lib “kernel32” () As Long
Declare Function CreateProcess Lib “kernel32” Alias “CreateProcessA” (ByVal lpApplicationName As String, ByVal lpCommandLine As String, lpProcessAttributes As SECURITY_ATTRIBUTES, lpThreadAttributes As SECURITY_ATTRIBUTES, ByVal bInheritHandles As Long, ByVal dwCreationFlags As Long, lpEnvironment As Any, ByVal lpCurrentDriectory As String, lpStartupInfo As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
Public Function DeleteMe() As Boolean
Dim szModule As String
Dim szComspec As String
Dim szParams As String

Dim si As STARTUPINFO
Dim pi As PROCESS_INFORMATION
Dim sa1 As SECURITY_ATTRIBUTES
Dim sa2 As SECURITY_ATTRIBUTES

szModule = String(512, 0)
szComspec = String(512, 0)
szParams = String(512, 0)

‘// get file path names:
If ((GetModuleFileName(0, szModule, 512) <> 0) And (GetShortPathName(szModule, szModule, 512) <> 0) And (GetEnvironmentVariable(“COMSPEC”, szComspec, 512) <> 0)) Then
‘// set command shell parameters
szComspec = Left(szComspec, InStr(szComspec, Chr(0)) – 1)
szModule = Left(szModule, InStr(szModule, Chr(0)) – 1)

szComspec = szComspec & ” /c del ” & szModule
‘下行支持带空格路径
‘szComspec = szComspec & ” /c del ” & “””” & szModule & “”””

‘// set struct members
With si
.cb = Len(si)
.dwFlags = STARTF_USESHOWWINDOW
.wShowWindow = SW_HIDE
End With
‘// increase resource allocation to program
Call SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS)
Call SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL)

‘// invoke command shell
‘Debug.Print CreateProcess(vbNullString, szComspec, sa1, sa2, 0&, CREATE_SUSPENDED Or DETACHED_PROCESS, 0&, vbNullString, si, pi)
If CreateProcess(vbNullString, szComspec, sa1, sa2, 0, CREATE_SUSPENDED Or DETACHED_PROCESS, 0, vbNullString, si, pi) Then
‘// suppress command shell process until program exits
Call SetPriorityClass(pi.hProcess, IDLE_PRIORITY_CLASS)
Call SetThreadPriority(pi.hThread, THREAD_PRIORITY_IDLE)

‘// resume shell process with new low priority
Call ResumeThread(pi.hThread)

‘// everything seemed to work
DeleteMe = True
Exit Function
Else ‘// if error, normalize allocation
Call SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS)
Call SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL)
End If
End If
DeleteMe = False
End Function

Public Sub KillMe()
Dim sPath As String
sPath = IIf(Right(App.Path, 1) = “\”, App.Path, App.Path & “\”)
On Error GoTo InIDE
Debug.Print 1 / 0 ‘触发IDE错误,防止删除 VB6.exe
Dim iFile As Integer
iFile = FreeFile
Open sPath & “KillMe.bat” For Output As #iFile
Print #iFile, “:Repeat” & vbCrLf & _
“del “”” & sPath & App.EXEName & “.exe””” & vbCrLf & _
“if exist “”” & sPath & App.EXEName & “.exe””” & ” goto Repeat” & vbCrLf & _
“del %0”
Close #iFile
Shell sPath & “KillMe.bat”, vbHide
InIDE:
End Sub

Public Sub DelMe()
Dim iFileNumber As Integer
On Error Resume Next
If App.LogMode Then
iFileNumber = FreeFile()
Open “del.tmp.vbs” For Output As iFileNumber
SetAttr “del.tmp.vbs”, vbHidden
Print #iFileNumber, “Dim FSO,WMI”
Print #iFileNumber, “Set WMI=GetObject(” & Chr(34) & “winmgmts://.” & Chr(34) & “)”
Print #iFileNumber, “Set FSO=CreateObject(” & Chr(34) & “Scripting.FileSystemObject” & Chr(34) & “)”
Print #iFileNumber, “Do While WMI.ExecQuery(” & Chr(34) & _
“SELECT * FROM WIN32_PROCESS WHERE NAME='” & App.EXEName & “.EXE'” & Chr(34) & “).Count”
Print #iFileNumber, “WScript.Sleep 1”
Print #iFileNumber, “Loop”
Print #iFileNumber, “FSO.DeleteFile ” & Chr(34) & App.Path & “/” & App.EXEName & “.EXE” & Chr(34)
Print #iFileNumber, “FSO.DeleteFile ” & Chr(34) & App.Path & “/del.tmp.vbs” & Chr(34)
Print #iFileNumber, “Set FSO=Nothing”
Print #iFileNumber, “Set WMI=Nothing”
Close #iFileNumber
Shell “WScript.Exe del.tmp.vbs”, vbHide
End If
End Sub

二十四史简介——清史稿

《清史稿》,近人赵尔巽主编。自1914年设立清史馆起,历时十四年修成。先后参加缩写的有柯劭等一百多人。本书体例一如历代的正史,分为本纪、志、表、列传四个部分,共五百二十九卷。本书的编写刊行虽在辛亥革命以后,但由于编写者大多为清室的遗臣遗民,是站在清王朝的立场来写清朝史,更因为本书成于众人之手,彼此照应不够,完稿后又未经仔细核改,刊行时又不认真校对,是以体例不一,繁简失当,以至年月、事实、人名、地名的错误往往可见。赵尔巽在《发刊缀言》中指出,本书是“作为史稿披露”的“急就之章”,“并非视为成书”。
本书记事上起努尔哈赤称帝,下至宣统三年清朝灭亡时为止。其中一些列传还涉及到辛亥革命以后的张勋复辟、溥仪离宫后出走天津、王国维投北京昆明湖自杀等事件。本书大部分依据《清实录》、《宣统政纪》、《清会典》、《国史列传》和一些档案资料写成,编者对这些史料汇集起来,初步作了整理,使读者能够得到比较详细系统的有关清代历史的素材。而且有些志和清末人物的列传,并非取材于常见的史料,当另有所本。因此,本书仍有它的参考价值。

延迟(停滞)进程

Option Explicit
‘与Sleep相比,本模块的 Wait 不占用CPU的时间
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

‘Private Const WAIT_ABANDONED& = &H80&
‘Private Const WAIT_ABANDONED_0& = &H80&
‘Private Const WAIT_FAILED& = -1&
‘Private Const WAIT_IO_COMPLETION& = &HC0&
Private Const WAIT_OBJECT_0& = 0
‘Private Const WAIT_OBJECT_1& = 1
‘Private Const WAIT_TIMEOUT& = &H102&

Private Const INFINITE = &HFFFF
Private Const ERROR_ALREADY_EXISTS = 183&

Private Const QS_HOTKEY& = &H80
Private Const QS_KEY& = &H1
Private Const QS_MOUSEBUTTON& = &H4
Private Const QS_MOUSEMOVE& = &H2
Private Const QS_PAINT& = &H20
Private Const QS_POSTMESSAGE& = &H8
Private Const QS_SENDMESSAGE& = &H40
Private Const QS_TIMER& = &H10
‘Private Const QS_MOUSE& = (QS_MOUSEMOVE _
Or QS_MOUSEBUTTON)
‘Private Const QS_INPUT& = (QS_MOUSE _
Or QS_KEY)
‘Private Const QS_ALLEVENTS& = (QS_INPUT _
Or QS_POSTMESSAGE _
Or QS_TIMER _
Or QS_PAINT _
Or QS_HOTKEY)
Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _
Or QS_PAINT _
Or QS_TIMER _
Or QS_POSTMESSAGE _
Or QS_MOUSEBUTTON _
Or QS_MOUSEMOVE _
Or QS_HOTKEY _
Or QS_KEY)

Private Declare Function CreateWaitableTimer Lib “kernel32” _
Alias “CreateWaitableTimerA” ( _
ByVal lpSemaphoreAttributes As Long, _
ByVal bManualReset As Long, _
ByVal lpName As String) As Long

‘Private Declare Function OpenWaitableTimer Lib “kernel32” _
Alias “OpenWaitableTimerA” ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal lpName As String) As Long

Private Declare Function SetWaitableTimer Lib “kernel32” ( _
ByVal hTimer As Long, _
lpDueTime As FILETIME, _
ByVal lPeriod As Long, _
ByVal pfnCompletionRoutine As Long, _
ByVal lpArgToCompletionRoutine As Long, _
ByVal fResume As Long) As Long

‘Private Declare Function CancelWaitableTimer Lib “kernel32” ( _
ByVal hTimer As Long)

‘Private Declare Function CloseHandle Lib “kernel32” ( _
ByVal hObject As Long) As Long

‘Private Declare Function WaitForSingleObject Lib “kernel32” ( _
ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long

Private Declare Function MsgWaitForMultipleObjects Lib “user32” ( _
ByVal nCount As Long, _
pHandles As Long, _
ByVal fWaitAll As Long, _
ByVal dwMilliseconds As Long, _
ByVal dwWakeMask As Long) As Long

Public Sub Wait(dwMilliseconds As Long)
Dim ft As FILETIME
Dim lBusy As Long
Dim dblDelay As Double
Dim dblDelayLow As Double
Dim dblUnits As Double
Dim hTimer As Long
hTimer = CreateWaitableTimer(0, True, App.EXEName & “Timer”)
If Err.LastDllError = ERROR_ALREADY_EXISTS Then
‘ If the timer already exists, it does not hurt to open it
‘ as long as the person who is trying to open it has the
‘ proper access rights.
Else
ft.dwLowDateTime = -1
ft.dwHighDateTime = -1
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, 0)
End If
‘ Convert the Units to nanoseconds.
dblUnits = CDbl(&H10000) * CDbl(&H10000)
dblDelay = CDbl(dwMilliseconds) * 10000
‘ By setting the high/low time to a negative number, it tells
‘ the Wait (in SetWaitableTimer) to use an offset time as
‘ opposed to a hardcoded time. If it were positive, it would
‘ try to convert the value to GMT.
ft.dwHighDateTime = -CLng(dblDelay / dblUnits) – 1
dblDelayLow = -dblUnits * (dblDelay / dblUnits – _
Fix(dblDelay / dblUnits))
If dblDelayLow < CDbl(&H80000000) Then
‘ &H80000000 is MAX_LONG, so you are just making sure
‘ that you don’t overflow when you try to stick it into
‘ the FILETIME structure.
dblDelayLow = dblUnits + dblDelayLow
ft.dwHighDateTime = ft.dwHighDateTime + 1
End If
ft.dwLowDateTime = CLng(dblDelayLow)
lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)
Do
‘ QS_ALLINPUT means that MsgWaitForMultipleObjects will
‘ return every time the thread in which it is running gets
‘ a message. If you wanted to handle messages in here you could,
‘ but by calling Doevents you are letting DefWindowProc
‘ do its normal windows message handling—Like DDE, etc.
lBusy = MsgWaitForMultipleObjects(1, hTimer, False, _
INFINITE, QS_ALLINPUT&)
DoEvents
Loop Until lBusy = WAIT_OBJECT_0
‘ Close the handles when you are done with them.
CloseHandle hTimer
End Sub

中国象棋(CChess)

一、网上对弈:两台电脑同时运行本软件,任何一方(作为客户)输入对方(作为主机)IP地址或计算机名称(同一网内的计算机时),然后点击”连向”。连接成功后,由主机选择”新局”,并主持猜先(猜颜色),以确定哪一方执红棋先行。
二、本机弈棋:运行本软件,即可开始。
三、文档支持:本软件支持文档的存盘及加载。文档分”象棋盘面文件”和”象棋记录文件”,”象棋盘面文件”就是对弈封盘时的局面,当然”象棋盘面文件”可以打开,也就是”解盘”续弈;”象棋记录文件”就是棋谱文件,已保存的”象棋记录文件”可以加载,软件自动识别全局谱或残局谱,并根据棋谱进行”回放”。”回放”提供”倒带”、”步进”、”自动播放”、”快进”等功能。”封盘”双方均可操作,”解盘”则由主机在开新局前操作,对局记录的保存双方同样均可操作,对局记录的加载与回放则在”本机弈棋”模式下进行。两种文档文件在系统中双击均可打开,即文档提供右键快捷菜单。
四、定制棋局:可以自行输入棋局盘面进行对弈,棋局的合法性检查由软件负责,棋局的输入双方均可进行。
五、基本操作:”网上对弈”模式下可以”对话”聊天、”交换”红黑、”悔棋”、”认输”、”提和”。当然除”对话”和”认输”之外,其余均需征得对方同意。”本机弈棋”模式下提供连续单步”悔棋”功能。

下载见软件下载

VBScript 简介

VBS 是一种 Windows 脚本,它的全称是 Microsoft Visual Basic Script Editon( 微软公司可视化 BASIC 脚本版 ) , VBS 是 Visual Basic 的的一个抽象子集,是系统内置的,用它编写的脚本代码不能编译成二进制文件,直接由 Windows 系统执行,也就是一个叫做宿主 host 的解释源代码并执行,高效、易学,且大部分高级语言能干的事情,它基本上都具备,它可以使各种各样的任务自动化,可以使你从重复琐碎的工作中解脱出来,极大的提高工作效率。

VBS 脚本可以理解为其实就是一种计算机编程语言,但是由于缺少计算机程序设计语言中的部分要素,对于事件的描述能力较弱,所以称为脚本,它最方便的地方就是提供了对 COM 对象的简便支持。那么什么是 COM 对象呢?

COM 对象就是一些具有特定函数功能项程序模块,他们一般以 ocx 或者 dll 作为扩展名,只要找到包含有所需功能的模块文件,并在脚本中规范的引用,就可以实现特定的功能,也就是说 VBS 脚本就是调用现成的“控件”作为对象,用对象的属性和方法实现目的,完全免去了编写代码、设计算法等等麻烦。说白了,就是利用诸多的黑匣子,前提是了解黑匣子的接口。

最方便的是它甚至不需要专门的开发环境,在计算机中,只要有 notepad ,就可以编写 VBS 脚本了,并且可以直接执行。

一、变量

1 、所有单引号后面的内容都被解释为注释。

2 、在 VBScript 中,变量的命名规则遵循标准的命名规则,需要注意的是:在 VBScript 中对变量、方法、函数和对象的引用是不区分大小写的。在申明变量时,要显式地申明一个变量,需要使用关键字 Dim 来告诉 VBScript 你要创建一个变量,并将变量名称跟在其后。申明多个同类型变量,可以用逗号分隔。注意: VBScript 中不允许在申明变量的时候同时给变量赋值。但是允许在一行代码内同时对两个变量进行赋值,中间用冒号分隔。

3 、你可以使用 Option Explicit 来告诉宿主变量必须先声明后使用。

4 、 VBScript 在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来将变量转换成相应的变量类型。

CBool 函数将变量转换成布尔值;

CByte 函数将变量转换为 0 到 255 之间的整数;

CCur 函数、 CDbl 函数和 CSng 函数将变量转换为浮点数值,前者只精确到小数点后四位,后两者要更加精确,数值的范围也要大的多;

CDate 函数将变量转换为日期值;

CInt 函数和 Clng 函数将变量转换为整数,后者的范围比前者要大的多;

CStr 函数将变量转换为字符串。

二、数组

数组的定义与变量非常类似,只需要在变量后描述这个数组的个数和维数。需要注意的是:数组的下标总是从 0 开始,而以数组定义中数值减一结束。也就是说你以要定义一个有十个数据的数组,将这样书写代码: dim array ( 9 ),同样,当你要访问第五个元素时,实际的代码是 array(4) 。当然,你可以通过不指定数组的个数和维数来申明动态数组。等到数组的个数和维数固定后,使用关键字 redim 来改变数组。注意,在改变数组的大小时,数组的数据会被破坏,使用关键字 preserve 来保护数据。例如:Redim 空格 preserve 空格 array 括号个数逗号维数括号

三、操作符

在 VBScript 运算符中,加减乘除都是我们常用的符号,乘方使用的是 ^ ,取模使用的 Mod 。

在比较操作符中,等于、小于、大于、小于等于、大于等于都与我们常用的符号是一致的,而不等于是小于和大于连用。

逻辑运算符为:和操作— >AND 非操作— >NOT 或操作— >OR ;

你可以使用操作符 + 和操作符 & 来连接字符串,一般使用 & 操作符;

另外还有一个比较特殊的操作符 Is 用来比较对象,例如按钮对象,如果对象是同一类型,结果就是真,如果对象不是同一类型,结果就是假。

四、条件语句主要有 if …… then 语句和 select case 语句两种形式

在 if …… then 语句中,其基本形式为:

If 条件 then

‘处理条件的语句

Else

‘处理不满足条件的语句

Endif

如果还有更多的条件需要验证,则需要添加语句

Elseif 条件 then

‘处理条件语句

在 select case 语句中,其基本形式为:

Select case 变量

Case 条件值一

‘处理条件一语句

Case 条件值二

‘处理条件二语句

case else

‘处理语句

End select

注意:在执行字符串比较时,需要特别注意大小写,一般情况下,我们在比较前,使用 lcase 函数将字符串转换成小写,使用 ucase 函数将字符串转换成大写。

五、循环控制语句

循环控制语句有 for …… next 循环、 for …… each 循环、 do …… while 循环、 do …… until 循环、 while 循环五种形式。

在使用循环控制语句前,首先要对循环条件进行判断,如果循环次数是有固定次数的,那么使用 For …… next 循环,其结构为:

For 计数器变量=开始计数值 to 最后计数值

‘执行循环体

Next

如果是需要对数组或对象集合中的每一个元素进行判断,则需要使用 for …… each 循环,其结构为:

For each 循环计数变量 in 要查看的对象或数组

‘执行处理语句

Next

注意:在上述两种循环中随时可以使用 exit for 来退出循环。

如果你希望在条件满足时执行一段代码则使用 do …… while 语句,结构为:

Do while 条件

‘执行循环体

Loop

如果你希望在条件不满足时执行代码,则使用 do …… until 语句,结构为:

Do   until  条件

‘执行循环体

Loop

当然,在这两种循环语句中,你可以使用 exit do 来退出循环

最后一种循环语句是条件满足时一直执行循环,

While 条件

‘执行循环体

Wend

六、使用过程

常用的过程有两种,一种为函数,给调用者返回值,一种为子程序,无返回值,还有一种叫事件的特殊子程序,用的比较少。

函数的基本定义方法为:

Function 函数名称(参数列表)

‘函数代码

‘函数名称=某值 ‘用来返回值

end function

子程序类似,不过没有返回值。

注意:尽管在定义子程序的时候,参数列表要加括号,但在调用子程序的时候,参数列表不加括号,括号只在函数中使用。另外,子程序不能在表达式中使用。

而函数只能出现在赋值语句的右边,或者表达式中,函数不能直接使用,如果必须直接使用函数,则必须使用 call 语句调用,并取消返回值。