<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[tcmcz]]></title>
<link>http://blog.pfan.cn/tcmcz</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[用 INNER JOIN语法联接多个表建记录集&amp;nbsp;]]></title>
		<link>http://blog.pfan.cn/tcmcz/8109.html</link>
		<description><![CDATA[用 INNER JOIN语法联接多个表建记录集

 
多表联接建立记录集是十分有用的，因为某些情况下，我们需要把数字数据类型显示为相应的文本名称，这就遇到了多表联接建立记录集的问题。比如作一个会员注册系统，共有五个表，会员信息数据表member、会员身份表MemberIdentity、会员权限表MemberLevel、会员类别表MemberSort和会员婚姻状况表Wedlock。如果想把会员注册信息全部显示出来，肯定要将这四个表连起来，否则大家看到的某些会员信息可能只是数据编号。&nbsp;&nbsp;&nbsp; 以会员类别表来说，在其数据表中，1代表普通会员，2代表高级会员，3代表终身会员，在显示时，如果不将会员类别表与会员详细数据表相关联，那么假如我们现在看到的是一名普通会员的注册信息，我们只能看到其类别为1，而谁又会知道1代表的是普通会员呢？所以要将会员类别表与会员详细数据表相关联，关联后，1就显示为普通会员，2就显示为高级会员，3就显示为终身会员，这样多好？同理，其它两个表也要与会员详细数据表相关联才能把数据编号显示为相应的名称。&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 前天制作网站后台时遇到此问题，在面包论坛、狂迷俱乐部、蓝色理想、和5D多媒体论坛发了贴子求救，都没有获得答案，只好自己研究，花了两天时间终于成功，现将其写成教程供大家分享，希望大家少走弯路。&nbsp;&nbsp;&nbsp; 本教程是把五个表联在一起，如果愿意，您可以将更多的表联在一起，方法大同小异啦~&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 步骤一：用Access软件建立一个名为Member的数据库，在其中建五个表，分别为：会员信息数据表member、会员身份表MemberIdentity、会员权限表MemberLevel、会员类别表MemberSort和会员婚姻状况表Wedlock。&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ●会员信息数据表member：&nbsp;&nbsp;&nbsp; MemberID：自动编号，主键（ID号）&nbsp;&nbsp;&nbsp; MemberSort：数字（会员类别）&nbsp;&nbsp;&nbsp; MemberName：文本，会员姓]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-12-12 00:01:00</pubDate>
		</item>
				<item>
		<title><![CDATA[精妙SQL语句介绍]]></title>
		<link>http://blog.pfan.cn/tcmcz/8108.html</link>
		<description><![CDATA[精妙SQL语句介绍
如何从一位菜鸟蜕变成为高手，灵活使用的SQL语句是必不可少的。本文收集了部分比较经典，常用的SQL语句供大家参考，希望对大家有所帮助。 　　说明：复制表(只复制结构,源表名：a 新表名：b)　　 　　SQL: select * into b from a where 1&lt;&gt;1 　　说明：拷贝表(拷贝数据,源表名：a 目标表名：b)　　 　　SQL: insert into b(a, b, c) select d,e,f from b; 　　说明：显示文章、提交人和最后回复时间　　 　　SQL: select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b 　　说明：外连接查询(表名1：a 表名2：b)　　 　　SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c 　　说明：日程安排提前五分钟提醒　　 　　SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())&gt;5　　 　　说明：两张关联表，删除主表中已经在副表中没有的信息 　　SQL: 　　 　　delete from info where not exists ( select * from infobz where info.infid=infobz.infid 　　说明：-- 　　SQL: 　　 　　SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE 　　 FROM TABLE1, 　　 (SELECT X.NUM, X.UPD_DATE, Y.UPD_DATE PREV_UPD_DATE 　　 FROM (SELECT NUM, UPD_DATE, INBOUND_QTY, STOCK_ONHAND 　　 FROM TABLE2 　　 WHERE TO_CHAR(UPD_DATE,'YYYY/MM') = TO_CHAR(SYSDATE, 'YYYY/MM')) X, 　　 (SE]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-12-11 22:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[发现拖(Drap)过来的信息]]></title>
		<link>http://blog.pfan.cn/tcmcz/7701.html</link>
		<description><![CDATA[要让您的程序支持从其他程序 (如：资源管理器或浏览器)中拖过来的信息，首先要找到拖过来数据的Format 和组织情况，以下的代码可以让您迈出第一步：设置 FORM 的 OLEDropMode 为自动：Private Sub Form_OLEDragOver(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single, State As Integer)For i = 1 To 255 ' 如果在该范围内没有，可以扩大范围！If Data.GetFormat(i) ThenDebug.Print Data.GetData(i) '数据内容Debug.Print I 'Format 编号End IfNextEnd Sub然后拖几个东东到 FORM 中去。可以发现， 超连接的有关信息 Format 为 1，而文件的 Format 为 15。。。]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-12-02 09:21:00</pubDate>
		</item>
				<item>
		<title><![CDATA[关于天文数字十进制与十六进制间的转换]]></title>
		<link>http://blog.pfan.cn/tcmcz/7084.html</link>
		<description><![CDATA[关于天文数字十进制与十六进制间的转换

 

对于一般的整型数字，16进制与10进制 间的转化可以用CLNG（），HEX（）函数解决，但遇上天文数字，这些函数就无能为力了。下面是笔者写的几个函数，演示了天文数字计算中的一些技巧。
Dim largehex As String, largedec As String, start As Long, Y(20) As String
'预备函数Function sums(ByVal X As String, ByVal Y As String) As String ' sum of two hugehexnum（两个大数之和）Dim max As Long, temp As Long, I As Long, result As Variantmax = IIf(Len(X) &gt;= Len(Y), Len(X), Len(Y))X = Right(String(max, "0") &amp; X, max)Y = Right(String(max, "0") &amp; Y, max)ReDim result(0 To max)For I = max To 1 Step -1result(I) = Val(Mid(X, I, 1)) + Val(Mid(Y, I, 1))NextFor I = max To 1 Step -1temp = result(I) \ 10result(I) = result(I) Mod 10result(I - 1) = result(I - 1) + tempNextIf result(0) = 0 Then result(0) = ""sums = Join(result, "")Erase result
End Function
Function multi(ByVal X As String, ByVal Y As String) As String 'multi of two huge hexnum（两个大数之积）Dim result As VariantDim xl As Long, yl As Long, temp As Long, I As Longxl = Len(Trim(X))yl = Len(Trim(Y))&nbsp;ReDim result(1]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-17 21:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[签名]]></title>
		<link>http://blog.pfan.cn/tcmcz/6755.html</link>
		<description><![CDATA[[img*]http://ip.happybobby.com/sign.png[/img][img*]http://www.hotik.com/sign.png[/img][img*]http://www.u9cn.com/1.php[/img][img*]http://www.u9cn.com/2.php[/img][img*]http://www.u9cn.com/3.php[/img][img*]http://www.u9cn.com/4.php[/img][img*]http://www.cz88.net/ip/pic.aspx[/img][img*]http://www.cz88.net/ip/pic_1.aspx[/img][img*]http://www.cz88.net/ip/pic_2.aspx[/img][img*]http://www.cz88.net/ip/pic_3.aspx[/img][img*]http://www.cz88.net/ip/pic_4.aspx[/img][img*]http://www.cz88.net/ip/pic_5.aspx[/img][img*]http://www.cz88.net/ip/pic_6.aspx[/img][img*]http://www.cz88.net/ip/pic_7.aspx[/img][img*]http://www.cz88.net/ip/pic_8.aspx[/img][img*]http://www.cz88.net/ip/pic_9.aspx[/img][img*]http://www.cz88.net/ip/pic_11.aspx[/img][img*]http://www.cz88.net/ip/pic_12.aspx[/img][img*]http://www.cz88.net/ip/pic_13.aspx[/img][img*]http://www.cz88.net/ip/pic_14.aspx[/img]]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-11 01:44:00</pubDate>
		</item>
				<item>
		<title><![CDATA[Win XP的另类重启技巧]]></title>
		<link>http://blog.pfan.cn/tcmcz/6576.html</link>
		<description><![CDATA[Win XP的另类重启技巧








&nbsp;

&nbsp;&nbsp;&nbsp; 当您的计算机死机、停止响应等，您不得不用“Reset”或“Ctrl+Alt+Del”重新启动来解决问题，如果您觉得这样还很麻烦的话，可以考虑用下面的方法来让计算机自动重启。 　　1、系统死锁时自动重启 　　单击“开始→运行”，键入“REGEDIT”并回车，打开注册表编辑器，找到并展开[HKEY_LOCAL_MACHINESystemCurrentControlSet&nbsp;CrashControl&nbsp;]分支，在右侧窗口中找到“AutoReboot”(如果没有，我们可以新建一个)键，将其值修改为“1”。退出注册表编辑器并重新启动一次计算机，以后系统死机时就会自动重启。 　　2、“资源管理器”崩溃时自动重启 　　我们还可以在“资源管理器”崩溃(桌面图标、任务栏无法显示，鼠标消失，不能使用Alt+Tab组合键切换窗口等等)时，让计算机自动重启。 　　打开注册表编辑器，依次展开[HKEY_LOCAL_MACHINESoftwareMicrosoftWindows&nbsp;NTCurrentVersionWinlogon&nbsp;]分支，在右侧窗口找到“AutoRestartShell”(如果没有，我们可以新建一个)键，将其值修改为“1”。重新启动计算机设置即生效。]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-02 18:09:00</pubDate>
		</item>
				<item>
		<title><![CDATA[WinXP提速技巧五则]]></title>
		<link>http://blog.pfan.cn/tcmcz/6575.html</link>
		<description><![CDATA[WinXP提速技巧五则







&nbsp;

&nbsp;&nbsp;&nbsp; Windows&nbsp;XP现在已经相当普及了，在使用它的过程中，你是否感觉在速度上很多地方还没有Windows&nbsp;9x系统快呢？比如访问网上邻居、开机关机等，下面我们就来逐个提升它们的速度。&nbsp; &nbsp;&nbsp;&nbsp; 1、加速网上邻居&nbsp; 　　在Windows&nbsp;XP中访问网上邻居是相当恼人的，系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务，然后才显示出来，显然这样速度就会比Windows&nbsp;9x中慢很多。其实这些功能我们并没有使用上，与其不用还不如删除它们，这样速度就会明显加快。打开注册表编辑器，找到HKEY_LOCAL_MACHINE/sofeware/Microsoft/Windows/CurrentVersion/ Explore/RemoteComputer/NameSpace，删除其下的{2227A280-3AEA-1069-A2DE08002B30309D}（打印机）和{D6277990-4C6A-11CF8D87-&nbsp;00AA0060F5BF}（计划任务），重新启动电脑，再次访问网上邻居，你会发现快了很多。 &nbsp;&nbsp;&nbsp; 2、减少开机滚动条时间&nbsp; 　　每次启动Windows&nbsp;XP，蓝色的滚动条都要走上好多次，其实这里我们也可以把它的滚动时间减少，以加快启动速度。打开注册表编辑器，找到HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession&nbsp;ManagerMemory&nbsp;ManagementPrefetchParameters，在右边找到EnablePrefetcher主键，把它的默认值3改为1，这样滚动条滚动的时间就会减少。&nbsp; &nbsp;&nbsp;&nbsp; 3、加快开机速度&nbsp; 　　在XP中关机时，系统会发送消息到运行程序和远程服务器，告诉它们系统要关闭，并等待接到回应后系统才开始关机。加快开机速度，可以先设置自动结束任务，首先找到HKEY_CURRENT_USERControl&n]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-02 18:06:00</pubDate>
		</item>
				<item>
		<title><![CDATA[在关机或Logff前信息的拦截]]></title>
		<link>http://blog.pfan.cn/tcmcz/6571.html</link>
		<description><![CDATA[在关机或Logff前信息的拦截
如果我们关机或Logoff时，我们的程序有时会因而无法按正常程序结束，一般我们会在Form的Unload中一段程序结束时要做什么事，但是，如果使用者直接用开始功能菜单的关机，会使UnLoad的部份没有做到，我们现在就想办法来拦截关机(或Logoff)时的信息。一般来说，关机或Logff后，Windows会传依序送出WM_QUERYENDSESSION的信息给每个Process，如果中间有一个Process不能顺利结束(例如：Word修改后未存档，而出现是否存档，但我们按取消)，这时该信息执行的结果会传回False(0)，这时Windows也就不再继续送WM_QUERYENDSESSION给下一个Proccess。反之，如果所有的Process都可以顺利结束(也就是每个送出的WM_QUERYENDSESSION都传回True)，那才代表以以顺利结束。不管WM_QUERYENDSESSION最后的结果是可以顺利结束或不能顺利结束，Windows会再送一个WM_ENDSESSION的信息给所有的Process，而wParam的内容便是指出是否可以顺利结束(True菜单可以，False菜单不行，在vb中则Check wParam = 0 菜单False ， 0菜单True)，说到这里大概就知道该如何做啦，程序如下：'以下在FormPrivate Sub Form_Load()Dim ret As Long'记录原来的Window Procedure的位址preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)'设定form的window Procedure到wndprocret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)End SubPrivate Sub Form_Unload(Cancel As Integer)Dim ret As Long'取消Message的截取，而使之又只送往原来的Window Procedureret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)'这里只是要看看用关机的方式结束程序时，会不会执行到这里Dim fno As Longfno = Free]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-02 16:41:00</pubDate>
		</item>
				<item>
		<title><![CDATA[怎样关闭一个正在运行的程序]]></title>
		<link>http://blog.pfan.cn/tcmcz/6569.html</link>
		<description><![CDATA[怎样关闭一个正在运行的程序
你可以使用API函数FindWindow和PostMessage去寻找指定的窗口，并关闭它。下面的例子教给你怎样找到并关掉一个Caption为“Caluclator”的程序。Dim winHwnd As LongDim RetVal As LongwinHwnd = FindWindow(vbNullString, "Calculator")Debug.Print winHwndIf winHwnd &lt;&gt; 0 ThenRetVal = PostMessage(winHwnd, WM_CLOSE, 0&amp;, 0&amp;)If RetVal = 0 ThenMsgBox "置入消息错误！"End IfElseMsgBox "Calculator没有打开！"End If为了让以上的代码工作，你必须在模块文件中什么以下API函数：Declare Function FindWindow Lib "user32" Alias _"FindWindowA" (ByVal lpClassName As String, _ByVal lpWindowName As String) As Long Declare Function PostMessage Lib "user32" Alias _"PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, _ByVal wParam As Long, lParam As Any) As Long Public Const WM_CLOSE = &amp;H10]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-02 16:39:00</pubDate>
		</item>
				<item>
		<title><![CDATA[为 ListBox 设定水平卷动轴]]></title>
		<link>http://blog.pfan.cn/tcmcz/6566.html</link>
		<description><![CDATA[如何为 ListBox 设定水平卷动轴？- -VB 的 ListBox 并没有水平卷动轴的功能，如果遇到某一个资料项很长时， 使用者就无法看到这一个资料项的所有内容，问如何设定水平卷动轴给 ListBox?
可利用 SendMessage 传送 LB_SETHORIZONTALEXTENT 讯息给 ListBox，此一讯息的作用就是要求ListBox 设定水平卷动轴， 细节如下
&nbsp;1. API 的宣告：
&nbsp;&nbsp;&nbsp; Const LB_SETHORIZONTALEXTENT = &amp;H194&nbsp;&nbsp;&nbsp; Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lParam As Any) As Long
2. 程式范例：&nbsp;&nbsp; ' List1 为 ListBox 的名称&nbsp;&nbsp; Call SendMessage(List1.hwnd, LB_SETHORIZONTALEXTENT, _&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 水平卷动轴的宽度, ByVal 0&amp;)
特别注意：以上的水平卷动轴宽度的单位是 pixel(像素)。]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-11-02 16:34:00</pubDate>
		</item>
				<item>
		<title><![CDATA[窗体控件按比例缩放]]></title>
		<link>http://blog.pfan.cn/tcmcz/6365.html</link>
		<description><![CDATA[Option Explicit
Private FormOldWidth As Long&nbsp;&nbsp; '保存窗体的原始宽度Private FormOldHeight As Long&nbsp;&nbsp; '保存窗体的原始高度
'在调用ResizeForm前先调用本函数Public Sub ResizeInit(FormName As Form)&nbsp;&nbsp; Dim Obj As Control&nbsp;&nbsp; FormOldWidth = FormName.ScaleWidth&nbsp;&nbsp; FormOldHeight = FormName.ScaleHeight&nbsp;&nbsp; On Error Resume Next&nbsp;&nbsp; For Each Obj In FormName&nbsp;&nbsp;&nbsp;&nbsp; Obj.Tag = Obj.Left &amp; " " &amp; Obj.Top &amp; " " &amp; Obj.Width &amp; " " &amp; Obj.Height &amp; " "&nbsp;&nbsp; Next Obj&nbsp;&nbsp; On Error GoTo 0End Sub
'按比例改变表单内各元件的大小，在调用ReSizeForm前先调用ReSizeInit函数Public Sub ResizeForm(FormName As Form)&nbsp;&nbsp; Dim Pos(4) As Double&nbsp;&nbsp; Dim i As Long, TempPos As Long, StartPos As Long&nbsp;&nbsp; Dim Obj As Control&nbsp;&nbsp; Dim ScaleX As Double, ScaleY As Double&nbsp;&nbsp; ScaleX = FormName.ScaleWidth / FormOldWidth&nbsp;&nbsp; '保存窗体宽度缩放比例&nbsp;&nbsp; ScaleY = FormName.ScaleHeight / FormOldHeight&nbsp;&nbsp; '保存窗体高度缩放比例&nbsp;&nbsp]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-27 21:19:00</pubDate>
		</item>
				<item>
		<title><![CDATA[在VB中用按钮打开网页]]></title>
		<link>http://blog.pfan.cn/tcmcz/6319.html</link>
		<description><![CDATA['用按钮打开网页
Private Declare Function ShellExecute Lib "shell32.dll" Alias _"ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPrivate Sub Command1_Click()ShellExecute Me.hwnd, "open", "http://www.programfan.com/club", "", "", 5End Sub]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-24 22:01:00</pubDate>
		</item>
				<item>
		<title><![CDATA[QQwry.dat格式分析和查询IP位置的PHP及VB程序]]></title>
		<link>http://blog.pfan.cn/tcmcz/6293.html</link>
		<description><![CDATA[QQwry.dat格式分析和查询IP位置的PHP程序
By Strongc http://strongc.51.net/d2x/ 转载时不要去掉我的名字和我的主页链接，谢谢！ 
以前的追捕数据库太大，而且很久没有更新了。所以我想到利用QQwry.dat这个文件查询IP所在位置，QQwry.dat在很多地方都能找到，一般看IP地址的QQ压缩包中都有。但是没有任何相关格式资料。
我分析了这个文件的格式，目前如下结论。
格式如下：
①、文件头，共8字节；②、若干条记录的结束地址+国家和区域；③、按照从小到大排列的若干条起始地址+结束地址偏移，定长，7字节；④、所有的IP都是用4字节整数记录的，并且遵照Intel次序，高位在后，低位在前；⑤、所有偏移量都是绝对偏移，就是从文件最开头计算；⑥、除了文件头用了两个4字节偏移，其余偏移量都用3字节；⑦、所有的偏移量也是低位在前，高位在后；⑧、采用了一些字符串压缩技术；
①、文件头，共8字节。&nbsp;&nbsp;&nbsp; FirstStartIpOffset:4 第一个起始IP的绝对偏移&nbsp;&nbsp;&nbsp; LastStartIpOffset:4&nbsp; 最后一个起始IP的绝对偏移
②、起始地址+结束地址偏移记录区&nbsp;&nbsp;&nbsp; 每条记录7字节，按照起始地址从小到大排列&nbsp;&nbsp;&nbsp; StartIp:&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; 起始地址，整数形式的IP&nbsp;&nbsp;&nbsp; EndIpOffset: 3&nbsp; 结束地址绝对偏移
③、结束地址+国家+区域记录区&nbsp;&nbsp;&nbsp; EndIP:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4&nbsp; 国家+区域记录:不定长 
④、国家+区域记录，有几种形式4.1&nbsp;&nbsp;&nbsp; 国家字符串，以 0x0 结束&nbsp;&nbsp;&nbsp; 区域字符串，以 0x0 结束
4.2&nbsp;&nbsp;&nbsp; Flag:1 标识取值&nbsp;&nbsp;&nbsp; 0x1，后面没有Local记录&nbsp;&nbsp;&nbsp; 0x2，后面还有Local记录]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 22:31:00</pubDate>
		</item>
				<item>
		<title><![CDATA[用VB编制病毒]]></title>
		<link>http://blog.pfan.cn/tcmcz/6292.html</link>
		<description><![CDATA[谈起病毒的编制，大家都认为是很高深的东西。高手用的都是汇编语言，次一点的也是 VC或 C++。那么用 VB也能编病毒吗？答案是肯定的。只不过由于技术上的限制（比如VB不能对底层硬件进行直接的操作，不能生成独立的可执行文件等等），编出来的程序不可能象汇编或VC编出来的程序那么小巧和功能强大。但是VB编出来的病毒也不可小窥噢 ！ 在谈病毒的编制以前，我们先说说什么是病毒。只有先把概念搞清楚了，才能编出 真正的病毒程序。关于病毒的标准解释，我就不说了，我想我也说不清楚，大家可以到 一些大的杀毒厂商的网站去看看，那里有比较完整、全面的定义。香水百合就自己的理 解来谈谈病毒。病毒最少应该满足以下的二个条件： 一、自启动和自恢复 只要机器染上病毒后，每次启动就会自动加载。如果无意中被你发现并杀掉后，病毒程 序会自己通过备份来恢复。自动运行一般是通过以下几种方法来实现的。 1.最简单的方法是通过自动批处理文件Autoexec.bat来加载。 从DOS 时代就开始玩电脑的人应该都很熟悉这个文件了。不为别的，就为游戏能够玩的 更加流畅，为了从640K基本内存中抠出更多的可用内存，都绞尽脑汁的来修改、配置这 个文件。现在到了Windows 时代，这个文件基本上已经成了被人遗忘的角落了，不过也 不能放过噢！因为被人遗忘，所以才要利用啊！ 2.通过Win.ini文件来加载 [windows] load=expl0rer.exe run=expl0rer.exe 看到load和run 两个字段了，正常的情况应该是空的。但是病毒程序可以通过将这两段 写上病毒自身的名字来达到自动运行的目的。而且病毒将自身的名字改为expl0rer.exe ，注意了，是0而不是O噢！如果不细看，还以为运行的是资源管理器程序(explorer.ex e)呢！ 3.通过system.ini文件来加载 [boot] shell=Explorer.exe server.exe 正常的情况下，shell后面跟的应该只有Explorer.exe 这一个变量。但是很多病毒程序 就是通过在后面加上自己的名字来实现自动运行。 4.通过在注册表中加载自动运行键值来实现 [HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run] [HKEY_LOCAL_MACH]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 22:28:00</pubDate>
		</item>
				<item>
		<title><![CDATA[共享蠕虫的原理及用VB编程的实现方法]]></title>
		<link>http://blog.pfan.cn/tcmcz/6291.html</link>
		<description><![CDATA[共享蠕虫的原理及用VB编程的实现方法&nbsp;&nbsp;&nbsp;&nbsp;VB是一个非常“美好”的编程语言，至少我是这么认为的。原因有二：其一是，VB的英文名可以解释为Very Beautiful，这是VB的“美”；其二是，“好”字的五笔输入码是什么？"VB"是也，这就是我所谓的VB的“好”。嘻嘻，这样的解释够Cool吧！&nbsp;&nbsp;&nbsp;&nbsp;但事物都是有两面性的，这么美的语言在有些人手里却成了搞“破坏”的工具，被用来编写病毒。最近网络上的各种病毒层出不穷，其中有相当一部分就是VB的杰作。比较有代表性的是共享蠕虫病毒。今天我们就来让它现出原形!&nbsp;&nbsp;&nbsp;&nbsp;所谓的共享蠕虫的病毒(network.vbs)，它体积不但小巧(只有1K)， 而且很具有破坏性！只要被这个病毒感染了的机器，所有的硬盘就会被完全共享，并且可以在局域网和因特网中传播。下面我们先谈谈它的原理。&nbsp;&nbsp;&nbsp;&nbsp;我们知道，把一个目录设置为共享的时候，如果在共享名后面加上$ 符号，那么这个目录将变成一个隐含的共享目录，即对方的机器上看不见这个共享目录。但是如果对方知道共享目录名，仍然是可以访问的，只要在这个目录后面加上$ 符号就可以了。&nbsp;&nbsp;&nbsp;&nbsp;虽然对方看不见这个共享目录，但是自己是可以看见的。这样也是不行的，虽然我们已经加上$ 符号，但是我们仍然可以发现这个共享目录的图标下面已经加上了一个小手，表示这个目录已经被设置为共享。这样使用者就会知道机器被人改动过了。而共享蠕虫的高明之处就在于：不光是对方看不见这个共享目录，而且连自己也是看不见这个共享目录的，这样就可以做到神不知，鬼不觉了。当你把这个程序发过对方，对方执行完以后，对方的机器就会被全部被共享，而对方却不知道。&nbsp;&nbsp;&nbsp;&nbsp;做到对方看不见很容易，只要在共享目录名后面加上$ 符就可以了；而共享蠕虫程序是怎么做到连自己也看不出来的呢？其实道理说出来也是很简单的，秘密就在注册表中。请看下面的例子：&nbsp;&nbsp;&nbsp;&nbsp;①、运行Regedit命令，打开注册表；&nbsp;&nbsp;&nbsp;&nbsp;②、找到下面的子键：&nbsp;&nbsp;&nbsp]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 22:25:00</pubDate>
		</item>
				<item>
		<title><![CDATA[SHELL 命令大全]]></title>
		<link>http://blog.pfan.cn/tcmcz/6290.html</link>
		<description><![CDATA[SHELL 命令大全


&nbsp;

&nbsp;


1.命令: rundll32.exe shell32.dll,Control_RunDLL&nbsp;&nbsp;功能: 显示控制面板2.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,1　功能: 显示“控制面板-&gt;辅助选项-&gt;键盘”选项视窗3.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,2　功能: 显示“控制面板-&gt;辅助选项-&gt;声音”选项视窗4.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,3　功能: 显示“控制面板-&gt;辅助选项-&gt;显示”选项视窗5.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,4　功能: 显示“控制面板-&gt;辅助选项-&gt;鼠标”选项视窗6.命令: rundll32.exe shell32.dll,Control_RunDLL access.cpl,,5　功能: 显示“控制面板-&gt;辅助选项-&gt;常规”选项视窗7.命令: rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl @1　功能: 执行“控制面板-&gt;添加新硬件”向导。8.命令: rundll32.exe shell32.dll,SHHelpShortcuts_RunDLL AddPrinter　功能: 执行“控制面板-&gt;添加新打印机”向导。9.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,1　功能: 显示 “控制面板-&gt;添加/删除程序-&gt;安装/卸载” 面板。10.命令: rundll32.exe shell32.dll,Control_RunDLL appwiz.cpl,,2　 功能: 显示 “控制面板-&gt;添加/删除程序-&gt;安装Windows” 面板。11.命令: rundll32.exe shell32.dll,Control_RunDLL a]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 22:24:00</pubDate>
		</item>
				<item>
		<title><![CDATA[将1，2，3，4组合成互不相同且不重复的三位数]]></title>
		<link>http://blog.pfan.cn/tcmcz/6289.html</link>
		<description><![CDATA[Private Sub Command1_Click()b = "1234"s = 1For i = 1 To 4&nbsp;&nbsp;&nbsp;&nbsp;a1 = Mid(b, i, 1)&nbsp;&nbsp;&nbsp;&nbsp;b1 = Replace(b, a1, "")&nbsp;&nbsp;&nbsp;&nbsp;For j = 1 To 3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a2 = Mid(b1, j, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b2 = Replace(b1, a2, "")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;For k = 1 To 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a3 = Mid(b2, k, 1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print s, a1 &amp; a2 &amp; a3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = s + 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Next&nbsp;&nbsp;&nbsp;&nbsp;NextNextEnd Sub]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 21:11:00</pubDate>
		</item>
				<item>
		<title><![CDATA[更改无标题窗体的大小]]></title>
		<link>http://blog.pfan.cn/tcmcz/6255.html</link>
		<description><![CDATA['添加一个Label控件，作为右下角的标记'Tcmcz制作
Private Sub Form_Load()&nbsp;&nbsp;&nbsp; With Label1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Caption = ""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .BackColor = RGB(0, 0, 255) '如觉得右下角这个点不好看，可改为：.BackStyle = 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Height = 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Width = 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Left = Me.ScaleWidth - 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Top = Me.ScaleHeight - 100&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .MousePointer = 8&nbsp;&nbsp;&nbsp; End WithEnd Sub
Private Sub Label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)&nbsp;&nbsp;&nbsp; Static OldX, OldY As Single&nbsp;&nbsp;&nbsp; OldX = X: OldY = YEnd Sub
Private Sub Label1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)&nbsp;&nbsp;&nbsp; PianyiX = X - OldX: PianyiY = Y - OldY&nbsp;&nbsp;&nbsp; Label1.Left = Label1.Left + PianyiX&nbsp;&nbsp;&nbsp; Label1.T]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-23 01:35:00</pubDate>
		</item>
				<item>
		<title><![CDATA[一组小技巧]]></title>
		<link>http://blog.pfan.cn/tcmcz/5852.html</link>
		<description><![CDATA[路径问题 
很多程序员在打开文件、调用程序时喜欢使用绝对文件路径,结果在另一台计算机上运行时便会遇到路径不对或需要重新拷贝到该目录的问题。其实，只要使用相对路径，就完全可以避免这个问题。在Windows下，某个程序一旦运行，除非特别指定了工作目录，一般该程序文件所在的目录就是工作目录，其他目录可以用工作目录为参照系。在编程中"App.Path"即为当前工作目录。另外，用安装程序向导制作安装盘时，只要在步骤"文件小结"中添加某文件时指定"文件详细资料"的路径即可安装该文件到指定的目录下。 
&nbsp;
生成透明窗体 
&nbsp;利用API函数可做出透明窗体。以下为一种方法： 
Me.AutoRedraw = True 
　　hBitmap = CreateCompatibleBitmap(Me.hdc, 0, 0) 
　　SelectObject Me.hdc, hBitmap 
&nbsp;
调用Bitblt API函数 
&nbsp;在编程中我们经常遇到需要拷贝图形的问题,一般利用API函数Bitblt或Stretchblt(后者可缩放). 
Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long 
Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeigh]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-10 13:17:00</pubDate>
		</item>
				<item>
		<title><![CDATA[VB_小技巧]]></title>
		<link>http://blog.pfan.cn/tcmcz/5850.html</link>
		<description><![CDATA[获取X字符串包含字母“B”的数量，最简单方法===========================&nbsp;&nbsp;&nbsp;&nbsp;UBound(Split(x, "B"))剪贴板相关===========================================================　　'全选 　　Private Sub mnuSelectAll_Click() 　　RichTextBox1.SelStart = 0 　　RichTextBox1.SelLength = Len(RichTextBox1.Text) 　　End Sub 　　 　　'粘贴 　　Private Sub mnuPaste_Click() 　　RichTextBox1.SelText = Clipboard.GetText 　　End Sub 　　 　　'查找 　　Private Sub mnuFind_Click() 　　sFind = InputBox("请输入要查找的字、词：", "查找内容", sFind) 　　RichTextBox1.Find sFind 　　End Sub 　　 　　'继续查找 　　Private Sub mnuFindOn_Click() 　　RichTextBox1.SelStart = RichTextBox1.SelStart + RichTextBox1.SelLength + 1 　　RichTextBox1.Find sFind, , Len(RichTextBox1) 　　End Sub TextBox操作==========================================================1、限制只能输入数字参考下列程序：Sub Text1_KeyPress(KeyAscii As Integer)If KeyAscii &lt; 48 Or KeyAscii &gt; 57 ThenKeyAscii = 0End IfEnd Sub2、屏蔽特定字符Private Sub Text1_KeyPress(KeyAscii As Integer)&nbsp;&nbsp;&nbsp;&nbsp;Dim sTemplate As String&nbsp;&nbsp;&nbsp;&nbsp;s]]></description>
		<author><![CDATA[tcmcz]]></author>
		<pubDate>2005-10-10 00:20:00</pubDate>
		</item>
		</channel>
</rss>