<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>我思集</title>
<link>http://blogger.org.cn/blog/blog.asp?name=yth</link>
<description>yth的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[Access报表内容垂直居中一法]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=48249</link>
<author>yth</author>
<pubDate>2010/2/23 14:27:04</pubDate>
<description><![CDATA[
<P>在<A>Access报表设计时，当文本框内容可能会占据两行时，需要把文本框移上一定空间，以实现内容垂直居中</A>，可以在主体格式化时判断并移动控件。代码如下：</P>
<DIV style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; PADDING-LEFT: 5px; PADDING-RIGHT: 5px; BACKGROUND: #f3f3f3; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 5px">
<P>Option Compare Database</P>
<P>Private Sub 主体_Format(Cancel As Integer, FormatCount As Integer)<BR>&nbsp;&nbsp;&nbsp; dTop = -120<BR>&nbsp;&nbsp;&nbsp; FixControl 控件名称1, , dTop<BR>&nbsp;&nbsp;&nbsp; FixControl 控件名称2, , dTop<BR>&nbsp;&nbsp;&nbsp; FixControl 控件名称3, , dTop<BR>End Sub</P>
<P>Private Sub FixControl(c, Optional dLeft = 0, Optional dTop = 0, Optional dWidth = 0, Optional dHeight = 0)<BR>&nbsp;&nbsp;&nbsp; FontName = c.FontName<BR>&nbsp;&nbsp;&nbsp; FontSize = c.FontSize<BR>&nbsp;&nbsp;&nbsp; If TextWidth(c) &gt; c.Width Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c.Move c.Left + dLeft, c.Top + dTop, c.Width + dWidth, c.Height + dHeight<BR>&nbsp;&nbsp;&nbsp; End If<BR>End Sub</P></DIV>]]></description>
</item><item>
<title><![CDATA[Windows快捷键]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=48239</link>
<author>yth</author>
<pubDate>2010/2/21 22:52:53</pubDate>
<description><![CDATA[<P>Win+D：快速最小化所有窗口<BR>Win+E：用资源管理器打开我的电脑<BR>Win+L：快速锁定机器<BR>Tab键：在CMD窗口下自动枚举当前目录下面的文件(夹)<BR>Alt+Print Screen：复制活动窗口图像到剪切板。<BR>Ctrl+D：把喜爱的网址添加到收藏夹<BR>WIN+BREAK　显示“系统属性”对话框<BR>WIN+F 显示“查找：所有文件”</P>
<P>待补充...<A></A></P>]]></description>
</item><item>
<title><![CDATA[组合（合并）Excel文档]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=18773</link>
<author>yth</author>
<pubDate>2006/9/26 23:46:16</pubDate>
<description><![CDATA[
<P>收到很多Excel文档，需要把它们组合在一起形成一张大表，然后才进行格式化。</P>
<P>由于文档格式有些差异，合并最好的办法只能是复制、粘贴，为提高效率，特编此VBA：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">Sub MergeWorkbooks()<BR>&nbsp;&nbsp;&nbsp; Dim i As Long<BR>&nbsp;&nbsp;&nbsp; Dim WB As Workbook<BR>&nbsp;&nbsp;&nbsp; Dim currentWS As Worksheet<BR>&nbsp;&nbsp;&nbsp; Set currentWS = ActiveSheet<BR>&nbsp;&nbsp;&nbsp; Application.DisplayAlerts = False<BR>&nbsp;&nbsp;&nbsp; With Application.FileDialog(msoFileDialogOpen)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Filters.Clear<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Filters.Add "Excel", "*.xls", 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .AllowMultiSelect = True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Show<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i = 1 To .SelectedItems.Count<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set WB = Workbooks.Open(.SelectedItems(i))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyUsedRange<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Selection.Copy<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentWS.Activate<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Select<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cells(Selection.Row + 1, 1).Select<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveSheet.Paste<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WB.Close<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next i<BR>&nbsp;&nbsp;&nbsp; End With<BR>&nbsp;&nbsp;&nbsp; Application.DisplayAlerts = True<BR>End Sub</DIV>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">
<P>Sub MyUsedRange()<BR>Dim ar As Range, r As Double, c As Integer, tr As Double, tc As Integer<BR>Dim ur As Range, fr As Double, fc As Integer, tfr As Double, tfc As Integer</P>
<P>On Error Resume Next<BR>&nbsp; fc = ActiveSheet.Columns.Count<BR>&nbsp; fr = ActiveSheet.Rows.Count<BR>&nbsp; Set ur = Union(ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants), _<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas))<BR>&nbsp; If Err.Number = 1004 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Err.Clear<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set ur = ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)<BR>&nbsp; End If<BR>&nbsp; If Err.Number = 1004 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Err.Clear<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Set ur = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas)<BR>&nbsp; End If<BR>&nbsp; If Err.Number = 0 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each ar In ur.Areas<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tr = ar.Range("A1").Row + ar.Rows.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tc = ar.Range("A1").Column + ar.Columns.Count - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If tc &gt; c Then c = tc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If tr &gt; r Then r = tr<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tfr = ar.Range("A1").Row<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tfc = ar.Range("A1").Column<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If tfc &lt; fc Then fc = tfc<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If tfr &lt; fr Then fr = tfr<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Range(Cells(fr, fc), Cells(r, c)).Select<BR>&nbsp; ElseIf Err.Number = 1004 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Range("A1").Select<BR>&nbsp; End If<BR>End Sub<BR></P></DIV>
<P>如此把选中文档（可以多个）的当前sheet拷贝到vba执行时的活动sheet中，并向下平铺。</P>
<P>MyUsedRange子程序摘自微软<A href="http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B232094">http://support.microsoft.com/default.aspx?scid=kb%3Bzh-cn%3B232094</A></P>
<P>感觉比Excel自带的UsedRange好用。</P>]]></description>
</item><item>
<title><![CDATA[WinXP系统网络不能互访的七大解决之道[转贴]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=17091</link>
<author>yth</author>
<pubDate>2006/8/1 12:08:22</pubDate>
<description><![CDATA[
<P>&nbsp;</P>
<P>　　相信很多人都有和笔者一样的经历，由WIN XP构成的网络所有设置和由WIN 2000构成的完全一样，但还是出现了根本不能访问的情况，笔者认为这主要是因为XP的安全设置和2000不一样所导致。针对这个问题笔者在网上查了一些资料，并将各种网上提供的常见解决方法做了相应测试，现在整理介绍给大家，希望能对遇到此问题的网友有所帮助，并请高手继续指点。部分内容摘自网络，请原谅不一一注明出处。<BR>　　首先，这里不考虑物理联接和其它问题，只谈及策略问题。此外，请安装相应的协议并正确的设置IP地址，同时尽量把计算机设置在一个工作组内且具有相同网段的IP地址。<BR>　　其次，网上对于出现的问题描述较多，这里不再累述。当共享和访问出现问题时请考虑以下的步骤：<BR><STRONG>　　1.检查guest账户是否开启<BR></STRONG>　　XP默认情况下不开启guest账户，因此些为了其他人能浏览你的计算机，请启用guest账户。同时，为了安全请为guest设置密码或相应的权限。当然，也可以为每一台机器设置一个用户名和密码以便计算机之间的互相访问。<BR><STRONG>　　2.检查是否拒绝Guest用户从网络访问本机<BR></STRONG>　　当你开启了guest账户却还是根本不能访问时，请检查设置是否为拒绝guest从网络访问计算机，因为XP默认是不允许guest从网络登录的，所以即使开了guest也一样不能访问。在开启了系统Guest用户的情况下解除对Guest账号的限制，点击“开始→运行”，在“运行”对话框中输入“GPEDIT.MSC”，打开组策略编辑器，依次选择“计算机配置→Windows设置→安全设置→本地策略→用户权利指派”，双击“拒绝从网络访问这台计算机”策略，删除里面的“GUEST”账号。这样其他用户就能够用Guest账号通过网络访问使用Windows XP系统的计算机了。<BR><STRONG>　　3.改网络访问模式<BR></STRONG>　　XP默认是把从网络登录的所有用户都按来宾账户处理的，因此即使管理员从网络登录也只具有来宾的权限，若遇到不能访问的情况，请尝试更改网络的访问模式。打开组策略编辑器，依次选择“计算机配置→Windows设置→安全设置→本地策略→安全选项”，双击“网络访问：本地账号的共享和安全模式”策略，将默认设置“仅来宾—本地用户以来宾身份验证”，更改为“经典：本地用户以自己的身份验证”。<BR>　　这样即使不开启guest，你也可以通过输入本地的账户和密码来登录你要访问的计算机，本地的账户和密码为你要访问的计算机内已经的账户和密码。若访问网络时需要账户和密码，可以通过输入你要访问的计算机内已经的账户和密码来登录。<BR>　　若不对访问模式进行更改，也许你连输入用户名和密码都办不到，<A href="file://computername/guest">\\computername\guest</A>为灰色不可用。即使密码为空，在不开启guest的情况下，你也不可能点确定登录。改成经典模式，最低限度可以达到像2000里没有开启guest账户情况时一样，可以输入用户名和密码来登录你要进入的计算机。也许你还会遇到一种特殊的情况，请看接下来的。<BR><STRONG>　　4.一个值得注意的问题<BR></STRONG>　　我们可能还会遇到另外一个问题，即当用户的口令为空时，即使你做了上述的所有的更改还是不能进行登录，访问还是会被拒绝。这是因为，在系统“安全选项”中有“账户：使用空白密码的本地账户只允许进行控制台登录”策略默认是启用的，根据Windows XP安全策略中拒绝优先的原则，密码为空的用户通过网络访问使用Windows XP的计算机时便会被禁止。我们只要将这个策略停用即可解决问题。在安全选项中，找到“使用空白密码的本地账户只允许进行控制台登录”项，停用就可以，否则即使开了guest并改成经典模式还是不能登录。经过以上的更改基本就可以访问了，你可以尝试选择一种适合你的方法。下面在再补充点其它可能会遇到的问题。<BR><STRONG>　　5.网络邻居不能看到计算机<BR></STRONG>　　可能经常不能在网络邻居中看到你要访问的计算机，除非你知道计算机的名字或者IP地址，通过搜索或者直接输入<A href="file://computername/">\\computername</A>或<A href="file://IP/">\\IP</A>。请按下面的操作解决：启动“计算机浏览器”服务。“计算机浏览器服务”在网络上维护一个计算机更新列表，并将此列表提供给指定为浏览器的计算机。如果停止了此服务，则既不更新也不维护该列表。<BR>　　137/UDP--NetBIOS名称服务器，网络基本输入/输出系统(NetBIOS)名称服务器(NBNS)协议是TCP/IP上的NetBIOS(NetBT)协议族的一部分，它在基于NetBIOS名称访问的网络上提供主机名和地址映射方法。<BR>　　138/UDP--NetBIOS数据报，NetBIOS数据报是TCP/IP上的NetBIOS(NetBT)协议族的一部分，它用于网络登录和浏览。<BR>　　139/TCP--NetBIOS会话服务，NetBIOS会话服务是TCP/IP上的NetBIOS(NetBT)协议族的一部分，它用于服务器消息块(SMB)、文件共享和打印。请设置防火墙开启相应的端口。一般只要在防火墙中允许文件夹和打印机共享服务就可以了。<BR><STRONG>　　6.关于共享模式<BR></STRONG>　　对共享XP默认只给予来宾权限或选择允许用户更改“我的文件”。Windows 2000操作系统中用户在设置文件夹的共享属性时操作非常简便，只需用鼠标右击该文件夹并选择属性，就可以看到共享设置标签。而在Windows XP系统设置文件夹共享时则比较复杂，用户无法通过上述操作看到共享设置标签。具体的修改方法如下：打开“我的电脑”中的“工具”，选择“文件夹属性”，调出“查看”标签，在“高级设置”部分滚动至最底部将“简单文件共享(推荐)”前面的选择取消，另外如果选项栏里还有“Mickey Mouse”项也将其选择取消。这样修改后用户就可以象使用Windows 2000一样对文件夹属性进行方便修改了。<BR><STRONG>　　7.关于用网络邻居访问不响应或者反应慢的问题<BR></STRONG>　　在WinXP和Win2000中浏览网上邻居时系统默认会延迟30秒，Windows将使用这段时间去搜寻远程计算机是否有指定的计划任务（甚至有可能到Internet中搜寻）。如果搜寻时网络时没有反应便会陷入无限制的等待，那么10多分钟的延迟甚至报错就不足为奇了。下面是具体的解决方法。<BR>　　A.关掉WinXP的计划任务服务（Task Scheduler）<BR>　　可以到“控制面板/管理工具/服务”中打开“Task Scheduler”的属性对话框，单击“停止”按钮停止该项服务，再将启动类型设为“手动”，这样下次启动时便不会自动启动该项服务了。<BR>　　B.删除注册表中的两个子键<BR>　　到注册表中找到主键“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\NameSpace”<BR>　　删除下面的两个子健：{2227A280-3AEA-1069-A2DE-08002B30309D}和{D6277990-4C6A-11CF-87-00AA0060F5BF}。<BR>　　其中，第一个子健决定网上邻居是否要搜索网上的打印机（甚至要到Internet中去搜寻），如果网络中没有共享的打印机便可删除此键。第二个子健则决定是否需要查找指定的计划任务，这是网上邻居很慢的罪魁祸首，必须将此子健删除。<BR><STRONG>　　总结<BR></STRONG>　　不能访问主要是由于XP默认不开启guest，而且即使开了guest，XP默认是不允许guest从网络访问计算机的。还有就是那个值得注意的问题。相信一些不考虑安全的地方或是电脑公司给人做系统密码都是空的，但这样是不允许登录的。只要试过以上的方法，相信是不会再有问题的。<BR></P>]]></description>
</item><item>
<title><![CDATA[一个EXE引发的危机——浏览器劫持实战篇[转贴]]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=16620</link>
<author>yth</author>
<pubDate>2006/7/14 13:29:28</pubDate>
<description><![CDATA[
<DIV align=center>一个EXE引发的危机<BR>——浏览器劫持实战篇<BR>作者：小金<BR><SPAN style="COLOR: red">转载请注明出处和作者</SPAN></DIV><BR><BR>一. 一个EXE引发的危机<BR>网络程序员小李最近有点忙，公司要做的网页工程项目已经快到尾期了，可是开发小组的进度仍然迟迟跟不上来，为了赶进度，小李去国外下了一些代码回来参考，但那些代码的关键部分都是用了字符编码的形式加密的，小李不想手工一段段的解码，就上网搜索了一个号称能解码脚本字符编码的工具，下载回来的是一个安装包，文件名为“downsoft226.exe”，小李要急着用，看也没看就双击执行了，但是他等了好一会儿也没见安装界面出现，反而感觉到硬盘在狂转，机器奇慢，小李有些不安的打开了任务管理器——列表里赫然有至少超过50个进程在后台执行！<BR>小李赶快手忙脚乱的停止进程，可是仍然有新的进程不断的出现，在他停掉downsoft226.exe这个进程后，系统蓝屏了，计算机重启后跳出好几个IE窗口，每个窗口上都多了一些工具栏，而且更严重的是，IE的空白页也不再空白了。小李只觉得天昏地暗：完了，恶狼又找上门来了……<BR><BR><BR>二. 无处不在的劫持者<BR>以上的经历大概许多用户都会遇到，在网络上看到个工具的说明很好，就下载了运行，结果运气好的在得到工具的同时还“获赠”了一堆所谓的“IE助手”（BHO），运气差的不但工具没得到，还引狼入室给自己惹来一身臊。在这个信任危机的网络时代，你的浏览器随时会被“劫匪”给绑了去。<BR><BR><!--QuoteBegin-->
<DIV class=quotetop>&nbsp;</DIV>
<DIV class=quotemain><!--QuoteEBegin-->
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">知识回顾：浏览器劫持<BR>“浏览器劫持”（Browser Hijack）是一种不同于普通病毒木马感染途径的网络攻击手段，它的渗透途径很多，目前最常见的方式有通过BHO、DLL插件、Hook技术、Winsock LSP等载体达到对用户的浏览器进行篡改的目的。这些载体可以直接寄生于浏览器的模块里，成为浏览器的一部分，进而直接操纵浏览器的行为，轻者把用户带到自家门户网站，严重的则会在用户计算机中收集敏感信息，危及用户隐私安全。“浏览器劫持”的后果非常严重，用户只有在受到劫持后才会发现异常情况，但是这时候已经太迟了。目前，浏览器劫持已经成为Internet用户最大的威胁之一。<!--QuoteEnd--></DIV><BR><BR>由于“浏览器劫持”的攻击手段是可以通过被系统认可的“合法途径”来进行的，以目前的软件行为检测技术来说，“浏览器劫持”是防不胜防的，即使你每天都很小心的设置安全级别、对浏览器弹出的安装插件提示看了又看，你仍然不可避免会因为下载安装了一些工具而让“劫持者”登堂入室。如果我们不小心让这头恶狼驻扎了进来，该用什么方法驱逐它呢？<BR><!--QuoteBegin--></DIV>
<DIV class=quotetop>&nbsp;</DIV>
<DIV class=quotemain><!--QuoteEBegin-->
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">知识回顾：为什么“浏览器劫持”是“合法入侵”<BR>为什么说“浏览器劫持”可以说是合法的呢？因为大部分浏览器劫持的发起者，都是通过一种被称为“BHO”（Browser Helper Object，浏览器辅助对象）的技术手段植入系统的。<BR>BHO是微软早在1999年推出的作为浏览器对第三方程序员开放交互接口的业界标准，它是一种可以让程序员使用简单代码进入浏览器领域的“交互接口”（INTERACTIVED Interface）。通过BHO接口，第三方程序员可以自己编写代码获取浏览器的一些行为（Action）和事件通知（Event），如“后退”、“前进”、“当前页面”等，甚至可以获取浏览器的各个组件信息，像菜单、工具栏、坐标等。由于BHO的交互特性，程序员还可以使用代码去控制浏览器的行为，比如常见的修改替换浏览器工具栏、在浏览器界面上添加自己的程序按钮等操作，而这些操作都被视为“合法”的，这就是一切罪恶根源的开始。<BR>BHO的出现帮助程序员更好的打造个性化浏览器或者为自己的程序实现了方便简洁的交互功能，可以说，如果没有BHO接口的诞生，我们今天就不能用一些工具实现个性化IE的功能了。从某一方面来看，BHO的确是各种缤纷网络互动功能的幕后功臣，但是一切事物都是有两面性的，这个恒古不变的真理同样对BHO有效，于是就有了今天让安全界头痛的“浏览器劫持”的攻击手段诞生。<!--QuoteEnd--></DIV><BR><BR>除了BHO劫持以外，如今的劫持方式更有通过DLL插件、Hook技术和Winsock LSP进行的，而这些矛头纷纷指向浏览器的小坏蛋们，都会被传统的反病毒软件视为正常的，因为除了恶意软件，还有许多正常软件需要采用这些技术来为IE提供许多功能，因此出现了“鱼与熊掌”的尴尬局面，要更改这个已经定型的环境固然不现实，那么，要想在这个危机重重的环境下保全自己，我们就必须掌握一套“除狼”的技术了。<BR><BR><BR>三. 代号35：营救IE行动<BR>1. 解雇死缠烂打的秘书——BHO的清理<BR>虽然一部分BHO是衷心为IE效力的，可是也总有那么一小嘬捣乱分子以简单的理由（增强浏览器特性、保护浏览器安全、上网记录清理等等等等……）让用户放心的执行了安装程序，然后再以复杂的理由（卸载不彻底、不提供卸载、表面上“卸载”等等等等……）死活赶不走了，如果遇到这样的无赖，用户该怎么办呢？<BR>首先，要确认一下它的驻留地，一般情况下，BHO文件都在Windows目录下的“Downloaded Program Files”目录下，记住永远不要用资源管理器进去，它们会骗人的，我们必须用最原始的命令提示符（CMD.EXE）进去，只需要这几个命令：<BR><!--QuoteBegin--></DIV>
<DIV class=quotetop>&nbsp;</DIV>
<DIV class=quotemain><!--QuoteEBegin-->
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">cd \<BR>cd %SystemRoot%<BR>cd “Downloaded Program Files”<BR>dir *.* /a<!--QuoteEnd--></DIV><BR>你就会发现命令提示符和Windows资源管理器的巨大差异，如果实在用不惯命令提示符也没关系，有很多工具可以不偏袒任何一方的显示出最真实的情况，例如Total Commander这款强大的文件管理工具。但是这里并不是唯一的BHO目录，一些BHO会把自己放在系统根目录下的“Program Files”目录里，并且建立有自身所属的文件管理目录。<BR>既然看到这么多BHO的文件实体了，那么哪个才是赶不走的“助手”呢？既然它一开始就不打算让你卸载的，那么自然不会告诉你它一共有多少个文件、文件名是什么、分布的目录等关系到自身生死大事的敏感信息，这就意味着对于计算机不熟练的用户来说，要驱逐它们并非那么容易，但是大部分设计者都会被一种“自我”的心理暗示，因此设计出的程序文件一般都会注明版权信息，文件名也会包含有厂商的缩写或者该工具的英文缩写等特征字符，有了这些因素存在，用户要自己寻找这些不受欢迎的客人就好办多了，一个典型的例子是“中文实名网址”这款工具，它的大部分文件均包含有产品英文缩写“CDN”，而且每个程序文件都在版权信息里清楚的写着“中文实名”，因此用户只要查找包含有“CDN”字符的文件名就能发现个大概了，不过由于系统自身也可能会有几个文件名带有“CDN”字符，所以删除之前请先确认该文件的版权并非Microsoft所属。<BR>一些用户也许会疑惑，为什么有些文件要删除的时候总会提示“文件正在被使用，无法删除”，这是因为BHO有一定的特殊性：它是可以被Windows的外壳进程加载的，也就是那个Explorer，只要你进了系统，只要你的桌面和窗口还在，那么你就别想删除它了。要解决这个问题，我们先要尝试用REGSVR32.EXE程序来去除它的组件注册信息，例如反注册HBClient.dll，只需要用命令提示符进入文件的目录里，执行REGSVR32.EXE /U HBClient.dll即可，然后打开任务管理器taskmgr.exe，找到Explorer.exe进程停掉，最后直接在任务管理器里执行CMD.EXE，进入文件目录后输入DEL HBClient.dll就完成了该文件的清理工作。如果这个BHO组件位于Program Files目录下的某一子目录里，你还可以放心的直接执行DEL *.*命令一窝端掉。<BR>随着时间的流逝和技术的进步，许多BHO已经不再简单，有的BHO不仅使用BHO技术劫持浏览器，还加上了Hook技术、LSP劫持甚至采用了类似于Rootkit后门的保护技术最大限度的保全自己，要对付这些越来越狡猾的劫持者，仅仅用上面的方法大概是远远不够的。<BR>幸运的是，现在已经出现了一批针对“浏览器劫持”的优秀工具，如列出所有浏览器环境组件的HijackThis、直接清理大部分常见恶意软件的RogueCleaner和直接屏蔽IE安装恶意软件功能的Upiea等，许多需要手工清理的恶意软件都可以通过它们配合完成，事半功倍。<BR><BR><BR>2. 寻回我遗失的首页<BR>“浏览器劫持”的另一个显著特征就是篡改IE首页，首先，恶意软件把IE首页改为它要带用户去浏览的网址，如某个广告页、带毒页等，即使用户自己把首页设置为“about:blank”（空白页），再打开IE仍然会发现浏览器在地址为“about:blank”的情况下自己跳转到了那个恶意页面，这就是经常搞得一批用户人心惶惶最后不得不重装系统的“IE空白页劫持”事件，如果不慎被这种恶意软件纠缠上了该怎么办呢？<BR>首先，我们要理解“空白页劫持”的机制，它一般通过两种方法进行，第一种是利用BHO技术进行劫持的，恶意程序员编写了一个能检测当前IE地址的BHO组件，如果该组件截获到地址为“about:blank”，则触发跳转代码，控制浏览器访问该组件内置的地址去；另一种是利用了IURLSearchHook技术实现的内部跳转，IURLSearchHook被浏览器用来转换一个未知的URL协议地址，当浏览器企图去打开一个未知协议的URL地址时，浏览器首先尝试从这个地址得到当前的协议，如果不成功，浏览器将寻找系统里所有注册为“URL Search Hook”（资源搜索钩子，USH）的对象并把这个IE不能理解的地址发送过去，如果某个USH对象“认识”这个地址，它就返回一个特定的标识告诉IE它知道怎么打开这个地址，然后IE就根据约定的方法调用它，最终打开这个地址。<BR>这样描述也许很模糊，举个例子就好理解了，例如，当用户输入一个不带协议标记的资源地址时（资源定位协议规定标准格式为协议标记://资源所在地址/目录/文件名），浏览器自身并不认识它的，所以它会枚举所有在系统注册的USH对象，并把资源请求逐条传递过去，如果某一个USH“认识”该资源特征，则告诉浏览器它认识这个请求，浏览器就会加载它最终打开目标连接。通常，默认的协议标记被指定为“http”，它是属于urlmon.dll负责的，而属于mshtml.dll负责的“about”协议被用于本地信息输出调试和扩展功能的实现（大家可以尝试在浏览器里输入about:&lt;a%20href=mailto:lk007@163.com&gt;小金&lt;/a&gt;@&lt;a%20href=bbs.nettf.net&gt;网络技术论坛&lt;/a&gt; 看看效果），如果有个恶意的USH对象把“about”协议的解释权抢了过来，用户指定的空白页自然就会被带到某个不知名的地方去了。<BR>对于BHO造成的页面劫持，只要用清理BHO的方法去查找就可以了，而如果是被USH劫持，那么找起来会有点困难，由于USH对象并不像BHO组件会在前台出现蛛丝马迹，对一般用户而言会造成搜索困难，其实只要你理解了我在上文对USH机制的解释，要找到它们就不困难了，一些USH对象实施的是本地跳转，所以产生的页面会带有到自身文件的连接，用户只需查看页面源代码，然后搜索到“res://”开头的那个HTML元素，后面那一连串百分号和字符就是该USH的完整文件地址，它们是用Unicode编码过的，不要看到那一堆类似加密的字符串就退却了，既然浏览器能认识，那么我们也就能让它显示出来，只需要在IE浏览器的地址栏里输入这么一句脚本代码：“javascript:document.write(unescape('被Unicode编码的字符串'));”，浏览器就把它还原回可读字符串了，记下这个文件名去查找删除掉，“空白页劫持”就不复存在了，例如一个字符串为“'%62%62%73%2E%6E%65%74%74%66%2E%6E%65%74”，只需要在浏览器地址栏里输入“javascript:document.write(unescape('%62%62%73%2E%6E%65%74%74%66%2E%6E%65%74'));”，就可以知道它表示什么了，各位可以去试验一下亲自看看效果。<BR>如果是另一种稍微狡猾点的没有使用本地跳转代码的USH对象，以上方法就行不通了，但是我们也不用怕，由于Windows的注册表管理机制，任何USH对象都必须通过注册表项目来加载，因此只要运行REGEDIT，定位到以下注册表键：HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\URLSearchHooks，里面列出的项目就是可能被添加的USH入口，只要删除掉即可解除“空白页劫持”危机。<BR><BR><BR>3. 不该有你的世界——启动项的清理<BR>有时候，即使我们清理了恶意劫持，一重启机器，却发现它又回来了，或者由劫持带来的开机自弹广告恶意页面还是依旧出现，这是为什么呢？因为在注册表中，并不是只有与IE有关的地方才会被流氓软件改写的，另一处最常见的加载入口——启动项也常常被它们光临，恶意软件还会篡改这三个启动项目“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run”、“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run”和“HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices”，更高级的方法是建立“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\Run”项，然后从这里启动自身，由于系统配置实用程序并不会检测这个地方，所以常被一些新型后门钻了空子。<BR>如何快速筛选正常启动项和恶意启动项一直是普通用户最头痛的问题，俗话说“不打没有准备的仗”，平时我们必须记住系统常有的启动项，到时候就能迅速发现新增加的项目列表了，一般来说，最干净的系统启动项只有两个，甚至只有一个：<BR><!--QuoteBegin--></DIV>
<DIV class=quotetop>&nbsp;</DIV>
<DIV class=quotemain><!--QuoteEBegin-->
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">Windows 2000最少启动项：<BR>启动项目：Synchronization Manager&nbsp; 命令：mobsync.exe /logon&nbsp; 作用：系统数据管理同步<BR>启动项目：Internat&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 命令：Internat.exe&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 作用：输入法指示器<BR><BR>Windows XP/2003 最少启动项：<BR>启动项目：CTFMON&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 命令：CTFMON.exe&nbsp; &nbsp; &nbsp; &nbsp; 作用：输入法指示器<!--QuoteEnd--></DIV><BR><BR>对于XP/2003，默认情况下可能会有一些IME开头的启动项，但是这些项目完全可以删除掉。除了这几个项目，剩下的就是根据各人安装程序和设备时产生的相应管理启动项了，所以只能靠各用户平时的观察和记录来判断了，但是通常情况下，莫名其妙出现在Windows系统目录或者以一些Windows系统文件来命名的启动项90%不是什么好东西（如果你安装了涉及系统管理的程序组件除外）！例如svchost.exe、C:\WINDOWS\SYSTEM32\CApp.exe等，还有一些DLL类型的Hook组件靠Rundll32.exe进行自启动，例如某著名厂商的某某BHO就是这么做的，如果这里没能清理干净，那么下次启动的时候，你刚才辛苦清理的流氓们就又复活了。<BR><BR><BR>4.和李鬼的斗争——Winsock LSP的清除<BR>LSP全称为“Windows Socket Layered Service Provider”（分层服务提供商），这是Winsock 2.0才有的功能，它需要Winsock支持服务提供商接口（Service Provider Interface，SPI）才能实现，SPI是一种不能独立工作的技术，它依赖于系统商已经存在的基本协议提供商，如TCP/IP协议等，在这些协议上派分出的子协议即为“分层协议”，如SSL等，它们必须通过一定的接口函数调用，LSP就是这些协议的接口。<BR>近年来采用LSP技术进行浏览器劫持的恶意软件也慢慢浮出水面了，使用LSP的好处在于，这类浏览器劫持方案可以不分浏览器“种族”的进行，即使你不用IE，你的Opera、NC、Firefox等非IE内核的浏览器也难逃厄运，因为LSP是直接从Winsock获取信息的，而所有浏览器最终的数据传输都必须建立在Winsock接口上，所以一旦LSP层被恶意劫持，用户的所有请求都有可能被控制了。<BR>LSP服务接口位于注册表的“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2\Parameters\NameSpace_Catalog5\Catalog_Entries”项目内，所有接口都通过一串长数字项表示。普通情况下，系统就已经带有了两个LSP接口分别负责TCP/IP组件（rnr20.dll）和NTDS组件（winrnr.dll）的正常工作，而LSP劫持则是把自己加入该项目内，并把优先权提高（用长数字项表示），例如默认情况下TCP/IP组件的优先权为000000000001，如果发生了LSP劫持，恶意LSP可能会把自身改为000000000001，而系统原有的LSP项目就被往后推为000000000002等，以便数据包轮寻的时候能优先被恶意LSP处理。<BR>要清理LSP劫持不能简简单单的直接把鼠标往“NameSpace_Catalog5”项目上点“删除”完事，这样做以后你就会发现系统也不能使用任何网络功能了，因为系统自身也必须依赖两个内置的LSP进行工作，这种架构看起来的确很麻烦，但是如果微软连自己提出的技术自己都不去使用的话，还指望别人会用？<BR>所以，正确的清理步骤必须这样进行：<BR>&#61548; 确认LSP劫持已经发生，可以通过手工检查上文提到的注册表键值判断，或者使用HijackThis做一次全面扫描。<BR>&#61548; 查找并删除LSP驱动文件，可直接通过相应LSP项目的“LibraryPath”子项得到。<BR>&#61548; 删除相应的LSP组件项目，它是用一长串数字表示的。<BR>&#61548; 重命名正常的LSP组件项目，TCP/IP为000000000001，NTDS为000000000002，如果还有其他的话，依次排序。<BR>&#61548; 重启计算机，再用HijackThis扫描一下恶意LSP是否已经彻底清理掉。<BR><BR><BR>5.不得不恨——迎战驱动形式的浏览器劫持<BR>本来已经不想说这个恶心的东西了，看看“驱动”两个字，你想起了什么？没错，这是Rootkit的代名词！这个东西原本就不属于浏览器劫持范畴的，可是自从一些厂商和个人首次采用并尝到“甜头”后，这股风气逐渐蔓延开来，我不得不暗自庆幸如今能真正写出好用的Rootkit的人还没那么多，否则以后一般用户的日子更不好过了，这类劫持通常不做主要工作，它只负责隐藏恶意BHO文件、启动项和进程信息等，这样即使我们用上面的几个方法清理了流氓软件，几秒钟后它就又回来了，或者直接就不给你删除文件！既然为了损害用户利益把劫持技术研究到这种地步了，为何不去做正事呢？<BR><!--QuoteBegin--></DIV>
<DIV class=quotetop>&nbsp;</DIV>
<DIV class=quotemain><!--QuoteEBegin-->
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 5px; BACKGROUND: #f3f3f3; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #cccccc 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #cccccc 1px solid">知识回顾：什么是Rootkit<BR>随着安全技术的发展和计算机用户群的技术提高，一般的木马后门越来越难生存，于是一部分有能力的后门作者把眼光投向了系统底层——Ring 0。位于Ring 0层的是系统核心模块和各种驱动程序模块，所以位于这一层的木马也是以驱动的形式生存的，而不是一般的EXE。后门作者把后门写成符合WDM规范（Windows Driver Model）的驱动程序模块，把自身添加进注册表的驱动程序加载入口，便实现了“无启动项”运行，一般的进程查看器都只能枚举可执行文件EXE的信息，所以通过驱动模块和执行文件结合的后门程序便得以生存下来，由于它运行在Ring 0级别，拥有与系统核心同等级的权限，因此它可以更轻易的把自己隐藏起来，无论是进程信息还是文件体，甚至通讯的端口和流量也能被隐藏起来，在如此强大的隐藏技术面前，无论是任务管理器还是系统配置实用程序，甚至系统自带的注册表工具都失去了效果，这种形式的后门被称为Rootkit。<!--QuoteEnd--></DIV><BR><BR>要清理这类劫持并非HijackThis和其他同类软件能做到的了，手工查找也比较困难，这时候我们必须请出IceSword了，主要关心的位置是“进程”和“SSDT”（顺便提一下，IceSword也能看系统当前注册的BHO信息），注意找被IceSword标注为红色的项目，它们就是罪魁祸首，对于进程列表里的红色进程，先尝试用“结束进程”停止掉该进程运行，然后看看它还会不会“复活”，我不推荐用户直接删除红色进程的文件，因为这些进程虽然是被Rootkit出于某种目的隐藏起来的，但是它们也有可能是被Rootkit借来驻留的系统进程载体（例如线程注射），随便删除容易导致系统出错。<BR>确认没有红色进程后，我们来看“SSDT”，SSDT意为“系统服务描述表”，里面存放着最底层的接口函数，Rootkit要实现各种隐藏都要修改这个地方实现对系统底层函数的控制和转移，正常情况下SSDT的函数都是从ntoskrnl.exe导出的，如果有Rootkit控制了部分函数，在IceSword里就会表示为红色的，并且指出该函数被哪个文件掳走了（一些杀毒软件为了查杀Rootkit，也会在这里留下自己的痕迹，如卡巴斯基的klif.sys等，检查的时候要注意看文件版权信息以免误杀），我们先要记下该文件名，然后进入注册表的“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services”里查找该文件并删除对应的子项名称，重新启动计算机后再用IceSword检查，如果没有再出现红色，那么恭喜一下，这场反劫持战争我们终于胜利了！<BR><BR><BR>四. IE，为什么受伤的总是你<BR>也许是因为浏览器的访问直接代表着利益关系，所以越来越多人把眼光投向浏览器，使用户替代他们完成诸如访问流量、广告点击等工作，不知道继“网络钓鱼”、“浏览器劫持”以后，广大的网络用户明天又该会面对什么样的危机？<BR>浏览器的战争，会有休止的那一天吗？<BR></DIV>
<DIV class=quotemain>原文在<A href="http://bbs.nettf.net/forums/index.php?showtopic=48041">这里</A>。</DIV>]]></description>
</item><item>
<title><![CDATA[xboxcenter.dll等通过Winsock LSP方式运行的病毒的清除一例]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=16619</link>
<author>yth</author>
<pubDate>2006/7/14 11:29:12</pubDate>
<description><![CDATA[<P>&nbsp;&nbsp;&nbsp; 最近为同事的电脑清除病毒，通过HijackThis.exe检查清除了大多数恶意注册表项。发现有一个xboxcenter.dll位于winsock LSP（编号应该是010）中，于是使用lspfix.exe修复，并删除了xboxcenter.dll程序。</P>
<P>&nbsp;&nbsp;&nbsp; 修复后发现依然无法上网，再用WinsockXPFix.exe修复还是没用。郁闷...</P>
<P>&nbsp;&nbsp;&nbsp; 后来查询微软网站发现一篇文章：</P>
<P>&nbsp;&nbsp;&nbsp; <A href="http://support.microsoft.com/?scid=kb%3Bzh-cn%3B811259">如何确定 Winsock2 是否损坏并从损坏中恢复</A></P>
<P>&nbsp;&nbsp;&nbsp; 按要求执行netsh winsock reset提示出错，后试图删除注册表项：</P>
<P>&nbsp;&nbsp;&nbsp; HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock<BR>&nbsp;&nbsp;&nbsp; HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Winsock2</P>
<P>&nbsp;&nbsp;&nbsp; 第二项无法删除，超级郁闷...<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 终于找到问题！原来注册表项权限被修改，点右键加上权限后终于删除。<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; 重启后按文章介绍重装Tcpip后一切正常，又可以上网了。</P>
<P>&nbsp;&nbsp;&nbsp; over.</P>]]></description>
</item><item>
<title><![CDATA[Excel大写中文金额转换函数]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=13987</link>
<author>yth</author>
<pubDate>2006/4/30 12:48:30</pubDate>
<description><![CDATA[
<P>网上有不少关于如何把金额转换成大写中文的例子。有些是用公式，有些用VBA自定义函数。我发现有些用公式的转换的结果很好，可是使用总觉得不便。而用VBA的没找到转换很好的例子，于是参考网上的一些例子进行了修改。</P>
<P>源程序如下：&nbsp;</P>
<P>Function dx(q)<BR>&nbsp;&nbsp;&nbsp; ybb = Application.WorksheetFunction.Round(q * 100, 0) '利用Excel函数<BR>&nbsp;&nbsp;&nbsp; 'ybb = Round(Abs(q) * 100, 0) 'VBA函数与Excel函数对舍入算法有些不一样<BR>&nbsp;&nbsp;&nbsp; dx = IIf(ybb &lt; 0, "负", "") '符号<BR>&nbsp;&nbsp;&nbsp; ybb = Abs(ybb)<BR>&nbsp;&nbsp;&nbsp; y = Int(ybb / 100) '元<BR>&nbsp;&nbsp;&nbsp; j = Int(ybb / 10) - y * 10 '角<BR>&nbsp;&nbsp;&nbsp; f = ybb - y * 100 - j * 10 '分<BR>&nbsp;&nbsp;&nbsp; zy = Application.WorksheetFunction.Text(y, "[DBNum2]") '大写元<BR>&nbsp;&nbsp;&nbsp; zj = Application.WorksheetFunction.Text(j, "[DBNum2]") '大写角<BR>&nbsp;&nbsp;&nbsp; zf = Application.WorksheetFunction.Text(f, "[DBNum2]") '大写分<BR>&nbsp;&nbsp;&nbsp; If y &lt;&gt; 0 Then dx = dx &amp; zy &amp; "元"<BR>&nbsp;&nbsp;&nbsp; If j &lt;&gt; 0 Then dx = dx &amp; zj &amp; "角"<BR>&nbsp;&nbsp;&nbsp; If f &lt;&gt; 0 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If y &lt;&gt; 0 And j = 0 Then dx = dx &amp; "零"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dx = dx &amp; zf &amp; "分"<BR>&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If y &lt;&gt; 0 Or j &lt;&gt; 0 Then dx = dx &amp; "整"<BR>&nbsp;&nbsp;&nbsp; End If<BR>End Function<BR></P>
<P>关于Round函数在不同环境中的区别，可以参看微软的两篇文章：</P>
<P><A href="http://support.microsoft.com/default.aspx?scid=kb;en-us;194983" target=_blank>PRB: Round Function different in VBA 6 and Excel Spreadsheet</A></P>
<P><A href="http://support.microsoft.com/kb/196652/EN-US/">How To Implement Custom Rounding Procedures</A></P>]]></description>
</item><item>
<title><![CDATA[Excel中替换手工换行符]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=13355</link>
<author>yth</author>
<pubDate>2006/4/11 8:35:41</pubDate>
<description><![CDATA[<P>最近处理一个Excel文档，其中包含大量手工换行符（就是可以用Alt+Enter输入的那种），想去掉它们。</P>
<P>最后发现最简单的办法是在替换对话框中查找内容用Alt+数字小键盘10输入就是那个手工换行符，替换一切正常。</P>
<P>其实可以用Alt+数字小键盘输入一些特殊字符，在一些场合还是蛮有用的。</P>]]></description>
</item><item>
<title><![CDATA[【转贴】在Web网页上使用VBScript 和JScript]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7779</link>
<author>yth</author>
<pubDate>2005/8/12 21:39:06</pubDate>
<description><![CDATA[综述：本文讨论了VBScript和 JScript之间的区别，以及它们的使用场合。本文还讨论了： <BR>Visual InterDev中的VBScript 和JScript <BR>内联服务器脚本和&lt;Script&gt;单元 <BR>脚本执行顺序 <BR>如果你要编写一个Web网页就必须要编写一些脚本。幸运的是，你可以从几种脚本编写语言中选择一个。不幸的是，有这么多种语言可以选择，到底选哪一种呢？你应该怎么做？ <BR>或者，如果你获得了一个网页，它的脚本是用一种你不怎么使用的脚本语言编写的，你怎样才能够用这个脚本来增加一些新的功能呢？ <BR>在本文中，我将会讨论到这些问题。而首先，我会指导你如何用微软公司所提供的这两种脚本编写语言来进行工作。 <BR>Microsoft Visual Basic, Scripting Edition (VBScript). <BR>JScript,它是ECMAScript的Microsoft版本，是一组包括JScript 和JavaScript脚本编写语言的标准定义。 <BR>当然，还有其他的脚本编写语言，如Perl 和Rexx等。不过这里我着重介绍两种语言，微软公司在Internet Explorer和Internet Information Server (IIS)中为它们提供了ActiveX Scripting Language（ActiveX脚本编辑语言）引擎。 <BR>我还要讨论你何时需要在同一个网页中使用这两种语言（如你所见，这是完全可行的）。为了对你有所帮助，我列出了一系列有关的小问题，这些问题在你工作时必须牢记于心。 <BR>为了清楚地论述这个问题，我将从以下几个方面着手： 
<P></P>
<UL>
<LI>VBScript 和JScript之间的区别</LI>
<LI>如何在Visual InterDev中确定脚本语言？</LI>
<LI>在同一个网页中应用两种语言</LI>
<LI>更新脚本编辑语言</LI></UL><BR>VBScript 和JScript之间的区别 <BR>VBScript 和JScript之间最大的区别是它们的结构。VBScript 是Visual Basic的子集，如果你曾经用过Visual Basic或者是Visual Basic for Applications (VBA)，你就会觉得非常熟悉。不过它们并不是完全一样的，因为VBScript是特意为在浏览器中进行工作而设计的，它不包括一些在脚本这个范围以外的特性，如文件访问和打印等等。 <BR>而另一方面，JScript从一组编程语言如C, C++, 以及Java等之中脱离出来的。如果你以前曾经用过C或者是Java，那么JScript的结构你会觉得非常熟悉。即便你不知道这些语言也没有关系，JScript的结构一点也不难--它像C和Java一样方便而没有它们那么复杂。 <BR>注意：不管怎样，JScript和Java是完全不同的两种语言。Java是一种对于网页应用程序和非网页应用程序都可以使用的完全成熟的开发语言。而JScript是一种主要用于脚本编写的脚本语言。 <BR>JScript 和VBScript的任务是相同的--都是让你能够编写自己的Web网页。每种语言都支持一些别的语言不支持的特性，不过，这些差异还不足以自动划分两种语言的使用范围。 <BR>更有可能的是，你会基于一些其他因素来选择脚本语言，最大的原因也是最实际的原因：你将要使用的平台能够支持你所选择的语言吗？你编写的是客户端还是服务器？如果是服务器，你的用户会使用什么浏览器和服务器软件？ <BR>下面的文章中会详细介绍这两种脚本编写语言，并且会就在特殊的环境中选择什么样的脚本语言给出一点指导意见。 <BR>什么时候选择VBScript？ <BR>VBScript主要是用在微软公司的各种平台上。因此如果你想用VBScript来进行编写，你必须要使用下列几种脚本之一： <BR>服务器脚本。如果你想要用VBScript来编写服务器脚本（如在ASP网页中），这个服务器必须是Microsoft Internet Information Server (IIS)或者是其他的服务器。 <BR>客户端脚本。如果你想在浏览器脚本中用到VBScript，这个浏览器必须是Internet Explorer的一个版本。因为其他流行的浏览器可能不支持VBScript。 <BR>如果你使用的是Visual InterDev，那么你应该已经在使用IIS了（或是其他相同的服务器），因而用VBScript来编写服务器脚本不是问题。如果你使用的不是IIS，你要搞清楚该服务器是不是能够支持VBScript。 <BR>然而，如果你要建立的是一个公共Web站点，你无法控制其他人使用的浏览器，那么Internet Explorer只能用于客户端脚本这个限制就成问题了。不过，如果你是在浏览器已知的情况下用VBScript编写客户端脚本，这还是可行的。 <BR>如果你的目标平台能够支持VBScript，考虑一下下列因素再决定是否用VBScript来编写脚本： <BR>错误控制。在VBScript中有On Error Resume Next来对特殊情况给出说明。如果你编写的是服务器脚本，错误控制是非常重要的，因为脚本的运行是无人照顾的。 <BR>格式化。VBScript有这样的功能，能够轻易地把数据，数字和货币数据格式化。 <BR>在Internet Explorer中事件控制很方便，就像在Visual Basic中一样。在VBScript中也能够建立一个隐含的事件处理程序，这只需要用对象__事件结构形式来定义一项功能就行了，比如说Button1_onclick。不过在Internet Explorer中，JScript没有这项功能（但在其他的JScript主机上支持这项功能）。 <BR>什么时候选择JScript？ <BR>几乎所有允许编写脚本的浏览器都支持JScript。因此，如果你是为一个公共Web站点编写一个广泛散发的应用程序，用JScript来编写客户端脚本是很自然的选择。你还会发现，因为JScript应用得如此广泛（还有与它类似的JavaScript），是一种标准的脚本语言，你可以在书店里，也可以在网上找到很多有关的资源。 <BR>如果你想用JScript来编写服务器脚本，那么你应该检查一下你的服务器是否支持它。微软公司的IIS允许你用JScript来编写ASP网页的脚本，但这并不是所有的服务器都支持的。 <BR>影响到你做决定的其他因素还有： <BR>动态执行。JScript一个非常有力的特性是：它允许你在你的脚本内建立和执行脚本或者动态地进行评价。简而言之，在你的脚本中能够编写脚本。当你用DHTML进行工作时，这个特性是非常有用的，因为这样你就能够动态的操作DHTML的文档模型了。 <BR>面向对象。JScript使用的是一种基于原型的对象结构，它能够允许你在脚本中定义对象。你能够往对象的原型中加入方法和特性，扩展内置对象和定制对象。 <BR>使用JScript时的一个警告：JScript是区分大小写的，如果你仅仅使用过Visual Basic 或VBScript也许对此难以适应。 <BR>如果你是初学JScript，你还要知道如何用JScript来建立事件处理程序。在Internet Explorer 中，JScript会要求你链接到一个对象上，而这个对象又是与事件处理程序相连的。通常，只要在鉴别事件并且有处理程序功能的对象的标签栏中指明其属性就能够完成。如下例所示： <BR>在其他的主机上，你可以使用隐含的事件绑定，不过它要求的结构与VBScript中稍稍有所不同。 在JScript中约定的隐含处理程序是： <BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>function btnSave::onclick(){ <BR>// script here <BR>} <BR>&lt;/SCRIPT&gt; <BR>值得注意的是，在这两个例子中LANGUAGE这项属性是设置为"JavaScript"的。Internet Explorer对于"JScript" 和"JavaScript"这两个名字都认识，而许多其他的浏览器却只认识"JavaScript"，不认识"JScript" 。因此，为了保险起见，如果你不能确定该网页是用Internet Explorer来浏览，你最好用"JavaScript"。 <BR>要了解更多在JScript中建立事件处理程序的情况，请查看位于MSDN Library Online中的Microsoft Visual InterDev?文档。（要访问MSDN Library Online必须有MSDN Online Membership资格，这一资格是免费的，不过要简单的一次性的注册一下。） <BR>如何在Visual InterDev中明确所用的脚本编写语言？ <BR>不管你用什么语言来编写脚本，你必须要明确的指出来，这样主机才知道用什么脚本引擎来处理你的脚本。到底用什么语言来编写，取决于你是用内联服务器脚本来进行工作还是用&lt;SCRIPT&gt;块来工作（不管是客户端脚本还是服务器脚本），同时也取决于你所使用的Visual InterDev的版本。 <BR>为内联服务器脚本选择脚本语言 <BR>如果你使用的是IIS和ASP网页，你可以编写两类服务器脚本：内联脚本（在&lt;% %&gt;分隔符中的脚本）和在&lt;SCRIPT&gt;单元中的脚本。一般来说，用内联脚本你可以把结果插入到网页中的HTML中。相反，在&lt;SCRIPT&gt;单元中的脚本是用来建立从内联脚本中调用的功能和子程序的。 <BR>注意：要建立一个在&lt;SCRIPT&gt;单元中的脚本并让它运行起来像内联脚本也是可能的。也就是说，脚本所陈述的不是一项功能或者某个子程序的一部分。不过我们并不推荐这种做法。要知道更多的细节请看本文后面部分的"服务器脚本执行顺序"。 <BR>对于服务器和客户端脚本来说，为&lt;SCRIPT&gt;单元选择语言的方法是一样的。要知道详细情况请见本文后面部分的"为一个 &lt;SCRIPT&gt; 单元设置语言"。 <BR>在一个网页中所有的内联脚本要用同一种语言来编写。当你建立了一个新的ASP网页后，网页中会自动包含一个@指示，它指明了内联脚本的脚本语言。@指示可以像这样： <BR>&lt;%@ Language="VBScript" %&gt; <BR>@指示一定是网页中的第一行内联脚本命令。如果没有这个指示，IIS会缺省地指定用VBScript来作为内联脚本语言。 <BR>改变网页的内联脚本语言 <BR>在Visual InterDev 1.0中，可以对网页进行编辑把指示改变一下，设置一种新的语言，如"JavaScript."等。 <BR>在Visual InterDev 6.0中，右键点击网页后就会出现该网页的Properties对话框。然后在Default脚本语言下，选择一种新语言。经过应用之后，编辑器会在@指示中更新为相应的脚本语言。当然，如果你愿意，你也可以自己手动编辑@指示。 <BR>你还能够为所有的新ASP网页更换缺省值。这个操作不能够改变现在的网页，不过它对你从现在起建立的所有网页都会有用。 <BR>为内联脚本更换缺省语言 <BR>在Visual InterDev 1.0中，从工具菜单中选择Options选项，然后再选择HTML一栏。在Active Server Pages的缺省脚本语言处选择一种语言。 <BR>在Visual InterDev 6.0中，右键点击Project Explorer中的项目名字，然后选择Properties。选择Editor Defaults一栏，然后在缺省脚本语言处选择一个新的缺省值。 <BR>为&lt;SCRIPT&gt;单元设置语言 <BR>与内联服务器脚本不一样的是，你在&lt;SCRIPT&gt;单元中所使用的脚本语言在同一个网页中可以有很多种。如果某一块是用VBScript来编写的，那么另一块也可以用JScript。（记住，不是所有的平台都支持VBScript。） <BR>注意：在同一个网页中混合几种语言有很多注意事项，详细内容请见本文后面部分的 "在同一个网页中用几种不同的语言来工作"。 <BR>为一个&lt;SCRIPT&gt;单元指定语言 <BR>在&lt;SCRIPT&gt;标记中包含了一个LANGUAGE单元，它指明了你所要使用的语言。例如，在下面这个&lt;SCRIPT&gt;标记中就指明了该&lt;SCRIPT&gt;单元中的所有脚本都要用JScript编写： <BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>function test(){ <BR>alert("testing"); <BR>} <BR>&lt;/SCRIPT&gt; <BR>注意：在IIS的服务器脚本中要求有LANGUAGE属性。而在客户端脚本中它只是一个选项。如果LANGUAGE属性没有了，处理程序会使用缺省的脚本语言。在Internet Explorer的客户端脚本中，缺省值通常是第一个&lt;SCRIPT&gt;单元的脚本语言，或者如果还没有指明任何语言，那就是JScript了。我们建议你最好不要依赖于缺省值，最好是为&lt;SCRIPT&gt;单元明确地设置一种脚本语言。 <BR>在一个&lt;SCRIPT&gt;单元中，你不能把VBScript 和JScript混合起来使用。如果你想同时使用它们，在你的网页中你必须至少有两个&lt;SCRIPT&gt;单元。 <BR>Visual InterDev 1.0 和Visual InterDev 6.0都提供了能够自动生成脚本的工具。在Visual InterDev 1.0 中有Script Wizard可以帮助你。而在Visual InterDev 6.0中有下列产生脚本的工具： <BR>Script Block命令。只要你在网页中点击右键，出现的菜单中就会有这个命令。它能够在你点中的那一点插入一个&lt;SCRIPT&gt;单元的框架。 <BR>Script Outline命令。当你双击事件的名字时它就会建立一个事件控制器的框架。在你的设置的基础上，不同的脚本生成工具会决定你所要用的语言。你可以在个别网页中为脚本工具而改变缺省的语言种类。 <BR>在Visual InterDev 1.0中为Script Wizard设置语言 <BR>从Tools菜单中选择Options选项，然后选择HTML栏。在Script Wizard的缺省脚本语言中选择一种语言。 <BR>在Visual InterDev 6.0中为脚本生成工具设置一个网页中的语言 <BR>首先，右键点击网页，网页的Properties对话框出现。然后在缺省脚本语言下选择一种新的语言。你能够为服务器脚本和客户端脚本设置同一种语言。 <BR>注意：为产生服务器脚本块而作出的设置一样可用于为内联脚本设置语言。如果你想在内联脚本中使用一种语言，而在用工具产生的服务器脚本块中使用另外一种语言，你只能手工地进行语言改换。 <BR>你还可以改变你的项目的缺省值，这样你建立起来的所有网页都会有与脚本工具一样的缺省语言设置。 <BR>在Visual InterDev 6.0项目中改变脚本生成工具的缺省语言设置 <BR>在Project Explorer中右键点击项目的名字，然后选择Properties。选择Editor Defaults，在缺省脚本语言处选择一个新的缺省值。 <BR>注意：已产生的服务器脚本块语言的设置方法同样可以用于为内联脚本设置语言。如果你想在内联脚本中使用一种语言，而在用工具产生的服务器脚本块中使用另外一种语言，你只能手工地进行语言改换。 <BR>想知道Visual InterDev 6.0中脚本生成工具的更多信息，请查看位于MSDN Library Online中的"Choosing a Scripting Language"和Visual InterDev 6.0文档中的 "Handling Events with HTML Elements"。 <BR>在同一个网页中同时使用几种语言 <BR>我想我已经说得很清楚了，在同一个网页中可以使用不同的脚本编写语言。让 再回顾一下：为什么你想这么做？以下是几个原因： <BR>第一个原因是：你只是想在一个程序中利用某种语言的优点，而脚本的其他部分还是用另外一种语言来编写。 <BR>第二个原因是：可能你所面对的现有编码是用你不熟悉的语言来编写的。例如，设计时间控制是用JScript编写的，而你熟悉的语言却是VBScript。在大部分情况下，你可以在同一个网页中混合几种脚本语言并且它们相互之间能够配合得很好。用一种语言编写的脚本可以调用用另外一种语言编写的程序并且能够共享全局变量。不过有时候还是会出现一点小问题，现在我将要就此说明一下。 <BR>在一个VBScript调用中的括号 <BR>当你从VBScript中调用一个JScript函数时，注意在调用过程中要有括号，即使这项函数不要求设置参数也需如此。例如，一个调用应该像这样： <BR>retVal = callJSFunction() <BR>如果你忘记了加括号，那么这个函数所返回的值就不是你所希望的值，而是一个包含了函数本身的目标。 <BR>服务器脚本的执行顺序 <BR>内联服务器脚本按顺序运行，从头到尾。你可以在一个服务器脚本中定义一个可调用的程序（函数或者是子程序），这样的话，如果需要就可以随时调用它们。 <BR>所有的内联脚本必须用同一种语言来编写，也就是在网页前面的@指示中所指明的脚本语言。因此，在一个内联脚本中你不能把几种脚本语言混合起来。 <BR>你也许会说"等一等"。在理论上，把内联脚本放到&lt;SCRIPT&gt;单元中是绝对可能的--也就是说只要在单元中的脚本不是一个函数或者一个子程序就可以了。就像下例一样： <BR>&lt;% Response.Write("Some inline script&lt;BR&gt;")%&gt; <BR>&lt;SCRIPT LANGUAGE="VBScript" RUNAT="Server"&gt; <BR>Response.Write("Script in a SCRIPT element&lt;BR&gt;") <BR>&lt;/SCRIPT&gt; <BR>是的，你可以这么做。但是，这样你就会被IIS ASP处理程序的执行顺序控制。例如，如果你建立了服务器脚本并且在IIS 4.0中运行它，你会发现执行顺序是这样的： <BR>采用非缺省语言的&lt;SCRIPT&gt;单元脚本 <BR>内联脚本 <BR>采用缺省语言的&lt;SCRIPT&gt;单元脚本 <BR>以上的顺序在很大程度上依赖于ActiveX语言引擎的载入顺序，同时IIS 中的ASP处理程序可能在将来会有所改变，因此，我们很不希望你按照这个顺序进行工作，不管你是只把&lt;SCRIPT&gt;单元用于函数或者子程序，还是把它仅仅用于执行顺序无关紧要的编码。 <BR>脚本块的顺序 <BR>当你把几种语言混合使用时，&lt;SCRIPT&gt;块在网页中出现的顺序非常重要，有时候会影响到它们是否能正常工作。看看下面这个简单的例子，它是在一个内联的VBScript脚本中调用一个用JScript编写的函数： <BR>&lt;SCRIPT LANGUAGE="VBScript"&gt; <BR>' Calls a JScript function <BR>aNumber = 2 <BR>doubledNumber = doubleMe(aNumber) <BR>document.write("The answer is " &amp; doubledNumber) <BR>&lt;/SCRIPT&gt; <BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>function doubleMe(aNumber){ <BR>return aNumber * 2; <BR>} <BR>&lt;/SCRIPT&gt; <BR>它不会起任何作用。说得更明白一点就是，文档写入说明会往网页中写入一个空的字符串。为什么？很简单，在处理VBScript块时，下面的JScript &lt;SCRIPT&gt;块没有被读出来，没有进行语法分析，因此网页不能使用它。而当浏览器处理网页中的脚本块时，它是从上往下进行的。 <BR>在这个例子中，只需要调换一下脚本块的顺序就能够解决这个问题了。事实上，这类问题并不那么常见，在大多数情况下，&lt;SCRIPT&gt;中包含的函数和子程序只有当整个网页被全部下载下来并且所有的单元都可以使用之后才能够被调用。不过，你还是要记住，网页是按照一定的顺序来处理的，不同语言的&lt;SCRIPT&gt;块是分别处理的。 <BR>区分大小写以及命名习惯 <BR>JScript能够区别大写和小写：在每个JScript的关键字，还有JScript姓名空间的所有部分中，你可以把大写和小写字母恰当的结合起来使用。这其中包括了你使用的对象模型中所有的关键字。例如，当你使用ASP Response对象时，必须正确地使用大写或小写字母（如Response.Write），否则JScript 会坚决不予承认。同样的，如果你为DHTML onclick事件编写一个处理程序时，如果用在Visual Basic中经常使用的形式JScript可能就不会承认。 <BR>VBScript当然是不区分大写和小写字母的。在某种程度上，这种不计较大小写的忽视甚至在你用VBScript对JScript编写的单元进行访问时都适用。下面几个小例子中给出了两个脚本。第一个是用JScript编写的，其中还包括了一个全局变量（ctr）和一个小小的函数（doubleMe）。第二个脚本是用VBScript编写的，它是一个按钮处理程序，它能够调用JScript函数，并且报告全局变量的值。 <BR>&lt;SCRIPT LANGUAGE=javascript&gt;var ctr;function doubleMe(aNumber){ // Initialize value of global counter if(parseInt(ctr)){ <BR>ctr = ctr + 1;} <BR>else{ <BR>ctr = 1; <BR>} <BR>return aNumber * 2; <BR>} <BR>&lt;/SCRIPT&gt; <BR>&lt;SCRIPT LANGUAGE="vbscript"&gt; <BR>Function btn1_onclick() <BR>numberToDouble = 12 <BR>alert("The doubled number = " &amp; DoubleMe(numberToDouble)) <BR>alert("You have doubled the number " &amp; Ctr &amp; " times.") <BR>End function <BR>&lt;/SCRIPT&gt; <BR>在VBScript脚本中，很明显，我在提到doubleMe 函数和ctr变量时，没有正确使用字母的大小写，但是程序依然运行良好。 <BR>这是一个好消息。而坏消息就是，在下面这些情况下你一定要注意字母的大小写： <BR>如果网页中的JScript脚本所包含的单元只能够通过字母的大写和小写来区分，例如，一个叫做Timer()的函数和一个叫做timer的全局变量等等。记住，尽管这种编码方式不怎么好，但是有时候在你的网页中还是可能会遇到原来就存在的编码。 <BR>如果你在一个函数调用中把JScript单元的名字作为一个字符串参数来使用 <BR>如果JScript包括的单元仅仅能够用字母的大小写来区分，那么VBScript就会让你把它们看成一样的（也就是说，不区分大写和小写）。VBScript只能看看不管大小写的区别，它们是不是一样，因此它识别出的只有一个JScript单元。换一句话说，如果VBScript首先找到的是叫做Timer()的函数，那么它就无法找到叫做timer的全局变量了，反之也是一样。即便你在VBScript编码中十分注意的把它们做了区别结果也是一样。因为VBScript在处理这些名字的时候认为它们只有一种写法。不幸的是，这里没有其它的解决方法，除非在JScript的代码中不利用这些大小写之间的微小差别来区分不同的函数名称。 <BR>除了在某些特殊的情况下，把单元名作为参数使用这种问题并不常见。特殊情况之一是在Visual InterDev 6.0中的脚本对象模型中。下面我会把它作为一个例子来使用，你可以把它看作是相同情况下的处理准则。 <BR>Visual InterDev 6.0的脚本对象模型都是用JScript来编写的。你也可以用VBScript来编写自己的编码，它能够与用VBScript区分大小写方式编写的脚本对象模型一起使用。有时候，你不能够直接调用某一方法，除非你把这个方法的名称传递到一个JScript函数中，而由函数来为你调用这个方法。 <BR>一个典型的例子就是警告方法，你可以用它把一个方法绑定到一个特殊的事件上。在下面这个例子中，一个按钮的onmouseover事件被绑定到changecaption()事件处理程序上。 <BR>&lt;SCRIPT LANGUAGE="VBScript"&gt;Function setAdviseMethods() <BR>Btn1.advise("onmouseover", "changecaption()") <BR>End Function <BR>&lt;/SCRIPT&gt; <BR>因为你把这些名字作为字符串传送到一个JScript函数中，所以你能够得到正确的大小写表示。稍后，JScript会自动用它的区分大小写的规则来重新评估这些名字，如果大小写不正确，它会找不到它们。 <BR>从VBScript 往JScript中传送数组 <BR>有时候一个VBScript程序会传送一个数组作为它的一个参数，或者作为它的返回值。你可以从JScript中调用这个程序，不过必须把VBScript 数组转换成为一个可用的JScript 数组。你只要在JScript 函数中建立一个VBArray 对象并且用toArray把它转换成为一个JScript数组就可以了。 <BR>注意：JScript不支持多维数组，如果原来的VBScript数组是多维的，经过toArray的转换后它会成为一个一维的JScript数组。 <BR>在下面的例子中有一个VBScript 脚本，它建立了一个数组，还有一个JScript脚本，它将说明如何才能获得并使用这个数组： <BR>&lt;SCRIPT LANGUAGE="VBSCRIPT"&gt; <BR>Function makeArrayVB() <BR>' Creates a VBScript array <BR>dim anArray(1,1) <BR>anArray(0,0) = "0,0" <BR>anArray(0,1) = "0,1" <BR>anArray(1,0) = "1,0" <BR>anArray(1,1) = "1,1" <BR>makeArrayVB = anArray <BR>End Function <BR>&lt;SCRIPT LANGUAGE="JavaScript"&gt; <BR>// Accesses a VBScript array within a JScript script <BR>function getVBArray(){ <BR>var arrayObj; <BR>var jsArray; <BR>arrayObj = makeArrayVB(); <BR>jsArray = VBArray(arrayObj).toArray(); <BR>alert("VBScript array length = " + jsArray.length); <BR>// Displays the contents of the array <BR>for(i=1;i&lt;=jsArray.length;i++){ <BR>alert(jsArray[i-1]); <BR>} <BR>} <BR>&lt;/SCRIPT&gt; <BR>不过，在目前的VBScript（4.0）中，反过来是无法做到的。也就是说你不能把一个JScript 数组转换成为VBScript数组。如果你遇到的是一个JScript程序，要转换数组，你可以选择一下几种做法： <BR>用JScript编写调用程序 <BR>用VBScript 重新编写JScript程序 <BR>如果可能，把JScript 数组转换成一种不同的结构，如转换成一个限制的字符串等，这样VBScript 就能够使用了。例如，你可以用toString 函数把一个数组转换成一个用逗号分隔的，无限制的字符串。这样，在VBScript中你就能够用Split函数把它分成不同的单元。很明显这种方法在很多时候并不管用，不过有时又的确有效。 <BR>更新脚本语言 <BR>VBScript和 JScript都不是一成不变的语言。两种语言的引擎都定时进行更新，增加一些新的特性，解决已经发现的问题。因为两种语言实际上都是作为ActiveX组件来应用的，所以每当你更新任何控制器时，你就可以同时更新它们。当你安装了新的语言引擎之后，任何需要调用引擎的应用程序会在它们运行某些脚本时调用这个新引擎--这些引擎包括Internet Explorer 或Visual InterDev等。 <BR>如果要了解语言引擎的情况以及如何更新的方法，还有脚本的一般知识，请访问Microsoft Scripting Web站点，网址是：<A href="http://msdn.microsoft.com/scripting/">http://msdn.microsoft.com/scripting/</A>。同时，祝你编写脚本时一切顺利！ <BR>如果有问题，请发e-mail给我们。 <BR>如果有技术问题，请阅读有关技术支持的部分。 <BR>]]></description>
</item><item>
<title><![CDATA[可以crack的GoogleEarthPro下载]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7772</link>
<author>yth</author>
<pubDate>2005/8/12 12:19:23</pubDate>
<description><![CDATA[
<P>由于google升级了GoogleEarthPro，直接从google下载的GoogleEarthPro无法crack，网上也到处都是新版的了。</P>
<P>应有些朋友要求，我特意申请了免费空间，把我收藏的GoogleEarthPro放了上去，有喜欢的就去那里下载吧。</P>
<P>另外我把中国县级以上城市的kml文件也上传到了那里，以后可能会有更多的kml。</P>
<P>希望网友们也能把自己的kml贡献出来。</P>
<P>地址：<A href="http://free.ys168.com/?google-earth">http://free.ys168.com/?google-earth</A></P>]]></description>
</item><item>
<title><![CDATA[maps.google.com卫星图像已经更新到第三版]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7771</link>
<author>yth</author>
<pubDate>2005/8/12 12:13:06</pubDate>
<description><![CDATA[
<P>我的Maps Google览胜中图片失效了（因为是直接做的连接）。</P>
<P>下一步打算用javascript动态生成，可惜该blog主页面不能做javascript调用。</P>]]></description>
</item><item>
<title><![CDATA[收集正则表达式备忘]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7747</link>
<author>yth</author>
<pubDate>2005/8/10 20:02:08</pubDate>
<description><![CDATA[&nbsp;Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,<BR>&nbsp;Phone : /^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$/,<BR>&nbsp;Mobile : /^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$/,<BR>&nbsp;Url : /^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&amp;_~`@[\]\':+!]*([^&lt;&gt;\"\"])*$/,<BR>&nbsp;IdCard : "this.IsIdCard(value)",<BR>&nbsp;Currency : /^\d+(\.\d+)?$/,<BR>&nbsp;Number : /^\d+$/,<BR>&nbsp;Zip : /^[1-9]\d{5}$/,<BR>&nbsp;QQ : /^[1-9]\d{4,8}$/,<BR>&nbsp;Integer : /^[-\+]?\d+$/,<BR>&nbsp;Double : /^[-\+]?\d+(\.\d+)?$/,<BR>&nbsp;English : /^[A-Za-z]+$/,<BR>&nbsp;Chinese :&nbsp; /^[\u0391-\uFFE5]+$/,<BR>&nbsp;Username : /^[a-z]\w{3,}$/i,<BR>&nbsp;UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&amp;\*\.\(\)\[\]\{\}&lt;&gt;\?\\\/\'\"]*)|.{0,5})$|\s/,<BR>以上来自<A href="http://www.blueidea.com/bbs/newsdetail.asp?id=1834871">http://www.blueidea.com/bbs/newsdetail.asp?id=1834871</A>]]></description>
</item><item>
<title><![CDATA[找到一个Google Earth pro的破解文件]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7667</link>
<author>yth</author>
<pubDate>2005/8/5 16:41:58</pubDate>
<description><![CDATA[
<P>终于可以在pro里划线和多边形了。</P>
<P><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/200585164517775.RAR" target=_blank>GoogleEarthPro Crack.rar</A></P>
<P><A href="http://desktop.google.com/download/earth/GoogleEarthPro.exe">GoogleEarthPro</A></P>]]></description>
</item><item>
<title><![CDATA[利用maps.google.com看遍全国城市（县级以上）]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7574</link>
<author>yth</author>
<pubDate>2005/8/1 13:36:39</pubDate>
<description><![CDATA[<P>最近一直在利用空余时间玩Google Earth，得知她的kml文件其实就是xml文件。在网上查到一个全国县级以上城市的经纬度数据，于是编制了一个小程序生成了kml文件，在Google Earth上驰骋了一番。突然想起能不能利用kml文件生成到Maps.google.com的连接。于是上网查了关于xml动态生成树型列表的相关方法，自己动手修改了一下，终于成功。</P>
<P>其次想到能否把这玩意儿放到这个Blog上，一试发现正文中不能夹带Javascript，放弃。后来想到把它放到模版中，成功了。各位可以试试，在左侧导航栏最下面。</P>
<P>&nbsp;以后有什么好的kml文件可以方便的放上来了。</P>]]></description>
</item><item>
<title><![CDATA[Google 地图相关资料链接]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7387</link>
<author>yth</author>
<pubDate>2005/7/23 8:01:18</pubDate>
<description><![CDATA[
<P><A href="http://soft.yesky.com/tools/132/2037132.shtml" target=_blank>Google Earth三维地图服务使用详解</A></P>
<P><A href="http://forum.xitek.com/showthread.php?threadid=300323" target=_blank>旅游用google earth 地点标注及文件(kmz文件)交流区</A></P>
<P><A href="http://rss.blogchina.com/feed.4750.html" target=_blank>狗眼看世界</A></P>
<P><A href="http://www.googlesightseeing.com/" target=_blank>Google Sightseeing</A></P>
<P><A href="http://earth.google.com/index.html" target=_blank>http://earth.google.com/index.html</A>&nbsp;Google Earth主站，可以下载Google Earth软件，一些KMZ文件。</P>
<P><A href="http://www.keyhole.com/kml/kml_doc.html" target=_blank>KML 技术文档</A></P>
<P><A href="http://virtualearth.msn.com/" target=_blank>virtualearth微软的虚拟地球</A></P>
<P><A href="http://www.7tour.us/books/wwge/wwge.htm" target=_blank>由NASA World Wind / Google Earth看未來GIS的趨勢(上)</A></P>
<P>补充中，欢迎提供链接。</P>]]></description>
</item><item>
<title><![CDATA[为我的Blog增加了sina天气预报]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7332</link>
<author>yth</author>
<pubDate>2005/7/20 9:21:11</pubDate>
<description><![CDATA[
<P>代码：</P>
<DIV class=HtmlCode title=点击运行该代码！ style="CURSOR: pointer" onclick="preWin=window.open('','','');preWin.document.open();preWin.document.write(this.innerText);preWin.document.close();" ;>
<P>&lt;IFRAME border=0 src="http://weather.sina.com.cn/iframe/weather/330601_w.html" frameBorder=0 width="100%" height=160&gt;&lt;/IFRAME&gt;</P></DIV>
<P>调整布局后，ok。</P>
<P>其中330601应该就是所在地地区编码（身份证前六位），替换即可。</P>]]></description>
</item><item>
<title><![CDATA[纽约世贸中心遗址]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7306</link>
<author>yth</author>
<pubDate>2005/7/18 21:35:41</pubDate>
<description><![CDATA[
<DIV style="FONT-SIZE: 1px; WHITE-SPACE: nowrap"><IMG src="http://kh.google.com/kh?v=3&t=tqstqrqrrqsqrrrrq" border=0></DIV><A href="http://maps.google.com/maps?ll=40.711126,-74.013433&amp;spn=0.009805,0.012802&amp;t=k&amp;hl=en">http://maps.google.com/maps?ll=40.711126,-74.013433&amp;spn=0.009805,0.012802&amp;t=k&amp;hl=en</A>]]></description>
</item><item>
<title><![CDATA[抗议GoogleEarth显示的藏南边界]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7278</link>
<author>yth</author>
<pubDate>2005/7/17 22:09:34</pubDate>
<description><![CDATA[
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt=GoogleEarth藏南边界 src="http://blogger.org.cn/blog/uploadfile/200571722118306.JPG" border=0></P>
<P>争议地区已经归入印度。</P>
<P>藏西争议区却如实画出：</P>
<P><IMG style="BORDER-LEFT-COLOR: #000000; BORDER-BOTTOM-COLOR: #000000; BORDER-TOP-COLOR: #000000; BORDER-RIGHT-COLOR: #000000" alt=GoogleEarth藏西争议区 src="http://blogger.org.cn/blog/uploadfile/2005717223538704.JPG" border=0></P>
<P>建议Google完善Google Earth软件，设置争议界，否则中国人难以接受。</P>]]></description>
</item><item>
<title><![CDATA[罗马斗兽场]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7220</link>
<author>yth</author>
<pubDate>2005/7/14 11:55:33</pubDate>
<description><![CDATA[<DIV style="FONT-SIZE: 1px;white-space: nowrap;"><img border="0" src="http://kh.google.com/kh?v=2&t=trttqrqtqrrstqtqss"><img border="0" src="http://kh.google.com/kh?v=2&t=trttqrqtqrrstqtrtt"></DIV>
<DIV style="FONT-SIZE: 1px;white-space: nowrap;"><img border="0" src="http://kh.google.com/kh?v=2&t=trttqrqtqrrstqttrr"><img border="0" src="http://kh.google.com/kh?v=2&t=trttqrqtqrrstqtsqq"></DIV>
<A href="http://maps.google.com/maps?ll=41.891116,12.490650&spn=0.005066,0.007308&t=k&hl=en">http://maps.google.com/maps?ll=41.891116,12.490650&spn=0.005066,0.007308&t=k&hl=en</A>]]></description>
</item><item>
<title><![CDATA[伊瓜苏瀑布]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=yth&amp;id=7215</link>
<author>yth</author>
<pubDate>2005/7/14 10:22:56</pubDate>
<description><![CDATA[
<DIV style="FONT-SIZE: 1px; WHITE-SPACE: nowrap"><IMG src="http://kh.google.com/kh?v=2&amp;t=ttrqsrqtrqsqqq" border=0><IMG src="http://kh.google.com/kh?v=2&amp;t=ttrqsrqtrqsqqr" border=0></DIV>
<DIV style="FONT-SIZE: 1px; WHITE-SPACE: nowrap"><IMG src="http://kh.google.com/kh?v=2&amp;t=ttrqsrqtrqsqqt" border=0><IMG src="http://kh.google.com/kh?v=2&amp;t=ttrqsrqtrqsqqs" border=0></DIV><A href="http://maps.google.com/maps?ll=-25.677109,-54.486523&amp;spn=0.081050,0.116927&amp;t=k&amp;hl=en">http://maps.google.com/maps?ll=-25.677109,-54.486523&amp;spn=0.081050,0.116927&amp;t=k&amp;hl=en</A>]]></description>
</item>
</channel>
</rss>