打印服务spoolsv.exe应用程序错误解决方法

打印服务spoolsv.exe应用程序错误以及该内存不能为read或该内存不能为written的问题,首先排除病毒,建议使用杀毒软件清理一次电脑,当然如果电脑内有spoolsv.exe这个进程也不用害怕,因为这个是打印机服务程序,意外终止这个程序将导致打印机不可用,当然不排除有病毒伪装成spoolsv.exe,所以先提示清理病毒。

排除病毒问题后,看看是不是因为打印队列文件损坏导致的,参考微软官方的 《当打印队列文件被破坏时 spoolsv.exe 进程的 CPU 占用率很高》 解决方案:

当打印队列文件损坏时,Print Spooler 服务的进程 spoolsv.exe 可能会导致很高的 CPU 占有率,同时无法继续执行打印过程。重新启动 Print Spooler 服务也不能解决上述问题。当用户尝试打印文件时,如果位于 %SystemRoot%\System32\spool\PRINTERS 目录下的打印队列文件 SHD 或 SPL 的文件内容损坏,导致 Print Spooler 服务无法完成正常的打印操作,可能导致 Print Spooler 服务的进程 spoolsv.exe 进行反复的尝试,进而占用大量的 CPU 占有率,这个现象有可能导致系统挂起。

解决方法如下:

  1. 单击开始,单击运行,键入mmc,然后单击确定。
  2. 在文件菜单上,单击添加/删除管理单元。
  3. 依次单击添加、计算机管理、添加,然后单击完成。
  4. 单击关闭,然后单击确定。
  5. 依次展开计算机管理和“服务和应用程序”,然后单击服务。
  6. 右键单击 Print Spooler,然后单击停止。
  7. 单击开始,单击运行,在打开框中键入 %SystemRoot%\System32\spool\PRINTERS,然后单击确定。
  8. 删除 %SystemRoot%\System32\spool\PRINTERS 目录下的所有文件。
  9. 选择服务窗口,右键单击 Print Spooler,然后单击启动。
  10. 重新执行打印操作。

上面是微软的官方办法,如果说问题还没有解决的话,那么先停止Print Spooler服务,然后从别的电脑C:\WINDOWS\system32上拷贝一个spoolsv.exe到自己的C:\WINDOWS\system32目录里。然后重新启动Print Spooler服务,如果问题依旧的话,请放入原版的Windows XP光盘(非Ghost版),然后点击开始-运行-输入cmd 确认,打开命令提示符,然后输入命令sfc /SCANNOW进行系统文件修复。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • 系统故障
  • 打印机

视频出现Codec Error: Use Windows Media Player提示

某近期热门电影,AVI格式,近1GB,下载好了后播放出现一个十几秒的画面,并且有一行字Codec Error: Use Windows Media Player,稍后出现Aborting Video, Redirecting to Microsoft Codec Download Page,我没有用WMP播放,当我改用WMP播放时,弹出一个浏览器窗口,貌似所指向的网站没能打开,我看了下网址不是Microsoft的,所以判断前面画面的说明是骗人的,那这究竟是怎么回事呢?

我搜索了网络,找到这么一个帖子 《Codec Error: Use Windows Media Player》 。其中摘录VLC_help所提到“You have downloaded trojan videos. I would suggest removing them and doing virus and spyware scans to your computer.”,以及Lotesdelere所提到“These videos are 'hacked' videos that contain scripts which can be executed by WMP only. The purpose of this is to force you to be redirected to another site and/or to download some stuff in the background.If you can't play them in WMP then it's a good sign meaning that your Windows and WMP are correctly patched with the latest security updates.Anyway you should delete these videos as soon as possible because they may compromise the security of your computer if they are played in WMP.”

意思很明显了,这是个植入了木马脚本的视频,因为相关木马窗口只有使用Windows Media Player播放时才会弹出来,而木马即是所谓的“解码器”,诱导用户下载并执行,我后来用杀毒软件一扫描,果然判断是病毒并自动删除了。

最后批评下某杀毒软件,反应能力这么弱,我不扫描还检测不出来,还好那木马网站被屏蔽了,当然即使木马网站能打开我也不会去下载滴,因为不像是微软网站的风格嘛:-)

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • 视频
  • 播放器
  • 木马病毒

JavaScript让登录或搜索文本框自动获得焦点

这确实是个值得注意的细节,今天在XX网站登录界面上遇到了,就先记录下来了,每个网页都有其专注的功能,有的专注于文章资讯等信息呈现,有的专注于视频播放,有的专注于登录,今天要说的就是专注于像登录或搜索等类似功能的网页,打开这一类页面,你会发现有些做得比较好的页面,输入焦点会自动落在要填写信息的第一个文本框里,这样我们就不需要再点击鼠标让此类文本框获得焦点了,这样无形中为用户减少了一步点鼠标的操作,易用性就显著增强了,当然这类效果都是由JavaScript脚本实现的,具体的实现方式也很简单,即使用Obj.focus()方法,使Obj对象获取焦点,但是在实际操作中还是有很多方面需要注意的。

首先,我们要获取文本框对象,这就注定了我们这段脚本必须在文本框渲染完成后才执行,参考多数登录框的设计方案,这类脚本一般都是放在HTML的最后部分,位置在</body>之前,这样在input加载完成后才执行脚本,避免找不到对象的问题。

其次,Obj.focus()方法需要延时调用,并不等于说我们input文本框呈现出来就可以立即设置focus焦点,大部分情况下这样做也许可以成功,但是多测试几次你会发现有时焦点并不能成功设置,这里的原因是某些浏览器在input文本框渲染完成后不能立即为文本框启用获得焦点的特性,所以我们需要做一定的延时,在JavaScript里延时的方式是通过setTimeout函数,时间设置大概在200毫秒即可(参考WordPress的后台登录)。

最后,即使我们采用延时等措施,仍然会有小几率的情况导致无法获取焦点甚至让脚本执行出错,所以我们需要用try {} catch {} 屏蔽错误,无法获取焦点是小事,脚本出错就坑爹了。下面是实现的代码:

<!DOCTYPE html>
<html>

<head>
<title>文本框获取焦点</title>
</head>

<body>

<p>
<input type="text" id="userName" />
</p>
<script type="text/javascript">
setTimeout( function(){
  try{
    document.getElementById('userName').focus();
  } catch(e){}
}, 200);
</script>

</body>
</html>

后来发现WP的登录页面除了focus还有select方法,原来在用户名记住的情况下,用户名文本框获得焦点后如果我们要清除原先的用户名,只有移动方向键或者使用鼠标选中然后删除,而select正好替我们做了选中这个事情,要输入就直接输入就行了,以上面的HTML为参考,具体的代码如下:

setTimeout( function(){
  try{
    var t = document.getElementById('userName');
    t.focus();
    t.select();
  } catch(e){}
}, 200);

END

Posted in:
  • 前端开发与用户体验
  • Web开发及相关
Tagged
  • javascript
  • 文本框

某些场景下请不要省去URL链接地址后的斜杠

今天在访问某个博客时,看到某位网友评论上留的网址类似于这样http://wangye.org/blog(这里以我的博客作为例子),这样貌似没有什么问题,也能正常打开这个博客,大家可能注意到在打开博客时网址自动变为http://wangye.org/blog / (多了个斜杠),为什么会这样,因为大多数人包括我喜欢将博客放到自己域名下的Blog文件夹里,那么http://wangye.org/blog指的是wangye.org下blog这个文件,当然我们只有blog这个文件夹,那么服务器会返回如下的301转向信息:

Server: Apache/2
Location: http://wangye.org/blog/
Content-Length: 293
Keep-Alive: timeout=1, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=iso-8859-1

很明显,服务器做了一次判断,进行了一次301转向,浏览器也进行了重新定向才定位到正确的/blog/文件夹,表面上看这没有什么问题,但是对于链接来说,当浏览者访问类似于http://wangye.org/blog这样的链接时,必然会对服务器造成资源负担,访问量少时没有什么,当流量比较大时不必要的资源浪费就比较可观了,还有据说这种转向不利于搜索引擎蜘蛛的抓取,所以请在这种情形下网址保留最后个斜杠,写成http://wangye.org/blog/ 吧。

Posted in:
  • 前端开发与用户体验
  • Web开发及相关
Tagged
  • url解析
  • 网站优化

兼容IE和FireFox设为首页和加入收藏的JavaScript代码

设为首页和加入收藏一直是很多网站提供的小功能,今天特别研究了一下,传统的设为首页的代码如下:

<a href="#setHomePage" onclick="this.style.behavior='url(#default#homepage)';this.setHomePag('http://wangye.org/');return false;">设为首页</a>

似乎很长的一段时间上面这段代码一直工作得很好,但是随着其他非IE内核的浏览器异军突起,比如FF(FireFox),很多童鞋发现这样的代码已经失去了原有的作用,所以兼容的代码就显得非常的重要了。

对于FireFox来说,安全设置成为阻碍设为首页代码的关键因素,不过我们不得不承认这些安全设置为我们安全浏览进行保驾护航,不过如果要在FF上设为首页,那么我们需要开启UniversalXPConnect权限, 当然在启用这个权限的同时浏览器会提示安全消息要求用户授权,若用户不予以授权的话,下面的代码将会因为权限问题而得不到执行。 (远程调试时如果不做相关设置将不会出现授权对话框,直接默认是拒绝授权)相关要求授权的对话框如下:

FireFox因特网安全.png

所以如果检测到用户没有授权,应该给出相关提示,详细的代码如下:

if (window.sidebar) {
  if (window.netscape) {
    try {
      netscape.security.PrivilegeManager
                  .enablePrivilege("UniversalXPConnect");
    } catch(e) {
             // this action was aviod by your browser,
             // if you want to enable,please enter
             // about:config in your address line,
             // and change the value of
             // signed.applets.codebase_principal_support to true
             alert("抱歉!您的浏览器不支持直接设为首页。" +
               "请在浏览器地址栏输入“about:config”并回车" +
               "然后将[signed.applets.codebase_principal_support]" +
               "设置为“true”,点击“加入收藏”后忽略安全提示,即可设置成功。");
    }
  }
  var prefs = Components.classes['@mozilla.org/preferences-service;1']
          .getService(Components.interfaces.nsIPrefBranch);
  prefs.setCharPref('browser.startup.homepage',url);
}

if (window.sidebar)是判断FF的一种方法,就像判断IE用if (document.all)一样,结合一下,兼容IE和FF的设为首页的代码如下:

Posted in:
  • 前端开发与用户体验
  • Web开发及相关
Tagged
  • javascript
  • 用户体验

用Excel函数提取公民身份证号码中信息(出生日期、性别)

大家可能在单位经常要处理一些Excel表格,其中可能接触到身份证号码的处理,比如提取出出生年月日,判断性别和计算年龄等等,对于这些我们都可以通过Excel函数进行处理。

根据身份证号码标准GB11643-1989以及最新的标准GB11643-1999,得知我国公民身份证号码的格式如下:

15位号码:区域地址编码(6位)+出生年(2位)+出生月(2位)+出生日(2位)+数字顺序码(2位)+性别码(1位)
示例:110111 00 01 01 112 (1900年1月1日出生)

18位号码:区域地址编码(6位)+出生年(4位)+出生月(2位)+出生日(2位)+数字顺序码(2位)+性别码(1位)+校验码(1位)
示例:110111 1900 01 01 112 4 (1900年1月1日出生)

好了有了这些信息,下面主要是如何取出年月日,首先介绍一下Excel函数中的MID函数,学过Visual Basic的都应该对这个函数比较眼熟,是的,这个函数主要是用于截取字符串的指定位和指定长度的子字符串,比如aabbccdde这个字符串中bcc就是从第4位开始长度为3的子字符串。

MID函数的原型如下:
MID(text, start_num, num_chars)

其中text是要截取的文本,可以是表格单元格位置,start_num是开始的位数从1开始,num_chars是截取的字符长度(字符个数)。好吧,我们要截取15位身份证号码的年,那么start_num应该是7,num_chars应该是2,同样的截取月份start_num应该是9,num_chars应该是2,依次类推。

假设15位身份证号码存放于A1单元格,那么函数可以如下写法:

=MID(A1, 7, 2)        ' 获取2位的年
' 获取2位的年并与19拼接成4位的年(常用函数)
="19" & MID(A1, 7, 2)
=MID(A1, 9, 2)        ' 获取月份
' 取整月份,这样形如01、02等等月份就变成1、2去除了前导0
=INT(MID(A1, 9, 2))
=MID(A1, 11, 2)       ' 获取日份
' 取整日份,这样形如01、02等等日份就变成1、2去除了前导0
=INT(MID(A1, 11, 2))

这里注意一下第二个函数,其中15位身份证号码截取的是2位年份,为了便于阅读,我们需要将其与字符串19进行拼接,拼接的办法就是使用&字符串连接符。另外INT函数也要注意,就是我们可能不需要前导0的月和日,这时取整有助于去掉这些前置0。

同样的道理截取18位身份证号码,函数可以这样写:

=MID(A1, 7, 4)        ' 获取4位的年
=MID(A1, 11, 2)       ' 获取月份
' 取整月份,这样形如01、02等等月份就变成1、2去除了前导0
=INT(MID(A1, 11, 2))
=MID(A1, 13, 2)       ' 获取日份
' 取整日份,这样形如01、02等等日份就变成1、2去除了前导0
=INT(MID(A1, 13, 2))

好了,我们已经分别取出了年月和日,可能读者要问了,如何取出类似于2011.03.12或者2011-03-12这种格式的日期呢,其实很容易,只要将上面的函数与“.”或者“-”进行拼接就可以了,我们以18位身份证号码为例,具体如下:

' 形如2011.03.12这样的日期
=MID(A1, 7, 4) & "." & MID(A1, 11, 2) & "." & MID(A1, 13, 2)
' 形如2011-03-12这样的日期
=MID(A1, 7, 4) & "-" & MID(A1, 11, 2) & "-" & MID(A1, 13, 2)
' 形如2011年03月12日这样的日期
=MID(A1, 7, 4) & "年" & MID(A1, 11, 2) & "月" & MID(A1, 13, 2) & "日"

谈到提取出生日期,很多朋友可能会想到如何计算年龄,这里还是先介绍下Excel的两个函数NOW()和YEAR()。其中NOW()始终代表着当前的时间。而YEAR则是在合法时间量中提取出年份。那么聪明的读者应该想到通过YEAR(NOW())我们就能获取当前的年份,然后通过与身份证号码上截取的4位年份进行相减就可以获得年龄了,好,还是以18位身份证号码为例,下面我们来看公式:

=YEAR(NOW())-MID(A1, 7, 4)

很简单吧,但是有读者可能需要一种更复杂的计算机制来计算年龄,比如要精确到月,出生月小于当前月的就以当前年份相减,否则就按当前年份减去1,然后再相减。这里我们需要用到IF函数,具体格式是 IF(条件, 为真, 为假),另外刚刚我们了解了取年份函数YEAR(),现在再介绍个取月份函数MONTH(),最后具体函数如下(18位身份证号码):

=IF(INT(MONTH(NOW()))>=INT(MID(A1, 11, 2)), YEAR(NOW()), YEAR(NOW())-1)-MID(A1, 7, 4)

也可以写成

=(YEAR(NOW())-MID(A1, 7, 4))-IF(INT(MONTH(NOW()))>=INT(MID(A1, 11, 2)), 0, 1)

好的,关于出生日期及年龄计算就先介绍到这里,下面我将给大家介绍如何判断性别。

根据先前讲的公民身份证号码格式,我们知道对于15位身份证号码,性别是看最后一位,对于18位身份证号码性别看倒数第二位,如果该位为奇数就为男性,如果为偶数就为女性,我们可以通过MID函数提取出该位,但是如何判断奇偶呢,其实这里用到了Excel的另一个函数MOD进行求余数,我们可以通过将该位与2进行求余,为0就为女性,为1就为男性,以18位身份证为例:

=MOD(MID(A1, 17, 1), 2)

如果我们需要将显示文本变得更友好,可以通过IF函数进行判断,那么原来的公式更改如下:

=IF(MOD(MID(A1, 17, 1), 2)=1, "男", "女")

好的,我关于用Excel公式函数提取公民身份证号码中信息的介绍到这里就结束了,想必大家在实际操作中能发掘出更好的方法吧。

2011年8月16日更新

部分读者反映,取年龄会计算不正确,实际上计算年龄的一个重点就是NOW()函数,NOW()函数返回的是当前计算机的时间,如果NOW()函数返回的时间不正确,计算结果当然也就不正确了,只有一种情况导致NOW()函数返回错误的时间,那就是你电脑上的时间设置错了,当然你也可以将NOW()替换成时间字符串,从而写死时间。

Posted in:
  • 计算机应用及维护
  • Windows系统
Tagged
  • excel
  • 身份证

考前准备工作之考试必备物品清单

近期即将高考,回想起自己高考的时候不禁感慨万千,即使已经走向工作岗位了,还不时的会有各种各样的考试,现在我把考试必备的一些物品列表如下,供大家参考:

证件类: 准考证、身份证、 学生证
这个我就不说了吧,没有证件恐怕考场都进不了。
笔类: 0.5mm中性笔、笔芯、2B铅笔
建议这些笔多备几支以防不测,尽量选用出水量比较平稳的黑色中性笔,因为有些答题纸容易透水。至于2B铅笔,请削成适合涂卡的形状。
辅助类: 橡皮、直尺、三角板、量角器、小刀、 圆规 胶水 手表 简单的计算器
橡皮是必须的,最好试用一下看能否擦干净2B铅笔的痕迹。三角板建议配齐45度和60度两种。小刀主要用来削2B铅笔的,但是不建议你在考场上削铅笔,所以还是多配一支2B铅笔吧,另外要注意的是某些考试例如研究生考试小刀是必须的,因为要用它去裁试卷袋。圆规在做数学题时可能会用到。胶水在某些需要自己封试卷袋时会用到一般考试前会有相关说明的。在某些没有时钟的考场上手表还是比较重要的。如果该场考试允许的话,可以携带无存储和编程功能的简单的计算器,当然要看考试说明的哦。
应急类: 一包面纸、 一杯水 足够的钱 电话卡
应对突发情况比如拉肚子或者流鼻血等。另外身上带上足够的钱。电话卡不是必须的,主要是为了突发情况联系而用。

可能大家认为我没有提到胶布、钢笔擦什么的,胶布是不允许使用的,至于钢笔擦,一不小心就会在试卷上开天窗,如果写错了的话就直接用水笔在试卷错误处划掉错误,然后在上面或者附近重新写上正确的答案。另外请准备一个透明的笔袋可以装入这些东西。

基本就这些了,一切以该场考试的考试允许携带用品说明为准,以上仅供参考,欢迎大家补充,考试关键还是要有个平稳自信的心态,祝考试的童鞋们都取得好的成绩!

Posted in:
  • 我的生活点滴
Tagged
  • 考试

安全的校验Session验证码并避免绕开验证码攻击

已经记不得是在哪个网站上看到的了,一般情况下对于验证码的校验,大家很容易写成下面这样:

<%
If Request.Form("SecurityCode") = Session("SecurityCode") Then
  ' TODO : Database operations
Else
  Response.Write "Security code incorrect!"
End If
%>

验证码图片产生Session("SecurityCode")并保存正确的验证码值,然后获得用户提交的验证码值,然后两个一比对如果一样则表示验证码正确,否则验证码错误。表面上这样的算法没有什么问题,但是对于一种特殊情况则会让验证码形同虚设。

首先我们知道,对于上面的算法有个核心的地方就是我们要访问产生验证码图片的那个文件才会有个保存验证码值的Session,然后才能对用户的输入进行正确的比对,假如有心人构造一个绕开验证码图片文件的Form然后进行提交会得到什么呢?Session("SecurityCode")不存在为空,如果此时用户验证码什么都不输入,这时验证码校验就形同虚设了。好,这里利用漏洞攻击的关键就是验证码的Session,我们很容易就能够让服务器不产生这个Session从而使这样的攻击变成可能。

解决的方法也很容易,校验验证码的Session是否为空或者校验用户输入的验证码是否合法,构造安全表单的关键就是永远不要相信用户的输入。下面采用校验验证码Session和用户输入的双保险办法解决这个安全问题:

' str为要校验的验证码,len为验证码长度
Function IsSecurityCodeValid(str, len)
  IsSecurityCodeValid = Not CBool( _
    IsEmpty(str) Or CStr(str)="" Or Len(str)<len)
End Function

If IsSecurityCodeValid(Request.Form("SecurityCode"), 4) AND _
   IsSecurityCodeValid(Session("SecurityCode"), 4) AND _
   Request.Form("SecurityCode") = Session("SecurityCode") Then
  ' TODO : Database operations
Else
  Response.Write "Security code incorrect!"
End If

END

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • Web安全
  • 验证码

利用链接URL的GET方式删除记录操作的安全隐患

最近在研究ASP.NET的MVC3,在asp.net的系列讲解中了解到一个有趣的安全问题,Stephen Walther已经在其 《ASP.NET MVC Tip #46 – Don’t use Delete Links because they create Security Holes》 文章中做了相关描述,基本的意思就是我们常常在设计信息系统时往往会很随意的将Delete记录这个操作设计成一个链接,通过这个链接以GET的方式传入要删除记录的ID,然后服务器处理脚本或程序就会删除我们所指定ID的记录,这听起来没有什么问题,但是有一种情况是存在的。

假设删除记录的URL是http://wangye.org/Sample/Delete/23,其中Delete后面的23表示要删除记录的ID,好,目前的状态是只要我们不去访问这个URL,那么这条ID为23的记录就是安全的,这时骇客想要删除这条记录,他们往往会发给你一封邮件,内容的源代码如下:

<img src="http://wangye.org/Sample/Delete/23" />

当你打开这封邮件时,虽然http://wangye.org/Sample/Delete/23不是一个图片,但是你的计算机仍然会Request这个地址,那么造成的后果是什么呢,ID=23的这条记录被删除了,很显然这个不是我们所期望的,但是骇客们往往就这样做到了,不过做到这个还要有两个前提:1.知道操作删除的URL地址和格式。2.获得访问权限。目前大多数删除操作是在访问权限控制之下的,但是如果我们在登录系统并获得访问权限后再打开那封问题邮件,那么这道防线就形同虚设了。

Stephen Walther提出的解决方案就是避免使用GET方式进行删除操作,当然通常情况下HTML只能支持GET和POST操作,所以很自然的就想到采用POST来取代GET进行相关操作,是的这不失为一个好的办法,不过HTTP除了POST和GET还有另外的操作方式,比如PUT和DELETE等,在HTTP中GET、POST、PUT、DELETE就对应着对这个资源的查、改、增、删4个操作,当然要实现DELETE操作还是要借助于JavaScript脚本,比如Ajax删除。在MVC中的Controller里的处理删除的方法前面加上[AcceptVerbs(HttpVerbs.Delete)]标识,表示仅接受DELETE操作。

然后前端脚本可以像下面这样写:

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>
<script type="text/javascript">
  function deleteRecord(recordId)
  {
    // Perform delete
    var action = "/Home/Delete/" + recordId;
       
    var request = new Sys.Net.WebRequest();
    request.set_httpVerb("DELETE");
    request.set_url(action);
    request.add_completed(deleteCompleted);
    request.invoke();
  }
 
  function deleteCompleted()
  {
    // Reload page
    window.location.reload();
  }
</script>
<a onclick="deleteRecord(23)" href="javascript:void(0)">Delete 23</a>

通过上面的脚本就可以利用DELETE方法就可以安全的向服务器发出删除ID=23这条记录了。当然如果你不希望采用JavaScript方式的话那只有通过表单的POST形式进行删除了,至于ID,可以放在type=hidden的input控件里。

Posted in:
  • 网络编程与数据库
  • Web开发及相关
Tagged
  • asp.net
  • Web安全

VBScript 读取或者修改文件的属性信息

今天在Scripting Guy上看到一段有趣的脚本即获取和设置一个文件的属性,何为文件属性?当你对一个文件右击查看属性并切换到详细信息时,你就会发现这些信息:

Word文件属性.png

下面主要介绍如何利用脚本读取或者修改这些信息。谈到脚本的文件操作,大家首先想到的恐怕是FSO(FileSystemObject)组件吧,但是很遗憾FSO组件不支持对这些信息的操作,脚本专家的 《如何向文档的“备注”字段写入信息?》 提供了一个微软的COM组件 Microsoft Developer Support OLE File Property Reader 2.1 Sample (KB 224351) 即Dsofile可以帮我们实现这个需求,安装解压后惊喜的发现其提供了C++源代码和VB6和VB7的演示代码,看来可以好好研究一番了,哦,对了,我把脚本专家上的那段代码贴这儿备忘吧:-)

Posted in:
  • VBScript/JavaScript/Python
  • 系统应用程序开发
Tagged
  • vbscript
  • 文件操作

© Wang Ye / 王 晔. All rights reserved.