<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ZH CEXO's BLOG &#187; 编程</title>
	<atom:link href="http://www.zhcexo.com/tag/program/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.zhcexo.com</link>
	<description>探寻网络 分享发现</description>
	<lastBuildDate>Thu, 09 Feb 2012 03:01:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>JavaScript中的this到底是什么</title>
		<link>http://www.zhcexo.com/this-in-javascript/</link>
		<comments>http://www.zhcexo.com/this-in-javascript/#comments</comments>
		<pubDate>Sun, 12 Sep 2010 02:59:10 +0000</pubDate>
		<dc:creator>ZH CEXO</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[编程]]></category>

		<guid isPermaLink="false">http://www.zhcexo.com/?p=1051</guid>
		<description><![CDATA[在基于类的面对对象语言里，this指针通常引用类的实例（方法在类中被声明）。在JavaScript中，函数是一等对象（不被声明为任何东西的一部分），而this所引用的对象被称为函数上下文，它不是由如何声明函数，而是由如何调用函数来决定的。

这意味着，根据函数如何被调用，同一个函数可以拥有不同的函数上下文。刚开始可能觉得奇怪，但这相当有用。

在默认情况下，函数调用的上下文（this）是对象，其属性包含可以调用该函数的引用。参看如下代码：

<span class="readmore"><a href="http://www.zhcexo.com/this-in-javascript/" title="JavaScript中的this到底是什么">阅读全文——共1987字</a></span>]]></description>
			<content:encoded><![CDATA[<p>在基于类的面对对象语言里，this指针通常引用类的实例（方法在类中被声明）。在JavaScript中，函数是一等对象（不被声明为任何东西的一部分），而this所引用的对象被称为函数上下文，它不是由如何声明函数，而是由如何调用函数来决定的。</p>
<p>这意味着，根据函数如何被调用，同一个函数可以拥有不同的函数上下文。刚开始可能觉得奇怪，但这相当有用。</p>
<p>在默认情况下，函数调用的上下文（this）是对象，其属性包含可以调用该函数的引用。参看如下代码：</p>
<p><span id="more-1051"></span></p>
<pre class="brush:js">
var ride = {
    make: &quot;Yamaha&quot;,
    model: &quot;V-Star Silverado 1100&quot;,
    year: 2005,
    purchased: new Date(2005,3,12),
    owner: {name: &quot;Spike Spiegel&quot;, occupation: &quot;bounty hunter&quot;},
    whatAmI: function(){
        return this.year+&quot; &quot;+this.make+&quot; &quot;+this.model;
    }
};</pre>
<p>那么上面代码的层次应该如下图所示：</p>
<p style="text-align: center;"><img alt="JavaScript中的this到底是什么" src="http://www.zhcexo.com/wp-content/plugins/pika/readimg.php?src=http%3A%2F%2Flh6.gouride.com%2F_ruj4XAh2Njs%2FTIw_74XiCcI%2FAAAAAAAAC94%2FU9i2lgsqL3I%2Fs800%2Fjs-this-1.png" title="JavaScript中的this到底是什么" /></p>
<p>上图的模型清晰地显示函数不是Object的一部分，只是被名为whatAmI的Object属性所引用</p>
<p>当函数通过属性引用而被调用时，如下所示</p>
<pre class="brush:js">
var bike = ride.whatAmI();</pre>
<p>函数上下文（this引用）被设置为ride所指向的对象实例。作为结果，变量bike被设置为字符串2005 Yamaha V-Star Silverado 1100，因为该函数经由this进行调用并获得对象的属性。</p>
<p>对于顶层函数来说也是如此。请记住：顶层函数是window的属性，因此在作为顶层函数而被调用时，其函数上下文是window对象。</p>
<p>虽然以上是常见的隐式行为，但JavaScript提供办法来显式地控制什么被用作函数上下文。通过Function方法call()或apply()来调用函数，可以把函数上下文设置为所想的任何东西。</p>
<p>对，作为一等对象，函数甚至拥有定义为Function构造器的几个方法。</p>
<p>用call()方法来调用函数（这个函数作为第一个参数），指定对象作为函数上下文，而其余参数成为被调用函数的参数，也就是说，call()的第二个参数成为被调用函数的第一个实参，以此类推。apply()方法的工作方式与call()相似，除了第二个参数要求是对象数组以外（这些对象将成为被调用函数的实参）。</p>
<p>弄糊涂了？该是介绍更为综合的示例的时间了。考虑下面的代码：</p>
<p style="text-align: center;"><img alt="JavaScript中的this到底是什么" src="http://www.zhcexo.com/wp-content/plugins/pika/readimg.php?src=http%3A%2F%2Flh5.gouride.com%2F_ruj4XAh2Njs%2FTIw_8IYwoYI%2FAAAAAAAAC98%2F46g6-nLrIG4%2Fs800%2Fjs-this-2.png" title="JavaScript中的this到底是什么" /></p>
<p>在这个示例中，我们定义3个简单的对象，每个对象都带有handle属性，使得易于标识对象（给定一个引用）①。我们也经window实例添加handle属性，因此window实例也易于标识。</p>
<p>然后定义顶层函数，无论什么对象作为其函数上下文，都返回handle属性值②。把同一函数实例指派给o1对象的名为identifyMe的属性③。我们可以说，这会在o1对象上创建名为identifyMe的方法，而注意到这一点很重要：这个函数独立于o1对象而被声明。</p>
<p>最后，我们弹出4个警告消息框，每个警告消息框都使用不同的机制来调用相同的函数实例。在用浏览器加载这个页面时，4个警告框的序列如下图所示：</p>
<p style="text-align: center;"><img alt="JavaScript中的this到底是什么" src="http://www.zhcexo.com/wp-content/plugins/pika/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_ruj4XAh2Njs%2FTIw_8JIujhI%2FAAAAAAAAC-A%2FrS5U_8MhM4g%2Fs800%2Fjs-this-3.png" title="JavaScript中的this到底是什么" /></p>
<p>这个警告消息框说明了以下几点：</p>
<p>在函数作为顶层函数而被直接调用时，函数上下文是window实例④。</p>
<p>在函数作为对象（在这种情况下是o1）的属性被调用时，那个对象成为函数调用的函数上下文⑤。我们可以说，函数就像那个对象的方法而（在面向对象语言里面类似）进行操作。请不要对这个类比感到厌烦。如果你不小心谨慎，就会误入歧途，就像这个实例其作部分所显示的那样。</p>
<p>采用Function的call()方法导致函数上下文被设置为作为第一个参数而传递给call()的任何对象。在这种情况下是o2⑥。在这个示例中，函数表现得像是o2的方法，即使这个函数与o2没有任何关联（连o2的属性都不是）。</p>
<p>就像对待call()那样，利用Function的apply()方法来把函数上下文设置为作为第一个参数而传入的任何对象⑦。在传递更多的参数给函数时（为了简洁，在这个示例中没有那样做），这两个方法之间的差别才变得显著起来。</p>
<p>这个示例页面清楚地演示：函数上下文以每个调用为基础而被决定，并且一个函数能以任何对象作为其上下文而被调用。因此说&ldquo;函数是对象的方法&rdquo;肯定是不正确的。下面的陈述则准确得多：</p>
<p>在对象o充当函数F的调用的函数上下文时，函数F充当对象o的方法。</p>
<p>为了更进一步说明这个概念，考虑给示例添加下面的语句所带来的效果：</p>
<pre class="brush:js">
 alert(o1.identifyMe.call(o3));</pre>
<p>即使我们作为o1属性而引用函数，这个调用的函数上下文还是o3。这就进一步强调：不是函数被如何声明，而是函数被如何调用决定了函数的上下文。</p>
<p>在使用采取了回调函数的jQuery命令和函数时，将证明这是最重要的概念。</p>
<h3  class="related_post_title">相关阅读</h3><ul class="related_post"><li><a href="http://www.zhcexo.com/simple-gr-update-to-1-31/" title="GM脚本：Simple Google Reader Style V1.31">GM脚本：Simple Google Reader Style V1.31</a></li><li><a href="http://www.zhcexo.com/bottons-with-jquery-css3/" title="用jQuery或者CSS3创建简单的动态按钮">用jQuery或者CSS3创建简单的动态按钮</a></li><li><a href="http://www.zhcexo.com/simple-gr-update-to-1-3/" title="GM脚本：Simple Google Reader Style V1.3">GM脚本：Simple Google Reader Style V1.3</a></li><li><a href="http://www.zhcexo.com/css-input-file-area/" title="使用CSS美化文件上传表单">使用CSS美化文件上传表单</a></li><li><a href="http://www.zhcexo.com/tips-for-jquery-animation/" title="jQuery中处理动画序列引起的问题">jQuery中处理动画序列引起的问题</a></li><li><a href="http://www.zhcexo.com/introduction-of-box-shadow/" title="box-shadow用法简介">box-shadow用法简介</a></li><li><a href="http://www.zhcexo.com/css3-cool-tip/" title="用CSS3创建漂亮的链接提示">用CSS3创建漂亮的链接提示</a></li><li><a href="http://www.zhcexo.com/how-to-put-div-over-frame/" title="如何在一堆框架（Frame）上弹出div层">如何在一堆框架（Frame）上弹出div层</a></li><li><a href="http://www.zhcexo.com/cnbeta-user-script/" title="とあるcnbeta的脚本">とあるcnbeta的脚本</a></li><li><a href="http://www.zhcexo.com/javascript-object-properties/" title="使用JavaScript对象属性防止变量被影响">使用JavaScript对象属性防止变量被影响</a></li></ul><hr />
<p>© ZH CEXO for <a href="http://www.zhcexo.com">ZH CEXO's BLOG</a>, 2010. |
<a href="http://www.zhcexo.com/this-in-javascript/">查看原文</a> |
<a href="http://www.zhcexo.com/this-in-javascript/#comments">11 条评论</a>
<br/>
标签: <a href="http://www.zhcexo.com/tag/javascript/" rel="tag">javascript</a>, <a href="http://www.zhcexo.com/tag/study/" rel="tag">学习</a>, <a href="http://www.zhcexo.com/tag/program/" rel="tag">编程</a><br/>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.zhcexo.com/this-in-javascript/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>我的小软件EasyDisc（开源）</title>
		<link>http://www.zhcexo.com/easydisc/</link>
		<comments>http://www.zhcexo.com/easydisc/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 05:18:59 +0000</pubDate>
		<dc:creator>Ariel</dc:creator>
				<category><![CDATA[软件推荐]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[记事本]]></category>
		<category><![CDATA[软件]]></category>

		<guid isPermaLink="false">http://www.linxo.cn/blog/?p=689</guid>
		<description><![CDATA[EasyDisc的功能很简单，就是在你插入U盘或光盘时在桌面上创建个快捷方式，在移除U盘和光盘时删除快捷方式，这有点类似ubuntu里面的那个功能。]]></description>
			<content:encoded><![CDATA[<p>EasyDisc的功能很简单，就是在你插入U盘或光盘时在桌面上创建个快捷方式，在移除U盘和光盘时删除快捷方式，这有点类似Linux和MAC OS里面的那个功能。</p>
<p>本软件最多支持的U盘加光盘数目总和为16个（我想没人会用这么多吧，所以我只设定为16个）。现在的3.1版是正式版本，以前的版本内测时都出现了点BUG，这个版本目前很稳定，占用资源小。网上也有类似的软件，不过很多都包含多个文件，有的还要安装。我的这个软件小，不到200k。只有一个单一的EXE文件。用时只要把程序放到“开始”-&gt;“启动”里就可以开机自动启动了。运行时几乎不占用CPU。唯一的一点不足是无法判断出移动硬盘，目前我还没找到判断方法，以后再改进吧。</p>
<p><span id="more-689"></span></p>
<p>此软件我开放源码，软件是用VC2008编译通过的。代码没用什么VC2008下特有的东东，用其他VC编译器重建工程应该也能通过。我不喜欢MS的MFC，所以代码是以SDK风格编写的。我电脑是Vista，起初EasyDisc只能在Vista下使用，现在可兼容XP。如果发现什么BUG或着还有哪儿可以改进的，可以给我发邮件。</p>
<p><img src="http://www.zhcexo.com/images/aqy.gif" alt="我的小软件EasyDisc（开源）"  title="我的小软件EasyDisc（开源）" /></p>
<p><img src="http://www.zhcexo.com/images/down.png" alt="我的小软件EasyDisc（开源）"  title="我的小软件EasyDisc（开源）" /><strong>下载：</strong></p>
<p>EasyDisc（源码）：<a href="http://dl.getdropbox.com/u/864557/EasyDisc%EF%BC%88%E6%BA%90%E7%A0%81%EF%BC%89.rar" target="_blank">点击下载</a></p>
<p>EasyDisc V3.1：<a href="http://dl.getdropbox.com/u/864557/EasyDisc%20V3.1.exe" target="_blank">点击下载</a></p>
<h3  class="related_post_title">相关阅读</h3><ul class="related_post"><li><a href="http://www.zhcexo.com/powerful-and-interesting-notepad-2/" title="强大而又有趣的记事本（续）">强大而又有趣的记事本（续）</a></li><li><a href="http://www.zhcexo.com/powerful-and-interesting-notepad/" title="强大而有趣的记事本">强大而有趣的记事本</a></li><li><a href="http://www.zhcexo.com/this-in-javascript/" title="JavaScript中的this到底是什么">JavaScript中的this到底是什么</a></li><li><a href="http://www.zhcexo.com/make-firefox-4-portable/" title="自己动手做个绿色简体中文版Firefox 4.0 beta 1">自己动手做个绿色简体中文版Firefox 4.0 beta 1</a></li><li><a href="http://www.zhcexo.com/use-ttplayer/" title="用来用去，还是习惯千千静听">用来用去，还是习惯千千静听</a></li><li><a href="http://www.zhcexo.com/win7-hacks-for-starters/" title="换上了Windows 7，华丽丽地飘过">换上了Windows 7，华丽丽地飘过</a></li><li><a href="http://www.zhcexo.com/lightscreen/" title="推荐截屏软件Lightscreen">推荐截屏软件Lightscreen</a></li><li><a href="http://www.zhcexo.com/soft-package/" title="发布软件包镜像">发布软件包镜像</a></li><li><a href="http://www.zhcexo.com/shock-3d-desktop/" title="漂亮的3D桌面">漂亮的3D桌面</a></li><li><a href="http://www.zhcexo.com/make-startmenu-more-convenient/" title="Start++让你的Vista开始菜单更好用">Start++让你的Vista开始菜单更好用</a></li></ul><hr />
<p>© Ariel for <a href="http://www.zhcexo.com">ZH CEXO's BLOG</a>, 2009. |
<a href="http://www.zhcexo.com/easydisc/">查看原文</a> |
<a href="http://www.zhcexo.com/easydisc/#comments">21 条评论</a>
<br/>
标签: <a href="http://www.zhcexo.com/tag/program/" rel="tag">编程</a>, <a href="http://www.zhcexo.com/tag/notepad/" rel="tag">记事本</a>, <a href="http://www.zhcexo.com/tag/software/" rel="tag">软件</a><br/>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.zhcexo.com/easydisc/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>强大而又有趣的记事本（续）</title>
		<link>http://www.zhcexo.com/powerful-and-interesting-notepad-2/</link>
		<comments>http://www.zhcexo.com/powerful-and-interesting-notepad-2/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 06:29:10 +0000</pubDate>
		<dc:creator>Ariel</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[记事本]]></category>

		<guid isPermaLink="false">http://www.linxo.cn/blog/?p=43</guid>
		<description><![CDATA[上次简单的介绍了一下用记事本可以编写批处理和VBS脚本文件。这次重点介绍一下用记事本怎么生成EXE可执行文件。因为可执行文件比批处理和VBS脚本更加强大，当然了，大部分病毒和木马都是EXE文件]]></description>
			<content:encoded><![CDATA[<p>上次简单的介绍了一下用记事本可以编写批处理和VBS脚本文件。这次重点介绍一下用记事本怎么生成EXE可执行文件。因为可执行文件比批处理和VBS脚本更加强大，当然了，大部分病毒和木马都是EXE文件。</p>
<p>用记事本生成可执行文件的一种方法是用批处理写汇编，再用debug编译生成com可执行文件。例如以下代码：<br />
<span id="more-43"></span></p>
<p>@echo off</p>
<p>echo a100&gt; 1.txt</p>
<p>echo db ‘Hello World!$’&gt;&gt; 1.txt</p>
<p>echo mov ah,09&gt;&gt; 1.txt</p>
<p>echo mov dx,0100&gt;&gt; 1.txt</p>
<p>echo int 21&gt;&gt; 1.txt</p>
<p>echo mov ah,01&gt;&gt; 1.txt</p>
<p>echo int 21&gt;&gt; 1.txt</p>
<p>echo int 20&gt;&gt; 1.txt</p>
<p>echo.&gt;&gt; 1.txt</p>
<p>echo rcx&gt;&gt; 1.txt</p>
<p>echo 1a&gt;&gt; 1.txt</p>
<p>echo n hello.com&gt;&gt; 1.txt</p>
<p>echo w&gt;&gt; 1.txt</p>
<p>echo q&gt;&gt; 1.txt</p>
<p>debug &lt; 1.txt</p>
<p>del 1.txt</p>
<p>start hello.com</p>
<p>把上述代码写进记事本，然后保存为filename.bat。双击运行后就生成了一个HELLO.COM的可执行文件。当然了，写这种东西你就就得会汇编。如果你足够强的话，你还可以直接用记事本写机器码来生成可执行文件。例如：</p>
<p>@echo off</p>
<p>echo.a&gt;&gt;hx.txt</p>
<p>echo.db B0 13 CD 10 68 00 A0 07 8C C8 80 C4 10 8E E0 31&gt;&gt;hx.txt</p>
<p>echo.db C9 BA C8 03 89 C8 EE 42 D0 F8 78 07 EE F6 E0 C1&gt;&gt;hx.txt</p>
<p>echo.db E8 06 EE B0 00 EE 79 08 28 C8 D0 E8 EE D0 E8 EE&gt;&gt;hx.txt</p>
<p>echo.db 89 CB 64 88 1F E2 DA 89 CB 01 C8 D3 C0 88 C6 C0&gt;&gt;hx.txt</p>
<p>echo.db FE 05 10 F2 64 12 97 FF 00 D0 EA 64 88 17 F6 D7&gt;&gt;hx.txt</p>
<p>echo.db 64 88 17 E2 E2 DB E3 D9 EE 80 C7 08 BF 04 02 D8&gt;&gt;hx.txt</p>
<p>echo.db 45 F4 57 BA B0 FF BD 60 FF BE FC 01 DF 44 D6 89&gt;&gt;hx.txt</p>
<p>echo.db 2C DF 04 89 14 DF 04 B1 02 D9 C3 D9 FB D9 C2 D8&gt;&gt;hx.txt</p>
<p>echo.db C9 D9 C4 D8 CB DE E9 D9 CB DE CA DE CB DE C2 D9&gt;&gt;hx.txt</p>
<p>echo.db CA E2 E6 D9 C1 DC C8 D9 C1 DC C8 DE C1 D9 FA DE&gt;&gt;hx.txt</p>
<p>echo.db FB D9 F3 DE 4C FC DF 1C DE 4C FC DF 5C 01 8B 34&gt;&gt;hx.txt</p>
<p>echo.db 8D 00 00 E0 24 40 B0 FB 74 0F C1 E6 02 8D 00 28&gt;&gt;hx.txt</p>
<p>echo.db E0 B0 F0 79 04 D1 E6 B0 D0 64 02 00 00 05 47 45&gt;&gt;hx.txt</p>
<p>echo.db 81 FD A0 00 75 93 42 83 FA 50 75 8A 5E BF 00 19&gt;&gt;hx.txt</p>
<p>echo.db B5 64 F3 A5 B5 C8 4E C0 3C 02 E2 FA E4 60 98 48&gt;&gt;hx.txt</p>
<p>echo.db 0F 85 65 FF B0 03 CD 10 29 00 C3 3C 62 61 7A 65&gt;&gt;hx.txt</p>
<p>echo.&gt;&gt;hx.txt</p>
<p>echo.g&gt;&gt;hx.txt</p>
<p>echo.q&gt;&gt;hx.txt</p>
<p>echo.&gt;&gt;hx.txt</p>
<p>echo.debug.exe ^bat.bat</p>
<p>call bat.bat</p>
<p>del /q /f bat.bat&gt;nul</p>
<p>del hx.txt /f /q&gt;nul</p>
<p>还是把上述代码保存为一个批处理文件，双击运行后你就可以看到一个3D画面。</p>
<p>上面介绍的是用记事本生成COM可执行文件，虽然COM文件可以转化成EXE文件，但它还不是真正的EXE可执行文件，下面我就介绍怎么用记事本生成真正的EXE文件。</p>
<p>其实用记事本生成EXE文件并不是用记事本直接写出来的。记事本写的东东是文本文件，而EXE可执行文件是二进制文件。其实EXE文件是事先用其它语言写好了的，然后再想办法把EXE二进制文件转化为文本文件，再然后用脚本文件把字符串逆变换成二进制文件。</p>
<p>具体方法和例子如下：</p>
<p>先准备一个EXE文件，然后用记事本编写编写如下脚本：</p>
<p>on error resume next</p>
<p>set arg=wscript.arguments</p>
<p>if arg.count=0 then wscript.quit</p>
<p>with CreateObject(”ADODB.Stream”)</p>
<p>.type=1:.open:.loadfromfile arg(0):bs=.read:l=.size:.close</p>
<p>end with</p>
<p>if err.number&lt;&gt;0 then wscript.quit</p>
<p>set fso=CreateObject(”Scripting.FileSystemObject”)</p>
<p>with fso.opentextfile(arg(0)&amp;”.bat”,2,true)</p>
<p>if err.number&lt;&gt;0 then wscript.quit</p>
<p>.writeline “@echo bs=_&gt;xx.vbs”</p>
<p>for k=1 to l step 129</p>
<p>.write “@echo “””</p>
<p>.write b64b(midb(bs,k,129))</p>
<p>.writeline “””+_&gt;&gt;xx.vbs”</p>
<p>next</p>
<p>.writeline “@echo “”””:set rs=CreateObject(””ADODB.Recordset””)&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo set ado=CreateObject(””ADODB.Stream””)&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo l=len(bs):ss=””””:for k=1 to l step 4096:ss=ss+ub64(mid(bs,k,4096)):next:l=len(ss)&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo rs.fields.append “”b””,205,l/2:rs.open:rs.addnew:rs(””b””)=ss+chrb(0):rs.update&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo ado.mode=3:ado.type=1:ado.open:ado.write rs(””b””).getchunk(l/2)&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo ado.savetofile “””+fso.getfilename(arg(0))+”””,2:ado.close&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo function ub64(s):dim t(4),b(3):ub64=””””:n=len(s):r=2 &gt;&gt;xx.vbs”</p>
<p>.writeline “@echo if n mod 4^&lt;^&gt;0 then exit function:end if:for i=1 to n step 4:for j=0 to 3 &gt;&gt;xx.vbs”</p>
<p>.writeline “@echo a=asc(mid(s,i+j,1)):if a=43 then:a=62:else if a=47 then:a=63:else if a^&gt;47 and a^&lt;58 then:_&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo a=a+4:else if a=61 then:a=0:if r=2 then r=j-2:end if:else if a^&gt;64 and a^&lt;91 then:_&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo a=a-65:else if a^&gt;96 and a^&lt;123 then:a=a-71:else:exit function:_&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo end if:end if:end if:end if:end if:end if:t(j)=a:next&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo b(0)=t(0)+t(1)*64 mod 256:b(1)=t(1)\4+t(2)*16 mod 256:b(2)=t(2)\16+t(3)*4 &gt;&gt;xx.vbs”</p>
<p>.writeline “@echo for j=0 to r:if b(j)^&lt;16 then ub64=ub64+””0″”:end if:ub64=ub64+hex(b(j))&gt;&gt;xx.vbs”</p>
<p>.writeline “@echo next:next:end function&gt;&gt;xx.vbs&amp;&amp;cscript.exe //nologo xx.vbs&amp;del xx.vbs”</p>
<p>end with</p>
<p>const b64 = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”</p>
<p>function b64b(bin)</p>
<p>b64b=””</p>
<p>n=lenb(bin)</p>
<p>for i=1 to n step 3</p>
<p>a=ascb(midb(bin,i,1))</p>
<p>b64b=b64b+mid(b64,a mod 64+1,1)</p>
<p>if i</p>
<p>b=ascb(midb(bin,i+1,1))</p>
<p>b64b=b64b+mid(b64,(a\64+b*4)mod 64+1,1)</p>
<p>if i+1</p>
<p>c=ascb(midb(bin,i+2,1))</p>
<p>b64b=b64b+mid(b64,(b\16+c*16)mod 64+1,1)</p>
<p>b64b=b64b+mid(b64,c\4+1,1)</p>
<p>else</p>
<p>b64b=b64b+mid(b64,b\16+1,1)</p>
<p>b64b=b64b+”=”</p>
<p>end if</p>
<p>else</p>
<p>b64b=b64b+mid(b64,a\64+1,1)</p>
<p>b64b=b64b+”==”</p>
<p>end if</p>
<p>next</p>
<p>end function</p>
<p>然后把文件保存为Any2Bat.vbs。这个文件不是我原创的，它是由著名的zzzEVAzzz写的。文件的作用是把任意文件转化为批处理文件。Any2Bat.vbs文件支持拖拽，把任意一个文件拖拽到Any2Bat.vbs文件图标上即可完成转换。（文件说明：这个脚本用的是Base64编码方式进行的转化。Base64编码转换出的文本文件是原二进制文件的1.5倍。而用Hex.bin编码出来是原始文件体积的２倍。所以Base64编码转化后的文件更小，但转化速度要慢一些。）然后你只需把准备好的EXE文件拖放到Any2Bat.vbs文件图标上，一个可以释放出EXE文件的批处理文件就生成了。你双击运行批处理就可以生成一个EXE文件。如果你还想双击运行批处理时就直接运行了EXE可执行文件的话，你只需在生成的批处理文件最后加上一行 “start filename.exe”。 filename.exe是你的EXE文件的文件名。</p>
<p>批处理和VBS脚本是可以相互转化的，网上的方法和软件一大堆，这里就不说了。用上文的方法可以把应用程序转换成批处理或VBS脚本，面VBS脚本又大量用于网页上。如果你的EXE文件是个木马或病毒什么的。。。呵呵，我可没教你做坏事。</p>
<h3  class="related_post_title">相关阅读</h3><ul class="related_post"><li><a href="http://www.zhcexo.com/easydisc/" title="我的小软件EasyDisc（开源）">我的小软件EasyDisc（开源）</a></li><li><a href="http://www.zhcexo.com/powerful-and-interesting-notepad/" title="强大而有趣的记事本">强大而有趣的记事本</a></li><li><a href="http://www.zhcexo.com/this-in-javascript/" title="JavaScript中的this到底是什么">JavaScript中的this到底是什么</a></li></ul><hr />
<p>© Ariel for <a href="http://www.zhcexo.com">ZH CEXO's BLOG</a>, 2008. |
<a href="http://www.zhcexo.com/powerful-and-interesting-notepad-2/">查看原文</a> |
<a href="http://www.zhcexo.com/powerful-and-interesting-notepad-2/#comments">4 条评论</a>
<br/>
标签: <a href="http://www.zhcexo.com/tag/program/" rel="tag">编程</a>, <a href="http://www.zhcexo.com/tag/notepad/" rel="tag">记事本</a><br/>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.zhcexo.com/powerful-and-interesting-notepad-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>强大而有趣的记事本</title>
		<link>http://www.zhcexo.com/powerful-and-interesting-notepad/</link>
		<comments>http://www.zhcexo.com/powerful-and-interesting-notepad/#comments</comments>
		<pubDate>Sun, 25 May 2008 04:15:31 +0000</pubDate>
		<dc:creator>Ariel</dc:creator>
				<category><![CDATA[互联网络]]></category>
		<category><![CDATA[编程]]></category>
		<category><![CDATA[记事本]]></category>

		<guid isPermaLink="false">http://www.linxo.cn/blog/archives/14</guid>
		<description><![CDATA[我是一个对编程有着激情的男孩，当然，这篇文章与编程有关啦。这是我在这个网站的第一篇文章，有错误之处还望大家指正。文章将会涉及到批处理和VBS脚本，并且有着大量源码，希望看此文的人对上述东西有所了解。本文重点是介绍怎么用记事本实现批处理和VBS脚本的混合编程，以达到一些强大或有趣的作用。

记事本是非常强大的一个工具。不要以为它只能记些文字，通过某些方法，记事本还能够实现很多有趣而和强大的功能。先来个有趣的例子吧。假如你想向某个女生表白，而又不好说出口，OK！记事本能够为你做到。你只需打开记事本，敲入『CreateObject (“SAPI.SpVoice”).Speak “I LOVE YOU”』（“『”与“』”不用敲入），然后保存为FileName.vbs（注意：文件的后缀名是“vbs”，而不是“txt”）。现在你双击打开文件试试，是不是听到电脑在向你表白。呵呵，当然了，Speak后面引号里的内容可以改为你想说的任何内容，不过只能是英文的，除非你知道对方的电脑里安装了中文语音插件。好了，现在你可以把测试好的文件传给对方了。对方一定会被那坚定而又带有磁性的声音给吸引的。

<span class="readmore"><a href="http://www.zhcexo.com/powerful-and-interesting-notepad/" title="强大而有趣的记事本">阅读全文——共6472字</a></span>]]></description>
			<content:encoded><![CDATA[<p>我是一个对编程有着激情的男孩，当然，这篇文章与编程有关啦。这是我在这个网站的第一篇文章，有错误之处还望大家指正。文章将会涉及到批处理和VBS脚本，并且有着大量源码，希望看此文的人对上述东西有所了解。本文重点是介绍怎么用记事本实现批处理和VBS脚本的混合编程，以达到一些强大或有趣的作用。<br />
记事本是非常强大的一个工具。不要以为它只能记些文字，通过某些方法，记事本还能够实现很多有趣而和强大的功能。先来个有趣的例子吧。假如你想向某个女生表白，而又不好说出口，OK！记事本能够为你做到。你只需打开记事本，敲入『CreateObject (“SAPI.SpVoice”).Speak “I LOVE YOU”』（“『”与“』”不用敲入），然后保存为FileName.vbs（注意：文件的后缀名是“vbs”，而不是“txt”）。现在你双击打开文件试试，是不是听到电脑在向你表白。呵呵，当然了，Speak后面引号里的内容可以改为你想说的任何内容，不过只能是英文的，除非你知道对方的电脑里安装了中文语音插件。好了，现在你可以把测试好的文件传给对方了。对方一定会被那坚定而又带有磁性的声音给吸引的。<br />
<span id="more-14"></span> 上面只是用记事本写了个脚本，脚本除了可做些好玩的东东外，还可以做些实用的东西。比如下面这个脚本：<br />
m = msgbox(“你确定关闭了迅雷？”,vbOKCancel,”运行前请关闭迅雷”)<br />
If m = vbCancel Then<br />
Wscript.Quit<br />
End If</p>
<p>error=0<br />
Const WINDOW_HANDLE = 0<br />
Const OPTIONS = &amp;H10&amp;<br />
Set objShell = CreateObject(“Shell.Application”)<br />
Set objFolder = objShell.BrowseForFolder _<br />
(WINDOW_HANDLE, “打开迅雷安装目录:”, OPTIONS, “D:\”)<br />
If objFolder Is Nothing Then<br />
Wscript.Quit<br />
End If<br />
Set objFolderItem = objFolder.Self<br />
objPath = objFolderItem.Path</p>
<p>Set objFSO = CreateObject(“Scripting.FileSystemObject”)</p>
<p>If objFSO.FileExists(objPath &amp; “\Program\gui.cfg”) Then<br />
Set objFile = objFSO.GetFile(objPath &amp; “\Program\gui.cfg”)<br />
objFile.Attributes = 32<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Program\gui.cfg”, 1)</p>
<p>Do Until objTextFile.AtEndOfStream<br />
strLine = objTextFile.ReadLine<br />
If Left(strLine, 9) = “ADServer=” Then<br />
strLine=”ADServer=”<br />
End If<br />
If Left(strLine, 9) = “PVServer=” Then<br />
strLine=”PVServer=”<br />
End If<br />
If Left(strLine, 17) = “ADCountingServer=” Then<br />
strLine=”ADCountingServer=”<br />
End If<br />
If Left(strLine, 9) = “HomePage=” Then<br />
strLine=”HomePage=”<br />
End If<br />
strNewText = strNewText &amp; strLine &amp; vbCrLf<br />
Loop</p>
<p>objTextFile.Close<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Program\gui.cfg”, 2)<br />
objTextFile.Write(strNewText)<br />
objTextFile.Close<br />
objFile.Attributes = 1<br />
Else<br />
error=1<br />
End If</p>
<p>If objFSO.FolderExists(objPath &amp; “\Program\Ad”) Then<br />
objFSO.DeleteFolder(objPath &amp; “\Program\Ad”)<br />
End If</p>
<p>If objFSO.FileExists(objPath &amp; “\Program\adhistory.xml”) Then<br />
Set objFile = objFSO.GetFile(objPath &amp; “\Program\adhistory.xml”)<br />
objFile.Attributes = 32<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Program\adhistory.xml”, 2)<br />
objTextFile.Write(“”)<br />
objTextFile.Close<br />
objFile.Attributes = 1<br />
Else<br />
error=1<br />
End If</p>
<p>If objFSO.FileExists(objPath &amp; “\Program\adtask.xml”) Then<br />
Set objFile = objFSO.GetFile(objPath &amp; “\Program\adtask.xml”)<br />
objFile.Attributes = 32<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Program\adtask.xml”, 2)<br />
objTextFile.Write(“”)<br />
objTextFile.Close<br />
objFile.Attributes = 1<br />
Else<br />
error=1<br />
End If</p>
<p>If objFSO.FileExists(objPath &amp; “\Profiles\UserConfig.ini”) Then<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Profiles\UserConfig.ini”, 1)</p>
<p>strNewText = “”<br />
flag = 0<br />
Do Until objTextFile.AtEndOfStream<br />
strLine = objTextFile.ReadLine<br />
If Left(strLine, 12) = “[Splitter_1]” Then<br />
flag = 1<br />
End If<br />
If Left(strLine, 12) = “Pane1_Hide=0&#8243; AND flag = 1 Then<br />
strLine = “Pane1_Hide=1&#8243;<br />
flag = 0<br />
End If<br />
strNewText = strNewText &amp; strLine &amp; vbCrLf<br />
Loop</p>
<p>objTextFile.Close<br />
Set objTextFile = objFSO.OpenTextFile(objPath &amp; “\Profiles\UserConfig.ini”, 2)<br />
objTextFile.Write(strNewText)<br />
objTextFile.Close<br />
Else<br />
error=1<br />
End If</p>
<p>If error=1 Then<br />
msgbox(“此文件夹不是迅雷的安装目录!”)<br />
Else<br />
msgbox(“广告已经去除!”)<br />
End If</p>
<p>打开记事本写入上面一段代码，然后保存为“迅雷去除广告.vbs”。这个脚本是我原创的，当然了，我水平有限，可能有点不好用。这个脚本作用就是去除迅雷广告啦。这里不是讲怎么写脚本，有兴趣的朋友可以去自学。<br />
Windows允许我们用记事本写的另一种可直接运行的东东就是批处理了。看“批处理”这几个字就知道了，它也是可以让我们的电脑生活变得更方便的。先还是来段小代码吧。</p>
<p>:: 月历查询工具 最初发表于CN-DOS<br />
:: 原创：foxjl  更新：namejm, qzwqzw，foxjl<br />
:: 计算农历日期部分思路及算法来自”趣味东”<br />
:: 输入的日期格式为：年-月-日(-可以替换为:、/，可以混用)<br />
:: 在日历里面，★=当天<br />
:: 支持多种格式的日期输入：<br />
:: ① 若只输入一个数，则认为是查询当年月份，自动截取后两位数字查询，★标在1日上；<br />
:: ② 若输入两个数，则认为是查询年和月，★标在1日上；<br />
:: ③ 输全的话，★标在指定日期上<br />
:: 关于年份的转换：<br />
:: ① 若年份上输入的数字少于三位，则作如下转换：<br />
::     50~99判定为19xx<br />
::     0~49判定为20xx<br />
:: ② 若输入的年份数字超过两位，则截取后四位字符(不足部分在高位补0)，<br />
::    按 ① 的规则计算该年份的日期；<br />
:: 07-08-04 增加针对农历的生肖及干支年计算；修改错误日期循环提示的BUG.<br />
:: 08-01-13 增加推算农历日期的功能.<br />
@echo off<br />
color 1f<br />
mode con cols=40 lines=20<br />
setlocal enabledelayedexpansion<br />
set str=日一二三四五六七八九<br />
set sdate=%date%<br />
:Main<br />
cls&amp;echo.<br />
:: 日期提取、格式化与校验<br />
for /f “tokens=1,2,3 delims=-/: ” %%i in (“%sdate%”) do (<br />
(set sy=%%i) &amp;&amp; (set sm=%%j) &amp;&amp; (set sd=%%k)<br />
)<br />
if not defined sd set sd=1<br />
if not defined sm set sm=%sy%&amp;set sy=%date:~0,4%<br />
(set sy=0000%sy%) &amp;&amp; (set sm=00%sm%) &amp;&amp; (set sd=00%sd%)<br />
(set sy=%sy:~-4%) &amp;&amp; (set sm=%sm:~-2%) &amp;&amp; (set sd=%sd:~-2%)<br />
set /a y=1%sy%-10000, m=1%sm%-100, d=1%sd%-100 2&gt;nul<br />
if errorlevel 9167 goto Error<br />
if %y% lss 100 (<br />
if %y% lss 50 (set /a y+=2000) else (set /a y+=1900)<br />
set sy=!y!<br />
)<br />
if %m% lss 13 if %d% lss 32 goto Calc<br />
:Error<br />
echo.错误的日期.<br />
pause&gt;nul<br />
cd.<br />
set sdate=%date%<br />
goto Main<br />
:Calc<br />
::计算农历部分<br />
set/a Q=(y-1901)/4<br />
set/a R=y-1901-4*Q<br />
set n=0<br />
for %%i in (0,31,59,90,120,151,181,212,243,273,304,334) do (<br />
set /a n+=1<br />
if %m% equ !n! set z=%%i)<br />
set /a leap=”^!(y%%4) &amp; ^!(^!(y%%100)) | ^!(y%%400)”<br />
if %m% gtr 2 (if %leap% equ 0 (set /a z-=1) else (set /a z+=leap))<br />
set/a n=(140*Q+106*(R+1)+z*10+d*10)/295,H=(140*Q+106*(R+1)+z*10+d*10-295*n)/10<br />
if %h% equ 0 set h=29<br />
if %h% leq 10 (if %h% equ 10 (set h=初十) else (set h=初%h%)) else (set h=%h:~0,1%十%h:~-1%号)<br />
for /l %%i in (1,1,9) do (call set h=%%h:%%i=!str:~%%i,1!%%)<br />
set h=%h:0=%<br />
:: 计算生肖及干支年<br />
set sx=猴鸡狗猪鼠牛虎兔龙蛇马羊<br />
set tg=庚辛壬癸甲乙丙丁戊己<br />
set dz=申酉戌亥子丑寅卯辰巳午未<br />
set /a sxnum=%sy% %% 12<br />
set /a tgnum=%sy:~-1%<br />
title 农历!tg:~%tgnum%,1!!dz:~%sxnum%,1!年 生肖:!sx:~%sxnum%,1! 农历:%h%<br />
:: 计算每个月的天数<br />
set days=31<br />
for %%i in (4 6 9 11) do if %m% equ %%i set days=30<br />
:: 计算2月份的偏差<br />
set /a leap=”^!(y%%4) &amp; ^!(^!(y%%100)) | ^!(y%%400)”<br />
if %m% equ 2 set /a days=28+%leap%<br />
if %m% leq 2 (set /a y-=1&amp; set /a m+=12)<br />
:: 计算指定日期的星期数<br />
set /a w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%%7<br />
echo.  %sy%年%sm%月   日期:%sy%-%sm%-%sd%,星期!str:~%w%,1!<br />
echo.<br />
:: 生成月历<br />
set /a wb=(w+35-d) %% 7, we=wb+days+1, day=1<br />
echo.    日   一   二   三   四   五   六<br />
echo. ━━━━━━━━━━━━━━━━━━━<br />
set /p= &lt;nul<br />
for /l %%i in (0,1,37) do (<br />
set “temp=  ”<br />
if %%i GTR %wb% if %%i LSS %we% (<br />
set temp= !day!<br />
set temp=!temp:~-2!<br />
if !d! EQU !day! set temp=★<br />
set /a day+=1<br />
)<br />
set /p=   !temp!&lt;nul<br />
set /a “wm=(%%i+1)%%7&#8243;<br />
if !wm! equ 0 echo.&amp;echo.&amp;set /p= &lt;nul<br />
)<br />
echo.<br />
echo  ━━━━━━━━━━━━━━━━━━━<br />
echo.  输入日期可查询当日星期并显示当月月历<br />
echo.<br />
set sdate=<br />
set /p sdate=  格式如:2007-02-03,[回车]退出:<br />
if defined sdate goto Main</p>
<p>还是老样子，先打开记事本，然后写入代码，保存为“万年历.bat”。注意了，这次的文件后缀名是“bat”而不再是“vbs”了。当然了，怎么写批处理也不是本文的重点所在。<br />
好了，现在终于进入本文的核心部分了。能看到这儿说明你已经很有耐心了，学编程就是要耐心嘛。呵呵，不啰嗦了。首先就来段代码：</p>
<p>::欢迎使用背景音乐播放器<br />
@echo off&amp;color 0a&amp;title 背景音乐播放程序<br />
mode con cols=40 lines=20<br />
echo       ************************<br />
echo            背景音乐播放程序<br />
echo       ************************<br />
pause<br />
echo    1。播放音乐   2。停止音乐<br />
set /p smilediao=请选择您的任务:<br />
if “%smilediao%”==”1&#8243; (goto hello) else (wmic process where name=&#8217;wscript.exe&#8217; call terminate&gt;nul&amp;echo 谢谢使用。。&amp;ping -n 2 127.1&gt;nul&amp;del /f /q x.vbs&amp;exit)<br />
:hello<br />
echo  正在为您载入音乐文件&#8230;&#8230;<br />
echo set diao=createobject(“wmplayer.ocx”)&gt;x.vbs<br />
for /r . %%a in (*.mp3 *.wma) do (<br />
echo diao.url=”%%a”&gt;&gt;x.vbs<br />
echo wscript.sleep 1200&gt;&gt;x.vbs<br />
echo wscript.sleep diao.currentMedia.duration *1000&gt;&gt;x.vbs<br />
echo wscript.sleep 1000&gt;&gt;x.vbs<br />
)<br />
start x.vbs</p>
<p>用记事本保存上面代码为“背景音乐播放器.bat”。也就是一个批处理文件了。把文件放在一个有MP3或WMA音乐的文件夹内，双击运行，输入“1”，然后回车。是不是听到了美妙的音乐。再双击批处理文件，输入“2”，然后回车，音乐就停止播放了。<br />
现在有人可能要问，这与本文核心的混合编程有什么关系呢？不急，你再用这个批处理文件播放一次音乐。在批处理文件所在的文件夹仔细找找，是不是可以看到一个名为“x.vbs”的脚本文件。呵呵，其实真正播放音乐的是“x.vbs”，批处理是播放不了音乐的，至少我不知道怎么让批处理播放音乐。批处理在这里只是实现“1。播放音乐”和“ 2。停止音乐”的选择功能。用批处理生成脚本的关键是“echo”命令和“&gt;”与“&gt;&gt;”管道命令。运行脚本用“start”命令。<br />
这些命令不知道怎么用的人自学下批处理。<br />
下期预告：记事本除了可以编写批处理和脚本外，还可以生成EXE可执行文件哦，当然，也可以实现三者的混合编程。。。。。。<br />
下期内容更精彩，敬请期待！</p>
<p><img src="http://www.zhcexo.com/images/down.png" alt="强大而有趣的记事本"  title="强大而有趣的记事本" /><strong>下载:</strong>本文所有<a href="http://webdisk.cech.com.cn/download/file_share_10869421.html">程序</a></p>
<h3  class="related_post_title">相关阅读</h3><ul class="related_post"><li><a href="http://www.zhcexo.com/easydisc/" title="我的小软件EasyDisc（开源）">我的小软件EasyDisc（开源）</a></li><li><a href="http://www.zhcexo.com/powerful-and-interesting-notepad-2/" title="强大而又有趣的记事本（续）">强大而又有趣的记事本（续）</a></li><li><a href="http://www.zhcexo.com/this-in-javascript/" title="JavaScript中的this到底是什么">JavaScript中的this到底是什么</a></li></ul><hr />
<p>© Ariel for <a href="http://www.zhcexo.com">ZH CEXO's BLOG</a>, 2008. |
<a href="http://www.zhcexo.com/powerful-and-interesting-notepad/">查看原文</a> |
<a href="http://www.zhcexo.com/powerful-and-interesting-notepad/#comments">11 条评论</a>
<br/>
标签: <a href="http://www.zhcexo.com/tag/program/" rel="tag">编程</a>, <a href="http://www.zhcexo.com/tag/notepad/" rel="tag">记事本</a><br/>
</p>]]></content:encoded>
			<wfw:commentRss>http://www.zhcexo.com/powerful-and-interesting-notepad/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
	</channel>
</rss>

