<?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>Rainux's Journal &#187; Windows Archives  &laquo; Rainux&#039;s Journal</title>
	<atom:link href="http://rainux.org/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://rainux.org</link>
	<description>Rubyist of Vimmer</description>
	<lastBuildDate>Sat, 23 Jul 2011 12:09:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Intel Mac 多系统（Mac OS X、GNU/Linux、Windows）原理和实践</title>
		<link>http://rainux.org/intel-mac-multi-boot-macosx-gnu-linux-windows-xp-theory-and-practice</link>
		<comments>http://rainux.org/intel-mac-multi-boot-macosx-gnu-linux-windows-xp-theory-and-practice#comments</comments>
		<pubDate>Sat, 07 Feb 2009 09:15:55 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Mac Mini]]></category>
		<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[MacBook]]></category>
		<category><![CDATA[MacBook Air]]></category>
		<category><![CDATA[三启动]]></category>
		<category><![CDATA[三系统]]></category>
		<category><![CDATA[多启动]]></category>
		<category><![CDATA[多系统]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2009/02/07/241</guid>
		<description><![CDATA[Intel Mac 安装多系统的方法网上有很多文章介绍，已经不神秘了。本文解释整个过程背后的原理以及提供关键问题的解决方案，同时介绍我自己的分区方案和实践经验。以下内容基于在一台 MacBook 上安装运行 Mac OS X 10.5、Debian GNU/Linux lenny 分支和 Windows XP 的三系统实践，所以某些细节可能会不适用于其它情况。]]></description>
			<content:encoded><![CDATA[<p>Intel Mac 安装多系统的方法网上有很多文章介绍，已经不神秘了。本文解释整个过程背后的原理以及提供关键问题的解决方案，同时介绍我自己的分区方案和实践经验。以下内容基于在一台 MacBook 上安装运行 Mac OS X 10.5、Debian GNU/Linux lenny 分支和 Windows XP 的三系统实践，所以某些细节可能会不适用于其它情况。</p>

<h2>背景</h2>

<p>理论上，所有基于 Intel CPU 的 Mac 计算机（包括 MacBook，Mac Mini 等）在安装过 Mac OS X 10.4.6 或更高版本的 combo update 和 firmware update 后都应该可以安装运行 GNU/Linux 和 Windows 2000 以上版本，但是有一些限制。</p>

<p>众所周知 PC 使用 <a href="http://en.wikipedia.org/wiki/BIOS">BIOS</a> 作为硬件 firmware 和操作系统的中间层，并且使用 <a href="http://en.wikipedia.org/wiki/Master_Boot_Record">MBR</a> 分区表作为硬盘分区方案。而 Intel Mac 与普通 PC 最大的区别就是使用了 BIOS 的下一代替代品 <a href="http://en.wikipedia.org/wiki/Extensible_Firmware_Interface">EFI</a> 和 <a href="http://en.wikipedia.org/wiki/GUID_Partition_Table">GPT</a> 分区方案。EFI 和 GPT 都分别向后兼容于 BIOS 和 MBR 分区表，所以可以支持基于 BIOS 和 MBR 的操作系统，例如 GNU/Linux 和 Windows。</p>

<p>简单地说，GPT 通过包含一份 MBR 分区表来兼容 MBR 分区方案（参考 <a href="http://en.wikipedia.org/">Wikipedia</a> 上的 <a href="http://en.wikipedia.org/wiki/GUID_Partition_Table">GPT</a> 页面）。GPT 的内容可以被同步到 MBR 分区表中，所以当硬盘使用 GPT 分区方案时，<strong>GPT 里的分区可以通过 MBR 分区表被访问到——这是在 Intel Mac 上安装基于 MBR 分区表方案的操作系统的关键</strong>。但是 MBR 分区表只能包含最多 4 个主分区（扩展分区相当于一个主分区，可以在其上划分多个逻辑分区），而 GPT 没有扩展分区和逻辑分区的概念，现有的工具在同步 GPT 到 MBR 分区表时也不会做额外的转换，所以<strong>实际上只能同步 GPT 上的前 4 个分区到 MBR 分区表中</strong>。而 Intel Mac 上运行 Windows 有一个奇怪的限制，<strong>Windows 必须被安装到 MBR 分区表中的最后一个分区上，否则会在启动时提示找不到 %SystemRoot%\system32 目录下的某文件</strong>。</p>

<p>虽然 Mac OS X 附带的 Disk Utility 可以对 GPT 分区方案的硬盘进行分区，但是不够稳定，不建议使用。<strong><a href="http://www.gnu.org/software/parted/index.shtml">GNU Parted</a></strong> 是我的选择，它对 GPT 分区方案支持比较好。另外还需要 <strong><a href="http://refit.sourceforge.net/">rEFIt</a></strong> 中的 <strong>Partitioning Tool</strong> 来同步 GPT 和 MBR 分区表，同时我也使用 rEFIt 作为多系统引导管理器，相对于目前的 <a href="http://www.gnu.org/software/grub/grub-2.en.html">GRUB2</a> 来说，它更成熟并且非常容易使用，还拥有很漂亮的图形界面。</p>

<p>GNU/Linux 内核支持 GPT，因此启动之后可以访问 GPT 上的所有分区。但是 GRUB 不支持 GPT，所以 GRUB 和 GNU/Linux 内核必须被安装到一个 MBR 分区表里的分区上。Windows 完全不支持 GPT，所以始终只能访问 MBR 分区表上的 4 个分区。</p>

<h2>双系统的特殊情况</h2>

<p>在典型的双系统情况下，你可能只有三个分区，Mac OS X 占用两个，Windows 占用一个。使用 rEFIt 同步 GPT 和 MBR 分区表后，工作很正常。然而如果你在 Mac OS X 里创建了另外一个分区，导致同步 GPT 和 MBR 后 Windows 安装分区不再是 MBR 分区表中最后一个分区，此时 Windows 就会像上文中提到那样无法启动。解决方法很简单，使用不支持 GPT 的分区工具将这个新创建的分区在 MBR 分区表中删掉即可。注意，仅仅是在 MBR 分区表中删掉，在 Mac OS X 里通过 GPT 你仍然可以访问它。</p>

<p>不支持 GPT 的分区工具包括 Linux 里的 fdisk，Windows 的 compmgmt.msc 里的磁盘管理，以及各种 Windows 下第三方工具的较老版本，例如 Paragon Partition Manager 7.0。</p>

<h2>我的分区方案</h2>

<p>Mac OS X 的常规安装需要占用两个分区，第一个是预留的 EFI System，有文章说可以安全地删除它，不过我没有尝试。GNU/Linux 和 Windows 各自需要占用一个分区，刚好达到 MBR 分区表中 4 个主分区的限制。这是大多数文章中介绍的方案，但是这样 GNU/Linux 和 Windows 都没有一个专门存储数据的分区，GNU/Linux 也没有 swap 分区，使用上并不方便。</p>

<p>以下是我的分区方案，使用 GNU/Linux 的设备描述方式：</p>

<pre><code>/dev/sda1 200.00MB  EFI System
/dev/sda2 43.83GB   HFS+ 文件系统，Mac OS X 安装分区
/dev/sda3 13.50GB   ext3 文件系统，同时作为 GNU/Linux 的 /boot，/home 和 Windows 里的 D: 盘
/dev/sda4 5.00GB    NTFS 文件系统，Windows 安装分区 C: 盘
/dev/sda5 10.00GB   reiserfs 文件系统，GNU/Linux 的安装分区 / 目录
/dev/sda6 2.00GB    linux-swap 文件系统，GNU/Linux 的交换分区
</code></pre>

<p>使用 rEFIt 的 Partitioning Tool 进行同步后，/dev/sda4 刚好是 MBR 分区表中的最后一个分区，符合上面提到的 Intel Mac 运行 Windows 的必要条件。</p>

<p>在 Windows 里安装 <a href="http://www.fs-driver.org/">Ext2 IFS</a> 或者 <a href="http://ext2fsd.sourceforge.net/">Ext2fsd</a> 即可将 ext3 文件系统的 /dev/sda3 当成 ext2 文件系统挂载为 D: 盘。要注意的是目前主流发行版里的 mkfs.ext3 默认会创建 inode 为 256 字节的 ext3 文件系统，而 Ext2 IFS 只支持 inode 大小为 128 字节的 ext3 文件系统，Ext2fsd 则没有问题。或者也可以使用 mkfs.ext3 -I 128 来创建 inode 大小为 128 字节的 ext3 文件系统。</p>

<p>Windows 还可以通过安装 <a href="http://www.mediafour.com/products/macdrive/">MacDrive</a> 来访问安装 Mac OS X 的 HFS+ 分区，它对 HFS+ 文件系统支持很好。和 Ext2 IFS 及 Ext2fsd 一样，安装它以后你可以将 HTFS+ 文件系统的分区挂载为 Windows 下的一个逻辑盘。与 Ext2 IFS 和 Ext2fsd 不同的是，这个逻辑盘的盘符只能在 Windows 自己的磁盘管理工具里修改。但是它可能跟 Ext2fsd 有冲突，每次安装 Ext2fsd 后都会由 MacDrive 的某个驱动程序导致 Windows 蓝屏。与 Ext2 IFS 同时安装使用就没有问题。MacDrive 是本文提到的第三方工具中唯一一个商业软件。</p>

<p>Mac OS X 也可以通过安装 <a href="http://sourceforge.net/projects/ext2fsx/">Mac OS X Ext2 Filesystem</a> 来访问 /dev/sda3，并将其作为单独的个人数据分区。不过我没有这么做，因为事实上我几乎不使用 Mac OS X，我觉得 Debian GNU/Linux 提供的类 Unix 环境比 Mac OS X 的更友好，保留它只是因为这台 MacBook 的主人需要它。</p>

<p>这个方案的好处是 Windows 可以有 D: 盘来将系统和个人数据分开，GNU/Linux 也可以有多个分区来分离系统和个人数据。实际上因为 GNU/Linux 内核 支持 GPT，后面可以创建更多分区给 GNU/Linux，不过我使用的 MacBook 硬盘只有 80GB，分区太多各个分区空间利用率反而降低，所以 /dev/sda3 身兼了三职。这样做还有个好处，Windows 里的 Cygwin 和 GNU/Linux 可以很容易的共享同一个 $HOME 目录，不管是 <a href="http://www.rainux.org/2008/12/08/240">TM2008</a>、Pidgin 还是 OpenSSH、zsh、Vim/gVim 都可以很方便地在两个系统共享同一套配置和数据文件。</p>

<h2>准备工具</h2>

<ul>
<li>一台 Intel Mac。</li>
<li>Mac OS X 10.4 以上安装光盘，如果 Intel Mac 上已经安装好了 Mac OS X，则不需要。</li>
<li>Windows 安装光盘，原始版本或者 Ghost 版本都可以。</li>
<li>一张包含 GNU Parted 的 GNU/Linux 安装光盘或者 Live CD，例如我使用的 Debian 安装光盘。</li>
<li><a href="http://refit.sourceforge.net/">rEFIt</a> 安装程序。</li>
</ul>

<p>因为 Intel Mac 对 USB 存储设备的 BIOS 兼容启动支持很差，所以上面提到的都是光盘。</p>

<h2>安装步骤</h2>

<ol>
<li><p>按照常规的方式将 Mac OS X 安装到<strong>一个</strong>分区上。建议将安装光盘的 dmg 镜像使用 Disk Utility 恢复到一块移动硬盘的某个主分区上，再用它启动安装程序，这样安装过程会比较快。如果你的 Intel Mac 上已经有一个正常使用的 Mac OS X 10.4 以上版本，这一步可以直接忽略。</p></li>
<li><p>使用 Mac 主菜单里的 Software Update 安装最新的 combo update 和 firmware update。</p></li>
<li><p>在 Mac OS X 里使用命令行工具 diskutil 将 Mac OS X 安装分区动态缩小（也可以使用 BootCamp），为其它系统预留出足够的空间。这一步的目的只是留出空间，详细的分区过程将使用 GNU Parted。命令格式如下，第一个 45G 是 Mac OS X 安装分区 disk0s2 将要被缩小到的大小。第二个 30G 只是用来占位的分区，必须提供，否则 diskutil 完成工作之后你会发现 disk0s2 大小没有变化。<strong>在这么做之前请使用 diskutil list 查看 GPT，确保你的 Mac OS X 是安装在 disk0s2</strong>。</p>

<pre name="code" class="bash">sudo diskutil resizeVolume disk0s2 45G "MS-DOS FAT32" "Windows" 30G
</pre></li>
<li><p>在 Mac OS X 里安装多系统引导管理器 rEFIt。安装完成以后每次启动时都可以看到 rEFIt 的图形界面，通过它可以选择启动不同的系统，以及访问 rEFIt 的 Partitioning Tool 进行 GPT 和 MBR 分区表的同步。</p></li>
<li><p>使用 Debian 安装光盘（或者其它包含 GNU Parted 的 LiveCD）启动 Intel Mac，在硬盘分区步骤即可以使用 GNU Parted 工具。删掉刚才预留的 30G 占位分区，将空闲空间按照上面提到的方案分成 4 个分区。此处 GNU Parted 不能创建 NTFS 文件系统，所以 /dev/sda4 暂时使用 ext3 或者其它文件系统，将来可以用 Windows 安装程序重新格式化为 NTFS。我在这一步直接安装好了 Debian GNU/Linux，你也可以在分区完成后取消安装过程，安装你喜欢的其它发行版。我猜测大多数的发行版使用的分区工具都应该是 GNU Parted，因此这一步你应该可以直接使用你喜欢的发行版的安装光盘。</p></li>
<li><p>重新启动后在 rEFIt 的图形界面里进入 Partitioning Tool，按提示进行 GPT 和 MBR 的同步。</p></li>
<li><p>使用 Windows 安装光盘启动 Intel Mac 并将最后一个分区（Windows 安装程序看到的最后一个分区只是 MBR 分区表中的最后一个分区，即 /dev/sda4）格式化为 NTFS，安装 Windows。</p></li>
<li><p>也可以用国内常见的各种 GhostXP 光盘来安装 Windows，但是必须要使用带有 Windows PE 的版本。<strong>因为 Intel Mac 几乎完全不能运行 DOS 下的任何程序，所以必须使用光盘上的 Windows PE 启动，然后使用 GHOST32 来恢复光盘上的 .GHO 文件到预留的 Windows 安装分区 /dev/sda4</strong>。这里还可能会遇到一个问题，<strong>如果执行 GHOST32 之前你已经将 /dev/sda4 格式化成了 FAT32 文件系统（也可能是 NTFS），很有可能在 GHOST32 中选择目标分区时看不到它，而保留在第 5 步中选择的 ext3 或者 reiserfs 文件系统则没有问题</strong>。</p></li>
</ol>

<h2>参考资料</h2>

<ul>
<li><a href="http://wiki.onmac.net/index.php/Triple_Boot_via_BootCamp">Triple Boot via BootCamp - OnMac.net Wiki</a></li>
<li><a href="http://refit.sourceforge.net/myths/">rEFIt - Myths and Facts About Intel Macs</a></li>
<li><a href="http://wiki.debian.org/MacBook">MacBook - Debian Wiki</a></li>
</ul>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/mac-mini/" title="Mac Mini" rel="tag">Mac Mini</a>, <a href="http://rainux.org/tag/mac-os-x/" title="Mac OS X" rel="tag">Mac OS X</a>, <a href="http://rainux.org/tag/macbook/" title="MacBook" rel="tag">MacBook</a>, <a href="http://rainux.org/tag/macbook-air/" title="MacBook Air" rel="tag">MacBook Air</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a>, <a href="http://rainux.org/tag/%e4%b8%89%e5%90%af%e5%8a%a8/" title="三启动" rel="tag">三启动</a>, <a href="http://rainux.org/tag/%e4%b8%89%e7%b3%bb%e7%bb%9f/" title="三系统" rel="tag">三系统</a>, <a href="http://rainux.org/tag/%e5%a4%9a%e5%90%af%e5%8a%a8/" title="多启动" rel="tag">多启动</a>, <a href="http://rainux.org/tag/%e5%a4%9a%e7%b3%bb%e7%bb%9f/" title="多系统" rel="tag">多系统</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/intel-mac-multi-boot-macosx-gnu-linux-windows-xp-theory-and-practice/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Linux 下使用 Wine 安装运行 TM2008 Beta 及乱码、与 Windows 共享聊天记录等相关问题的解决</title>
		<link>http://rainux.org/running-tm2008-beta-with-wine</link>
		<comments>http://rainux.org/running-tm2008-beta-with-wine#comments</comments>
		<pubDate>Mon, 08 Dec 2008 02:55:58 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[QQ]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[TM2008]]></category>
		<category><![CDATA[Wine]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/12/08/240</guid>
		<description><![CDATA[前言 腾讯已经发布了官方的 QQ for Linux，虽然有很多问题，例如没有 amd64 版本，功能太弱，聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等，但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了，那么不必浪费时间看本文。 精简版本 如果你没时间看我唠叨，精简的版本是：TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库，安装程序需要 GDI+。不可以使用 IEs4Linux，因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 rpcrt4.dll，然后用 winetricks 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。 详细版本 只看精简版没搞定？请看详细的（唠叨的）版本： 安装 Wine，运行一下 winecfg，让它生成一个干净的 [...]]]></description>
			<content:encoded><![CDATA[<h2>前言</h2>

<p>腾讯已经发布了官方的 QQ for Linux，虽然有很多问题，例如没有 amd64 版本，功能太弱，聊天记录格式与 Windows 下的 QQ/TM 格式不一致等等，但无疑是 Linux 里使用 QQ/TM 最简单的方案。如果它已经能满足你的需求了，那么不必浪费时间看本文。</p>

<h2>精简版本</h2>

<p>如果你没时间看我唠叨，精简的版本是：TM2008 Beta 运行需要 Unicode 版本的 IE6、rpcrt4.dll、Visual C++ 2005 SP1 运行库，安装程序需要 GDI+。不可以使用 <a href="http://www.tatanka.com.br/ies4linux/page/Main_Page">IEs4Linux</a>，因为它安装的 IE6 及相关运行库是 Win9x 的 ANSI 版本。必须使用 CrossOver Games 里的 <a href="/stuff/rpcrt4.dll.gz">rpcrt4.dll</a>，然后用 <a href="http://www.kegel.com/wine/winetricks">winetricks</a> 安装 msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1 即可安装运行 TM2008 Beta。</p>

<h2>详细版本</h2>

<p>只看精简版没搞定？请看详细的（唠叨的）版本：</p>

<p>安装 Wine，运行一下 winecfg，让它生成一个干净的 ~/.wine 目录。如果要使用已有的 ~/.wine，请先将其备份。同时确保 winecfg 里设置的 Windows 版本至少是 Windows 2000（我用的是 Wine 1.x 默认的 Windows XP）。</p>

<p>获取一份 CrossOver Games 里的 <a href="/stuff/rpcrt4.dll.gz">rpcrt4.dll</a>，将其复制为 ~/.wine/drive_c/windows/system32/rpcrt4.dll（覆盖已有的文件），运行 winecfg，在 Libraries -> DLL Overrides 里将 rpcrt4 设置为 Native (Windows)。</p>

<p>下载 <a href="http://www.kegel.com/wine/winetricks">winetricks</a>，使用它安装 IE6 和一些重要的运行库。如果这个过程失败，删除 ~/.wine（或者恢复备份的 ~/.wine）并从头再来。</p>

<pre name="code" class="bash">sh winetricks msxml3 gdiplus riched20 riched30 ie6 vcrun6 vcrun2005sp1
</pre>

<p>此时如果你有 Windows 上安装好的 TM2008，它已经可以运行了，但是无法登录，会提示“网络连接失败，请检查网络。”。所以还是老老实实用安装程序装一次吧。这里有个很莫名的问题，如果直接使用 Wine 运行 TM2008 安装程序，它很可能会直接崩溃，看不到任何图形界面的提示。而使用 Wine 运行一个其它的程序，例如 cmd.exe 或者 Total Commander，再用这个程序去启动 TM2008 安装程序则不会有任何问题。</p>

<h2>中文乱码（空心方框）问题</h2>

<p>好吧，终于看到 TM2008 的安装界面了，不过很可能你又会头大了——所有的中文全是空心方框。原因是安装程序界面的字体是被指定为 Tahoma 的，而实际上 Tahoma 字体并不包括中文字符。有两个办法解决，都是 Windows 的技术，把 Tahoma 字体替换成某个中文字体，或者把某个中文字体链接到 Tahoma 上。照这两个片段修改 ~/.wine/system.reg，只需要其中一个。别忘了把中文字体名改成你自己需要的。</p>

<pre><code>[Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes]
"MS Shell Dlg"="Microsoft YaHei"
"MS Shell Dlg 2"="Microsoft YaHei"
"Tahoma"="Microsoft YaHei"

[Software\Microsoft\Windows NT\CurrentVersion\FontLink\SystemLink]
"Tahoma"=str(7):"SimSun.TTC,SimSun\0"
</code></pre>

<p>最后还必须把你改的中文字体文件符号链接到 ~/.wine/drive_c/windows/Fonts 目录下，不这么做其它软件都没问题，就 QQ 或 TM 会乱码，该死的硬编码。</p>

<h2>查看聊天记录时的性能问题</h2>

<p>好了，现在不会有什么问题阻挡你了，TM2008 Beta 安装和启动都非常顺利，使用也很稳定。甚至 QQ2009 Preview4 都可以安装并启动，不过使用时很容易崩溃。但是如果你像我这样疯狂地保存了七八年的聊天记录，你会发现：</p>

<ul>
<li>每次启动 TM2008 后第一次给任何人发消息都会导致 TM2008 失去响应将近 20 秒钟，之后继续发消息则不会有问题。第一次接收到某人的消息也会同样如此。</li>
<li>任何试图查看聊天记录的操作都会导致 TM2008 消耗 100% CPU 并且很长时间没有反应，等待足够长的时间后才可以看到聊天记录。</li>
</ul>

<p>这是由于 TM2008 的聊天记录数据库使用了 Windows 的 Structured Storage 技术，而其 API 库 ole32.dll 的 Wine 实现还不完善或者可能性能太低。虽然可以用 winetricks 安装 dcom98 来获取一个 Win9x 的 ANSI 版本的 ole32.dll，但它没法让 Unicode 版本的 TM2008 运行起来。搜遍了网络也找不到在 Wine 里使用 Win2k 以上系统的 ole32.dll 的方法。没办法，为了保持聊天记录的一致性，只有两个选择。要么不在 Linux 里看聊天记录；要么把聊天记录数据库 Msg2.0.db 备份并从 QQ Profile 目录（我的文档\QQ Files\QQ 号码）里删除，让 TM2008 自己生成一个空白的 Msg2.0.db，暂时抛弃历史包袱，以后再到 Windows 下把新的记录导出为备份文件后合并到老的数据库里。</p>

<h2>与 Windows 共享聊天记录</h2>

<p>如果你还像我这样偶尔会切换到 Windows，希望跟 Windows 下的 TM2008 共享聊天记录数据库，那么有两个办法：</p>

<ul>
<li>直接在 Linux 里使用 <a href="http://www.ntfs-3g.org/">ntfs-3g</a> 读写存放 TM2008 聊天记录的 NTFS 分区。虽然 ntfs-3g 已经号称非常稳定可靠了，但对于聊天记录这种极度个人化的数据我还是宁可保守一些。</li>
<li>创建一个 ext2 分区用来和 Windows 共享数据，在 Windows 下可以用 <a href="http://www.fs-driver.org/">Ext2 IFS</a> 驱动来访问它。比起私有文件系统 NTFS 的 Linux 版开源驱动来说，当然是开源的 ext2 文件系统的 Windows 版驱动更值得信赖。</li>
</ul>

<p>用这两种办法都需要在 Linux 和 Windows 里创建 QQ Files 目录的符号链接，Linux 里不必说，ln -s 即可。Windows Vista 以前的版本可以用 <a href="http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx">Junction</a> 来创建 NTFS 上的符号链接，Windows Vista 可以用自带的 MKLINK。</p>

<p>对于我这种非笔记本用户来说使用日志文件系统来抵御意外断电是必须的。按照 <a href="http://www.fs-driver.org/faq.html#acc_ext3">Ext2 IFS 的 FAQ</a>，它也可以读写 ext3 分区。<del datetime="2009-01-19T12:08:05+00:00">不过比较新的 Linux 发行版的 mkfs.ext3 创建的 ext3 分区 Ext2 IFS 是无法访问的，可能是 ext3 文件系统格式发生了变化。而 Windows 下一些分区工具如 Paragon Partition Manager 或 Acronis Disk Director 创建的 ext3 分区则没有问题。</del><ins datetime="2009-01-19T12:08:05+00:00">比较新的 Linux 发行版的 mkfs.ext3 默认创建的 ext3 分区 inode 大小是 256 字节，Ext2 IFS 不支持这样的 ext3 分区，使用 mkfs.ext3 -I 128 即可创建 inode 大小为 128 字节的能被 Ext2 IFS 支持的 ext3 分区。不建议使用 Paragon Partition Manager 等 Windows 下的工具创建 ext3 分区，至少 PPM 创建的 ext3 分区是没有目录 hash 的。<a href="http://ext2fsd.sourceforge.net/">Ext2fsd</a> 支持 inode 大小为 256 字节的 ext3 分区，不过虽然相对 Ext2 IFS 它有 GPL 的优势，但似乎成熟度比 Ext2 IFS 低，而且我试用的感觉并不太好，所以没有选择它。</ins></p>

<h2>参考资料</h2>

<ul>
<li><a href="http://mediakey.dk/~cc/howto-office-2007-on-linux-with-wine/">Howto: Office 2007 on Linux with Wine</a></li>
<li><a href="http://www.wine-reviews.net/microsoft/microsoft-office-2007-update.html">Microsoft Office 2007 Update</a></li>
</ul>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/qq/" title="QQ" rel="tag">QQ</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/tm2008/" title="TM2008" rel="tag">TM2008</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a>, <a href="http://rainux.org/tag/wine/" title="Wine" rel="tag">Wine</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/running-tm2008-beta-with-wine/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>基于公钥认证方式的 OpenSSH Server 自动登录完全手册（Linux/Windows 下的 SSH 自动登录指南）</title>
		<link>http://rainux.org/openssh-public-key-authentication-guide-automatic-login</link>
		<comments>http://rainux.org/openssh-public-key-authentication-guide-automatic-login#comments</comments>
		<pubDate>Tue, 02 Sep 2008 07:16:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2008/09/02/189</guid>
		<description><![CDATA[概述 假设要以用户 rainux 的身份登录运行 OpenSSH Server 的远程主机 www.rainux.org（现在几乎所有的 Linux 服务器都使用 OpenSSH Server 作为 SSH Server），那么需要做的操作如下： 生成用于 SSH 身份认证的密钥。密钥由公钥和私钥组成，一个公钥只对应一个私钥，一个私钥也只对应一个公钥。 将 OpenSSH 格式的公钥文本追加到远程主机上的 ~rainux/.ssh/authorized_keys 文件里（~rainux 意为用户 rainux 的 HOME 目录）。注意公钥文本中应该没有换行符，一行就是一个公钥。 确保 ~rainux/.ssh/authorized_keys 权限为 600，~/rainux/.ssh 目录权限为 700，并且它们的所有者都是 rainux。 指定 SSH 客户端使用对应的私钥并以用户 rainux 的身份登录 www.rainux.org，此时无需输入 rainux 在 www.rainux.org 上的密码。 注意，如果私钥是以加密形式存储的（强烈建议使用一个强壮的密码加密私钥，这样即使私钥文件被窃取，也无法被直接使用），第四步仍然需要输入加密私钥所用的密码。但是 PuTTY 和 OpenSSH 都有提供一个代理程序用于避免多次重复输入密码。运行代理程序后将私钥添加到其中，并且输入一次加密私钥所用的密码，然后保持代理程序的运行，以后 SSH 客户端即可在需要使用私钥进行身份认证的场合请求代理程序去完成身份认证（这是为了确保私钥不会被泄漏到任何使用代理程序的客户端上），无须再次输入任何密码。 Linux / Cygwin [...]]]></description>
			<content:encoded><![CDATA[<h2>概述</h2>

<p>假设要以用户 rainux 的身份登录运行 OpenSSH Server 的远程主机 www.rainux.org（现在几乎所有的 Linux 服务器都使用 OpenSSH Server 作为 SSH Server），那么需要做的操作如下：</p>

<ol>
<li><p>生成用于 SSH 身份认证的密钥。密钥由公钥和私钥组成，一个公钥只对应一个私钥，一个私钥也只对应一个公钥。</p></li>
<li><p>将 OpenSSH 格式的公钥文本追加到远程主机上的 <code>~rainux/.ssh/authorized_keys</code> 文件里（<code>~rainux</code> 意为用户 rainux 的 HOME 目录）。注意公钥文本中应该没有换行符，一行就是一个公钥。</p></li>
<li><p>确保 <code>~rainux/.ssh/authorized_keys</code> 权限为 600，<code>~/rainux/.ssh</code> 目录权限为 700，并且它们的所有者都是 rainux。</p></li>
<li><p>指定 SSH 客户端使用对应的私钥并以用户 rainux 的身份登录 www.rainux.org，此时无需输入 rainux 在 www.rainux.org 上的密码。</p></li>
</ol>

<p>注意，如果私钥是以加密形式存储的（强烈建议使用一个强壮的密码加密私钥，这样即使私钥文件被窃取，也无法被直接使用），第四步仍然需要输入加密私钥所用的密码。但是 PuTTY 和 OpenSSH 都有提供一个代理程序用于避免多次重复输入密码。运行代理程序后将私钥添加到其中，并且输入一次加密私钥所用的密码，然后保持代理程序的运行，以后 SSH 客户端即可在需要使用私钥进行身份认证的场合请求代理程序去完成身份认证（这是为了确保私钥不会被泄漏到任何使用代理程序的客户端上），无须再次输入任何密码。</p>

<h2>Linux / Cygwin / MSYS 上使用 OpenSSH Client</h2>

<h3>生成密钥</h3>

<p>执行 <code>ssh-keygen</code> 接受默认文件名，并且输入加密私钥用的密码（passphrase）即可生成私钥 <code>~/.ssh/id_rsa</code> 和对应的公钥 <code>~/.ssh/id_rsa.pub</code>。其中 <code>id_rsa.pub</code> 的内容可以直接追加到远程主机的 <code>authorized_keys</code> 文件里。</p>

<h3>使用私钥</h3>

<p>把公钥部署到远程主机上后，即可直接执行 <code>ssh rainux@www.rainux.org</code> 来登录远程主机。但如果私钥是加密形式保存，如上所述应该使用代理程序 ssh-agent 来避免每次输入密码。</p>

<p>直接执行 <code>ssh-add</code> 命令可以添加刚才生成的私钥到 ssh-agent 里，也可以用 <code>ssh-add -l</code> 查看已经添加的私钥。如果执行 ssh-add 时提示无法连接身份认证代理，则需要使用以下命令来启动 ssh-agent。</p>

<pre name="code" class="bash">eval `ssh-agent`
</pre>

<p>使用 eval 是为了执行 ssh-agent 输出的设置环境变量的 bash 命令，以确保 ssh-add 可以通过 <code>SSH_AUTH_SOCK</code> 环境变量找到 ssh-agent。</p>

<p>GNOME 的桌面系统如果有安装 gnome-keyring，它会自动管理 ssh-agent，通常甚至无须手工添加私钥到 ssh-agent 里，第一次使用公钥时 gnome-keyring 就会提示输入一次密码，以后则不再需要。</p>

<h2>Windows 上使用 PuTTY</h2>

<h3>生成密钥</h3>

<p>到 <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/">PuTTY</a> 的<a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html">下载页面</a>下载 <a href="http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.60-installer.exe">putty-0.60-installer.exe</a> 或者 <a href="http://the.earth.li/~sgtatham/putty/latest/x86/putty.zip">putty.zip</a>，两者都包含 PuTTY 所有的组件。</p>

<p>安装好 PuTTY 之后（对于 zip 版本来说，解压到任意目录即可）运行 PuTTYGen 生成自己的密钥。选择密钥类型为 SSH-2 RSA，点击 Generate，按照提示在 PuTTYGen 窗口内随机移动鼠标直到进度条达到 100%，然后 PuTYYGen 会生成密钥并且显示其公钥部分信息。这里可以填写一个有意义的注释，然后输入一个用来加密私钥的强壮的密码（Key passphrase）。最后点击 Save private key 将私钥保存为一个 .ppk 文件。不需要单独 Save public key，因为 .ppk 文件里已经包含了公钥。并且通过 Save public key 保存出来的公钥文件格式与 OpenSSH 的格式并不相同，若要将公钥部署到使用 OpenSSH Server 的服务器上，只能使用 PuTTYGen 窗口上显示的那一段 Public key for pasting into OpenSSH authorized_keys file。</p>

<h3>使用私钥</h3>

<p>将公钥部署到远程主机上之后，使用 PuTTY 登录该远程主机时可以在 Connection > SSH > Auth 里选择用于身份认证的私钥文件。同样，如果私钥是加密形式保存，应该使用代理程序 Pageant 以避免每次输入密码。</p>

<p>最简单的办法是创建一个 Pageant 的快捷方式，并且将 .ppk 私钥文件作为参数加到快捷方式的“目标”栏里，添加之后看上去应该像这样：</p>

<pre name="code" class="cmd">C:\PuTTY\pageant.exe D:\main.ppk "D:\My Secrets\secondary.ppk"
</pre>

<p>就像上面的例子一样，如果私钥文件路径中带有空格，应该使用引号将其括起来。通过这个快捷方式启动 Pageant 则会自动装载指定的私钥文件，并且立即询问用于加密私钥的密码。以后只要保持 Pageant 的运行，并且在 PuTTY 的某个 Saved session 里设置 Connnection > Data 里设置 Auto-login username，即可实现双击该 session 则完全自动登录。</p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/openssh-public-key-authentication-guide-automatic-login/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用 SVN 来管理 Vim 配置文件 .vimrc 及插件集</title>
		<link>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86</link>
		<comments>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86#comments</comments>
		<pubDate>Mon, 05 Nov 2007 14:42:27 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/11/05/187</guid>
		<description><![CDATA[注: 本文第一次写作时没有进行全面的测试，由于 svn update 操作更新文件时会破坏 NTFS 上的硬链接而导致第一次的方法无法正常使用。现在你看到的已经是新的方法。在此为我的疏忽向大家道歉。 现在我的生活早已离不开 Vim 了，无论是在公司还是在家里，无论是在本地计算机还是远程服务器上，Vim 必定是我使用得最多的程序之一。当然了，Vim 虽好，也一定要有符合自己习惯的 .vimrc 和插件集才能发挥出更大的潜能，让我们用得更爽。也就是说，.vimrc 肯定是会被经常修改的，插件集也应该会时常添加新成员或进行版本更新。显然，要在家里和公司以及一些远程服务器之间频繁地同步这些修改是件很烦人的事。幸好，我们有 Subversion 可以让这一切变得简单。 让我们从公司的 Linux 桌面机上开始。 # 将 $HOME 里的 .vimrc 和 .vim 目录放到 vimfiles 目录里以便进行 SVN 导入操作 cd ~ mkdir vimfiles mv .vimrc vimfiles mv .vim vimfiles svn import vimfiles http://svn.rainux.org/vimfiles/trunk # 从 SVN 里 checkout 出一份 working copy 到 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>注: 本文第一次写作时没有进行全面的测试，由于 svn update 操作更新文件时会破坏 NTFS 上的硬链接而导致第一次的方法无法正常使用。现在你看到的已经是新的方法。在此为我的疏忽向大家道歉。</strong></p>

<p>现在我的生活早已离不开 Vim 了，无论是在公司还是在家里，无论是在本地计算机还是远程服务器上，Vim 必定是我使用得最多的程序之一。当然了，Vim 虽好，也一定要有符合自己习惯的 .vimrc 和插件集才能发挥出更大的潜能，让我们用得更爽。也就是说，.vimrc 肯定是会被经常修改的，插件集也应该会时常添加新成员或进行版本更新。显然，要在家里和公司以及一些远程服务器之间频繁地同步这些修改是件很烦人的事。幸好，我们有 Subversion 可以让这一切变得简单。</p>

<p>让我们从公司的 Linux 桌面机上开始。</p>

<pre name="code" class="bash"># 将 $HOME 里的 .vimrc 和 .vim 目录放到 vimfiles 目录里以便进行 SVN 导入操作
cd ~
mkdir vimfiles
mv .vimrc vimfiles
mv .vim vimfiles
svn import vimfiles http://svn.rainux.org/vimfiles/trunk
# 从 SVN 里 checkout 出一份 working copy 到 $HOME 里，
# 并且设置忽略掉 $HOME 里其他所有文件
svn co http://svn.rainux.org/vimfiles/trunk .
svn ps svn:ignore '*' .
svn ci -m "Let's ignore all files those not managed by Subversion in $HOME."
# 用来进行导入操作的 vimfiles 目录已经不再有任何存在的意义了
rm -rf vimfiles
</pre>

<p>好了，我们的 .vimrc 和插件集已经版本化了，下班回家。</p>

<pre name="code" class="cmd"># 先备份一下家里 Windows 上的文件，这假设我们没有使用 Cygwin
CD %HOME%
MOVE .vimrc .vimrc.backup
MOVE vimfiles vimfiles.backup
svn co http://svn.rainux.org/vimfiles/trunk .
</pre>

<p>现在我们遇到问题了，Vim 在 Windows 上会尝试从 %HOME%\vimfiles 目录加载用户脚本，而不会理会 %HOME%&#92;.vim 目录。我的解决办法是为 .vim 目录建立符号链接 vimfiles，这需要 %HOME% 所在分区必须是 NTFS 文件系统。新的问题是 Windows 本身并没有附带创建符号链接的工具，需要用 Sysinternals 提供的命令行工具 <a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx">junction.exe</a> 或者 Windows 2000 Resource Kit 里的 linkd.exe 来创建。</p>

<pre name="code" class="cmd">CD %HOME%
junction vimfiles .vim
</pre>

<p>OK，开始享受 Subversion 为我们带来的便利吧！不仅仅可以方便的同步在公司和在家里对 .vimrc 及插件集的修改，在远程服务器上要取得这些最新的修改也变得非常容易。什么，某个服务器上还在使用古老的 Vim 6.3 ？没有关系，为 http://svn.rainux.org/vimfiles 创建一个名为 6.x 的 branch，删掉无法用于 6.x 的插件即可。</p>

<p>最后，如果你对我的 Vim 配置感兴趣，可以从上面提到的 URL 里 checkout 一份出来看看，是的，它是真实的 URL。:)</p>

<p>Update: <ins datetime="2009-02-21T02:10:49+00:00">作为狂热的 Git 爱好者，我已经使用 Git 来管理我的 Vim 配置文件了，请访问<a href="/my-vimrc">我的 Vim 配置文件</a>页面。</ins></p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/subversion/" title="Subversion" rel="tag">Subversion</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e4%bd%bf%e7%94%a8-svn-%e6%9d%a5%e7%ae%a1%e7%90%86-vim-%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6-vimrc-%e5%8f%8a%e6%8f%92%e4%bb%b6%e9%9b%86/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>解决 gvimext 在 UTF-8 locale 下乱码的问题</title>
		<link>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98</link>
		<comments>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98#comments</comments>
		<pubDate>Tue, 19 Jun 2007 20:43:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[gVim]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://www.rainux.org/2007/06/20/155</guid>
		<description><![CDATA[gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。 但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。 曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 [...]]]></description>
			<content:encoded><![CDATA[<p>gvimext.dll 是一个为 Windows 里任意文件的右键菜单 (context menu) 添加“用 Vim 编辑”菜单项的 shell 扩展，随 gVim 一起安装。</p>

<p>但是无论是官方的安装版本，还是我自己编译的版本，在使用 UTF-8 locale 时 (比如设置环境变量 LANG 为 zh_CN.UTF-8) 这个右键菜单项都会显示乱码。其实原因很简单，Windows 并不原生支持 UTF-8 编码，所以直接使用 TextOut() 之类的 API 输出 UTF-8 编码的消息文本肯定会显示乱码。</p>

<p>曾经尝试修改 gvimext.cpp，在里面覆盖环境变量 LANG 的值，去掉末尾的 .UTF-8，但这样做的结果是导致 gvimext.dll 寄生进程 explorer.exe 或 TotalCmd.exe (如果是在 Total Commander 中使用右键菜单的话) 的 LANG 也被修改，造成由 explorer 启动的 gVim 的 LANG 也成了被去掉 .UTF-8 的值 (因为子进程默认会继承父进程的环境变量)。后来又想起了 Cygwin 里的 OUTPUT&#95;CHARSET 环境变量，可以在 gvimext 里将获取到的 UTF-8 消息文本使用 iconv() 转换为 OUTPUT_CHARSET 设定的编码，这样问题就可以圆满的解决了。</p>

<p>直到今天打算来实施这个想法时，又回头去看了一下以前 Google 到的这篇 <a href="http://www.linuxselfhelp.com/HOWTO/Unicode-HOWTO-3.html">The Unicode HOWTO: Locale setup</a>，才发现原来 glibc 本来就有这样的自动编码转换能力，并且 2.2 以后的版本也不再需要设定 OUTPUT&#95;CHARSET 了。偶太无知无畏了……</p>

<p>那么 gVim 安装版里的 libintl.dll 肯定不是 gcc 编译的，所以没有自动编码转换能力导致乱码，用 PEiD 看了一下果然是 MS VC 6.0 编译。接下来就简单了，去 <a href="http://gnuwin32.sourceforge.net/">GnuWin32</a> 的 <a href="http://gnuwin32.sourceforge.net/packages/libintl.htm">LibIntl</a> 页面下载 Binaries 和 Dependencies 两个压缩包，取得其中的 libintl3.dll 和 libiconv2.dll，前者改名为 libintl.dll (gVim 被硬编码为只尝试载入 libintl.dll 这个文件，想了想没必要改源代码，因为以后 LibIntl 出了新版本 libintl3.dll 里的 3 还会变化)。然后将这两个文件放到 PATH 环境变量中列出的任意一个目录里，最后删掉 gVim 安装目录下的 libintl.dll，OK，一切都是那么完美了。:p</p>

	标签：<a href="http://rainux.org/tag/gvim/" title="gVim" rel="tag">gVim</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e8%a7%a3%e5%86%b3-gvimext-%e5%9c%a8-utf-8-locale-%e4%b8%8b%e4%b9%b1%e7%a0%81%e7%9a%84%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Vim 7.0c beta Win32 binary</title>
		<link>http://rainux.org/vim-70c-beta-win32-binary</link>
		<comments>http://rainux.org/vim-70c-beta-win32-binary#comments</comments>
		<pubDate>Mon, 03 Apr 2006 15:58:45 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=131</guid>
		<description><![CDATA[偶拿 Microsoft Visual C++ 7.1 编译的，非 OLE 的 GUI 版本和 console 版本。 四个文件保持目录结构解压到某个地方，运行其中的 install.exe 即可。需要注意的是这些压缩包中没有 iconv.dll 和 diff.exe。如果你认为自己解决这些问题比较麻烦，或许你应该等待偶发布 NSIS 的安装程序的版本。 下载: gvim70c.zip vim70clang.zip vim70crt.zip vim70cw32.zip 附上偶的 .vimrc 文件: .vimrc 标签：Software_软件, Vim, Windows]]></description>
			<content:encoded><![CDATA[<p>偶拿 Microsoft Visual C++ 7.1 编译的，非 OLE 的 GUI 版本和 console 版本。</p>

<p>四个文件保持目录结构解压到某个地方，运行其中的 install.exe 即可。需要注意的是这些压缩包中没有 iconv.dll 和 diff.exe。如果你认为自己解决这些问题比较麻烦，或许你应该等待偶发布 NSIS 的安装程序的版本。</p>

<p>下载:
<a href="/vim/gvim70c.zip">gvim70c.zip</a>
<a href="/vim/vim70clang.zip">vim70clang.zip</a>
<a href="/vim/vim70crt.zip">vim70crt.zip</a>
<a href="/vim/vim70cw32.zip">vim70cw32.zip</a></p>

<p>附上偶的 .vimrc 文件:
<a href="/vim/.vimrc">.vimrc</a></p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/vim-70c-beta-win32-binary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编写INF文件进行文件安装[转载]</title>
		<link>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85</link>
		<comments>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85#comments</comments>
		<pubDate>Wed, 01 Mar 2006 18:17:11 +0000</pubDate>
		<dc:creator>急云</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=128</guid>
		<description><![CDATA[◆ 丁健 张万 江南 安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件，一般以INF作为扩展名，因此也叫INF文件。安装信息INF文件与 Windows内建的安装服务引擎(API函数库)紧密协同工作，基于其严格的编写语法制作而成的INF文件在拷贝、删除文件，增、删注册表键，更改系统设置等方面都有优秀的表现，完全可以用来实现应用程序文件安装的目标，而且价格免费，透明度高，安装程序小，可完全定制。INF文件是文本文件，可在任何文本编辑器内查看、创建、修改，普通用户使用Windows系统本身提供的记事本、写字板即可进行文件安装脚本的编写。 INF文件安装动作的触发机制 在文件目录中用鼠标右击INF文件，会显示不同于其他扩展名文件的“安装”菜单。Windows平台在计算机中完成初始安装后，就注册了INF文件的“安装”动作，此“安装”动作关联命令行程序基本形式为: RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name 如笔者目前正在使用的Windows 98系统注册表中，HKEYCLASSESROOT\inffile\install\ command键的默认值为（install即为安装）： C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1 其中，rundll程序以命令行的形式调用Windows的动态链接库，其命令格式为： rundll.exe &#60;DLL文件名>,&#60;入口点>,&#60;调用参数> setupx.dll 是安装API(Setup API)函数库，包含了InstallHinfSection、SetupGetInfSections、 SetupInstallFromInfSection、SetupPromptForDisk、SetupDiCreateDevRegKey等INF 文件内部语法检查、节名搜索、注册键创建等功能函数。setupx.dll与其后的入口点用逗号(,)分开，入口点是大小写敏感的。 Section是INF文件内初始执行节名，首先执行该节内容，默认情况下名称为“DefaultInstall”，系统用户一般不宜对此做任何改动，如被改动，则在后续INF文件的Install节使用相应修改后的名称。 reboot-mode是重启动参数，指示在INF文件执行后对系统的设置进行了改变，操作系统是否重新启动。该参数一般设为132或4，即由安装程序决定是否必须重启动，因为某些设置的改变必须在重启动后才能生效。 inf-name是INF文件的名称，“%1”即为所选中文件本身。 INF文件内部节(Section)的定义 INF 文件用特殊的文本文件格式编辑、保存，Windows内建的安装函数遵循既定的语法从INF文件内获取安装信息。INF文件和初始化(或称私有化， Private File)文件相似，采用节(Section)和入口(Entries)的索引机制，节和入口定义了所有操作类型及操作对象。一个INF文件由不同类型的节组成，每类节都有其特殊的目的和不同的实现语法，每节的内容均服务于该节的目的。除了基本的识别INF格式的“Version”节外，INF文件中节的数目和类型没有限制，主要取决于具体安装任务。一个基本的INF文件，一般包含如下几节： 表中黑体节名是保留关键字，名称固定，大小写不敏感，斜体节名名称任意，由INF文件编写者确定。每节的标题字符均用括号([])括起。 限于篇幅本文只对黑体节名做进一步的解释。 [Version]节 任何INF文件的第一个小节均是[Version]，又称为INF文件头。一般有如下语句： [Version] Signature=“$Chicago$” LayoutFile=filename.inf 其中，Signature的值应为“$Chicago$”、“$Windows 95$”或“$Windows NT$”中的一个(不区分大小写)，否则Windows不接受该文件为INF文件，内建的动作也就不会起作用。 filename.inf文件包含安装组件必需的安装布局信息(源盘和源文件)，该行是可选的，如果没有提供布局信息文件，则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节。 [Install]节 [Install]节提供了一个INF文件安装过程的总览，它识别文件内其他包含安装信息节的详细动作，是Windows内建安装函数识别安装过程和内容的真正入口，用户所有的安装目的在这里表现。那些与[Install]节内容不存在关联的节的动作将被忽略。 [Install] 节分[DefaultInstall]和[OtherInstall]两类，它们使用相同的格式。[DefaultInstall]节节名 “DefaultInstall”如前面表格内容所述被显式地在注册表中指定，大小写不敏感。该节也是系统获取INF文件中安装信息的首要入口，当用户右击INF文件选“安装”时该节内容被执行。[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用，常被用来定义反安装动作。它们均可包括以下种类的可选入口: CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section] [...]]]></description>
			<content:encoded><![CDATA[<p>◆ 丁健 张万 江南</p>

<p>安装信息(Setup Information)文件是Windows系统支持的一种安装信息存放文件，一般以INF作为扩展名，因此也叫INF文件。安装信息INF文件与 Windows内建的安装服务引擎(API函数库)紧密协同工作，基于其严格的编写语法制作而成的INF文件在拷贝、删除文件，增、删注册表键，更改系统设置等方面都有优秀的表现，完全可以用来实现应用程序文件安装的目标，而且价格免费，透明度高，安装程序小，可完全定制。INF文件是文本文件，可在任何文本编辑器内查看、创建、修改，普通用户使用Windows系统本身提供的记事本、写字板即可进行文件安装脚本的编写。
<span id="more-128"></span>
INF文件安装动作的触发机制</p>

<p>在文件目录中用鼠标右击INF文件，会显示不同于其他扩展名文件的“安装”菜单。Windows平台在计算机中完成初始安装后，就注册了INF文件的“安装”动作，此“安装”动作关联命令行程序基本形式为:</p>

<p>RunDll setupx.dll,InstallHinfSection section reboot-mode inf-name</p>

<p>如笔者目前正在使用的Windows 98系统注册表中，HKEY<em>CLASSES</em>ROOT\inffile\install\</p>

<p>command键的默认值为（install即为安装）：</p>

<p>C:\WINDOWS\rundll.exe setupx.dll,InstallHinfSection DefaultInstall 132 %1</p>

<p>其中，rundll程序以命令行的形式调用Windows的动态链接库，其命令格式为：</p>

<p>rundll.exe &lt;DLL文件名>,&lt;入口点>,&lt;调用参数></p>

<p>setupx.dll 是安装API(Setup API)函数库，包含了InstallHinfSection、SetupGetInfSections、 SetupInstallFromInfSection、SetupPromptForDisk、SetupDiCreateDevRegKey等INF 文件内部语法检查、节名搜索、注册键创建等功能函数。setupx.dll与其后的入口点用逗号(,)分开，入口点是大小写敏感的。</p>

<p>Section是INF文件内初始执行节名，首先执行该节内容，默认情况下名称为“DefaultInstall”，系统用户一般不宜对此做任何改动，如被改动，则在后续INF文件的Install节使用相应修改后的名称。</p>

<p>reboot-mode是重启动参数，指示在INF文件执行后对系统的设置进行了改变，操作系统是否重新启动。该参数一般设为132或4，即由安装程序决定是否必须重启动，因为某些设置的改变必须在重启动后才能生效。</p>

<p>inf-name是INF文件的名称，“%1”即为所选中文件本身。</p>

<p>INF文件内部节(Section)的定义</p>

<p>INF 文件用特殊的文本文件格式编辑、保存，Windows内建的安装函数遵循既定的语法从INF文件内获取安装信息。INF文件和初始化(或称私有化， Private File)文件相似，采用节(Section)和入口(Entries)的索引机制，节和入口定义了所有操作类型及操作对象。一个INF文件由不同类型的节组成，每类节都有其特殊的目的和不同的实现语法，每节的内容均服务于该节的目的。除了基本的识别INF格式的“Version”节外，INF文件中节的数目和类型没有限制，主要取决于具体安装任务。一个基本的INF文件，一般包含如下几节：</p>

<p><img src="http://www.xunchi.com/attachments/month_0511/y200511519430.jpg" alt="null" /></p>

<p>表中黑体节名是保留关键字，名称固定，大小写不敏感，斜体节名名称任意，由INF文件编写者确定。每节的标题字符均用括号([])括起。 限于篇幅本文只对黑体节名做进一步的解释。</p>

<p>[Version]节</p>

<p>任何INF文件的第一个小节均是[Version]，又称为INF文件头。一般有如下语句：</p>

<p>[Version]</p>

<p>Signature=“$Chicago$”</p>

<p>LayoutFile=filename.inf</p>

<p>其中，Signature的值应为“$Chicago$”、“$Windows 95$”或“$Windows NT$”中的一个(不区分大小写)，否则Windows不接受该文件为INF文件，内建的动作也就不会起作用。</p>

<p>filename.inf文件包含安装组件必需的安装布局信息(源盘和源文件)，该行是可选的，如果没有提供布局信息文件，则在INF文件内必须包含[SourceDisksNames]和[SourceDisksFiles]节。</p>

<p>[Install]节</p>

<p>[Install]节提供了一个INF文件安装过程的总览，它识别文件内其他包含安装信息节的详细动作，是Windows内建安装函数识别安装过程和内容的真正入口，用户所有的安装目的在这里表现。那些与[Install]节内容不存在关联的节的动作将被忽略。</p>

<p>[Install] 节分[DefaultInstall]和[OtherInstall]两类，它们使用相同的格式。[DefaultInstall]节节名 “DefaultInstall”如前面表格内容所述被显式地在注册表中指定，大小写不敏感。该节也是系统获取INF文件中安装信息的首要入口，当用户右击INF文件选“安装”时该节内容被执行。[OtherInstall]与[DefaultInstall]节遵循相同的语法,但必须被显式地调用，常被用来定义反安装动作。它们均可包括以下种类的可选入口:</p>

<p>CopyFiles=[CopyFiles-section-name]file-list-section[,file-list-section]</p>

<p>RenFiles=file-list-section[,file-list-section]</p>

<p>DelFiles=file-list-section[,file-list-section]</p>

<p>UpdateInis=update-ini-section[,update-ini-section]</p>

<p>UpdateIniFields=update-inifields-section[,update-inifields-section]</p>

<p>AddReg=add-registry-section[,add-registry-section]</p>

<p>DelReg=del-registry-section[,del-registry-section]</p>

<p>Ini2Reg=ini-to-registry-section[,ini-to-registry-section]</p>

<p>UpdateCfgSys=update-config-section</p>

<p>UpdateAutoBat=update-autoexec-section</p>

<p>上面的入口并非都必需，如果需要一个入口，则应该在等号右侧指出存在于该INF文件内的索引节名(不用指出节名的一个特例是CopyFiles入口,可使用 “@”字符后跟文件名的形式，效果是直接将文件拷贝到DestinationDirs节所罗列的硬盘目录)。节名需由可打印字符组成，在中文系统平台中，可使用中文字符作为节名，这也是体现INF格式安装本地化的地方，非常直观。每类入口在一个[Install]节内只能出现一次，第二次及以后出现的同名重复入口将被忽略。每类入口的等号右侧可罗列多个节名，节名之间以逗号分开，以便列举同一类动作的不同作用对象，如删除多个注册表键、拷贝文件到多个目录路径等。</p>

<p>下表是各类入口的动作含义，具体语法本文不做细述:
<img src="http://www.xunchi.com/attachments/month_0511/y200511519444.jpg" alt="null" /></p>

<p>在实际编写INF文件时，注册表根键通常采用缩写方式，如下表：</p>

<p><img src="http://www.xunchi.com/attachments/month_0511/e200511519452.jpg" alt="" /></p>

<p>[DestinationDirs]节</p>

<p>[DestinationDirs]节指定拷贝、重命名或删除文件三类动作的目的目录路径，拷贝、重命名或删除操作对象即文件的列表在专门的节中列出，这些节名最初在“Install”的CopyFiles、RenFiles或DelFiles入口中明确。</p>

<p>[DestinationDirs]节内语句的语法为：</p>

<p>file-list-section=LDID，[Subdir]</p>

<p>[DefaultDestDir=LDID，[Subdir]]</p>

<p>其中file-list-section为必选项，是CopyFiles、RenFiles或DelFiles入口内列出的节名。</p>

<p>LDID(Logical disk identifier)为必选项，是逻辑盘标识码，代表各种系统或实时安装路径，逻辑盘标识码可看做一种宏字符串，随系统或实时安装路径的不同而相应改变。逻辑盘标识码机制确保了安装的灵活性和正确性，该标识码可为下表所述值之一：</p>

<p>Subdir为可选项，指定LDID目录下的子目录名。</p>

<p>DefaultDestDir为可选项，指定CopyFiles、RenFiles或DelFiles入口的缺省操作目录。</p>

<p>[SourceDisksNames]节</p>

<p>[SourceDisksNames]节罗列源文件所在盘符序列码、盘描述符、盘卷标号和盘序列号。</p>

<p>[SourceDisksNames]节内语句的语法为：</p>

<p>disk-ordinal=“disk-description”,disk-label,disk-serial-number</p>

<p>其中disk-ordinal为必选项，是盘符序列码，标识一个源盘，具有惟一性，一般可设置为从1开始递增的整数，0不是一个有效的盘符序列码。当存在多个源盘时，盘符序列码之间不能重复。</p>

<p>disk-description为必选项，是盘描述符，用双引号括起的字符串或字符串宏描述盘的内容或目的。安装引擎将该字符串显示在对话框内以提示用户。</p>

<p>disk-label为源盘的卷标识。</p>

<p>disk-serial-number未使用，但必须被设置为0。</p>

<p>[SourceDisksFiles]节</p>

<p>[SourceDisksFiles]节指定安装时使用的源文件和盘符序列码、盘描述符。 [SourceDisksFiles]节内语句的语法为：</p>

<p>file-name=disk-number[,subdir] [,file-size]</p>

<p>其中file-name为必选项，是源盘上文件的名称。</p>

<p>disk-number是包含file-name指定文件所在源盘的盘符序列码，该盘符序列码需在[SourceDisksNames]节中列出,并大于或等于1。</p>

<p>Subdir为可选项，指定文件所在源盘的子目录，如省略则源盘为缺省安装路径。</p>

<p>file-size为可选项，表明文件的大小，以字节为单位。</p>

<p>[Strings]节</p>

<p>[Strings] 节定义一个或多个本地化字符串，或称字符串宏。尽管[Strings]节一般被放置在INF文件的末尾，字符串宏可在INF文件任何地方使用，安装引擎解释、展开字符串宏为给定的长字符串并做进一步处理。字符串宏在使用时需用百分号(%)括起。[Strings]节内语句的语法为：</p>

<p>strings-key=value</p>

<p>其中strings-key为由字母或数字等可打印字符组成的宏名。</p>

<p>Value为被双引号括起的长字符串，字符串可由字母、数字或其他可打印字符组成。</p>

<p>一个具体的安装实例</p>

<p>本文接下来列举一个名为“Mysetup.inf”的安装信息文件实例，以便读者熟悉INF文件语法，领略INF文件的安装效果。该 “Mysetup.inf”文件可完成如下的安装任务：假设应用程序有“MyApp.exe”、“MyApp.hlp”、“MyApp.dll”等几个需安装到应用程序主目录的文件，有“Ass<em>1.dll”、“Ass</em>2.dll”等几个需安装到Windows\System子目录的文件，要求将各文件按预定目录位置拷贝到位，其中应用程序主目录可在安装过程中选定，同时，在“开始>程序”下面建立名为“我的程序组”的程序组，在该程序组下建立名为“我的应用程序”、“我的应用程序帮助”的两个程序项，分别与“MyApp.exe”和“MyApp.hlp”文件关联。</p>

<p>完成上述安装任务的“Mysetup.inf”文件内容如下：</p>

<p><code>[Version]
signature=“$chicago$”</p>

<p>[AdvSetup]
HKLM,SOFTWARE\ Microsoft\Windows\CurrentVersion\Runonce\Setup，“INF制作安装程序”,, “RunDll32.exe“%01%”\advpack.dll,LaunchINFSection Mysetup.inf,DefaultInstall2”</p>

<p>[DefaultInstallX]</p>

<p>[DefaultInstall]</p>

<p>AddReg=AdvSetup</p>

<p>[DefaultInstall2]</p>

<p>CopyFiles = 拷贝到用户指定目录，拷贝到Windows\System子目录 ，……
CustomDestination=My-path
UpdateInis = 加exe文件快捷方式,加hlp文件快捷方式，……</p>

<p>[SourceDisksNames]
1=“文件所在目录”,,0</p>

<p>[SourceDisksFiles]
MyApp.exe.exe=1,,1021
MyApp.dll=1,,1021
MyApp.hlp=1,,1021
Ass<em>1.dll=1,,1021
Ass</em>2.dll=1,,1021</p>

<p>[DestinationDirs]
拷贝到用户指定目录 = 49000
拷贝到Windows\System子目录 = 11</p>

<p>[My-path]
49000,49001,49002,49003=index-again,1</p>

<p>[index-again]
“”，“”，“”,，““默认安装到“C:\MyApp”目录，可选择””，“%30%\MyApp”</p>

<p>[拷贝到用户指定目录]
MyApp.exe
MyApp.dll
MyApp.hlp</p>

<p>[拷贝到Windows\System子目录]
Ass<em>1.dll
Ass</em>2.dll</p>

<p>[加exe文件快捷方式]
setup.ini, progman.groups,, “group1=““我的程序组”””
setup.ini, group1,,“““我的应用程序””,““““““%49000%\MyApp.exe””””””,,,,,““MyApp.exe”””</p>

<p>[加hlp文件快捷方式]
setup.ini, progman.groups,, “group1=““我的程序组”””
setup.ini, group1,,“““我的应用程序帮助””,““““““%49000%\MyApp.hlp””””””,,,,,““MyApp.hlp”””
</code></p>

<p>读者会注意到上面的文件内许多键名使用了中文，这是因为INF格式文件支持中文提示及中文键名。这些中文键名不仅充当功能键起索引的作用，还形象化地标识了键的前后对应关系，增强了文件内容的可读性，有利于后续更改、维护。</p>

<p>安装时，首先确保应用程序的所有待安装文件和“Mysetup.inf” 文件处在同一个目录下，右击“Mysetup.inf”文件选“安装”或按Shift键的同时按功能键F10。待目录选择对话框出现，点击“浏览”按钮或直接在文本编辑框内键入目录名称后，屏幕显示文件安装拷贝和更新快捷方式进度，最终结束。</p>

<p>打开资源管理器，就可查看到所有文件均已拷贝到指定目录位置。点击“开始>程序”，可以找到“我的程序组”程序组及下属的“我的应用程序”、“我的应用程序帮助”程序项，选中程序项均能激活对应文件，说明文件安装及快捷方式关联均告成功。</p>

<p>小 结</p>

<p>本文介绍的文件安装方法适合于大众，读者可熟悉语法、参考例子、效仿编写，制作出自己的安装信息文件。</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/%e7%bc%96%e5%86%99inf%e6%96%87%e4%bb%b6%e8%bf%9b%e8%a1%8c%e6%96%87%e4%bb%b6%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AutoUpdateSoftOnSkycn.cmd</title>
		<link>http://rainux.org/autoupdatesoftonskycn-cmd/</link>
		<comments>http://rainux.org/autoupdatesoftonskycn-cmd/#comments</comments>
		<pubDate>Mon, 26 Dec 2005 17:26:40 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Programming 编程]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Programming_编程]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=115</guid>
		<description><![CDATA[在软件使用上，我一直都是个喜欢追新的人。 不过这么多年来一成不变的浏览器＋软件下载站＋手工浏览下载的模式已经让我厌倦了。懒人总是有懒人的办法，因此也就有了这个使用 Windows 命令行脚本编写的 AutoUpdateSoftOnSkycn.cmd。 AUSOS 的工作原理很简单，用 wget 取得软件下载站上的某个软件的介绍页面，然后使用 grep/sed 来分析页面的文本取得此软件的下载地址，再次使用 wget 取得这个软件。使这个工作流程能真正应用的重点在于，大多数软件站的某个具体软件的介绍页面地址都具有持久性，这是为了提高使用具体关键字时自己在搜索引擎中的排名，同时也方便用户访问和自己管理。 基于这个工作原理，AUSOS 稍加修改就可以适用于大多数软件下载站，实际上这也是我下一步的目标。不过这样一来配置文件 AUSOS.conf 和项目列表文件 ItemIDList.ini 就会复杂一些了，到时候也许会做一个 GUI，如果真的需要的话。 另外编码过程中发现 Win2k 以后 Windows 命令行脚本虽然增强了很多，但还是有些不便，也许以后会移植到 bash 脚本上，这样虽然看上去没那么 NB 了，不过可以做到跨平台。Windows 下用 Cygwin 里的 bash 来执行；Linux 自是不必说，bash 已经流行很多年了。 写完发给一个 coder 朋友看，他说“Windows shell script 都可以写那么长，你丫真素 YD。”，呵呵。 如果你有兴趣的话可以在线看看 AUSOS 在 Vim 中高亮后的代码。并且，使用说明也可以在这里比较方便的看到。 下载地址: AutoUpdateSoftOnSkycn.cmd v0.2 超微型的 Cygwin 环境，如果你和大多数人一样没有安装 Cygwin，那么请下载并解压到 [...]]]></description>
			<content:encoded><![CDATA[<p>在软件使用上，我一直都是个喜欢追新的人。</p>

<p>不过这么多年来一成不变的浏览器＋软件下载站＋手工浏览下载的模式已经让我厌倦了。懒人总是有懒人的办法，因此也就有了这个使用 Windows 命令行脚本编写的 AutoUpdateSoftOnSkycn.cmd。</p>

<p>AUSOS 的工作原理很简单，用 wget 取得软件下载站上的某个软件的介绍页面，然后使用 grep/sed 来分析页面的文本取得此软件的下载地址，再次使用 wget 取得这个软件。使这个工作流程能真正应用的重点在于，大多数软件站的某个具体软件的介绍页面地址都具有持久性，这是为了提高使用具体关键字时自己在搜索引擎中的排名，同时也方便用户访问和自己管理。</p>

<p>基于这个工作原理，AUSOS 稍加修改就可以适用于大多数软件下载站，实际上这也是我下一步的目标。不过这样一来配置文件 AUSOS.conf 和项目列表文件 ItemIDList.ini 就会复杂一些了，到时候也许会做一个 GUI，如果真的需要的话。</p>

<p>另外编码过程中发现 Win2k 以后 Windows 命令行脚本虽然增强了很多，但还是有些不便，也许以后会移植到 bash 脚本上，这样虽然看上去没那么 NB 了，不过可以做到跨平台。Windows 下用 Cygwin 里的 bash 来执行；Linux 自是不必说，bash 已经流行很多年了。</p>

<p>写完发给一个 coder 朋友看，他说“Windows shell script 都可以写那么长，你丫真素 YD。”，呵呵。<img src="/face/023.gif" alt="023" /></p>

<p>如果你有兴趣的话可以在线看看 <a href="/produce/AutoUpdateSoftOnSkycn.cmd.html">AUSOS 在 Vim 中高亮后的代码</a>。并且，使用说明也可以在这里比较方便的看到。</p>

<p>下载地址:<br />
<a href="/produce/AUSOS.7z">AutoUpdateSoftOnSkycn.cmd v0.2</a><br />
<a href="/produce/TinyCygwin.7z">超微型的 Cygwin 环境</a>，如果你和大多数人一样没有安装 Cygwin，那么请下载并解压到 AUSOS 所在目录或者 PATH 环境变量中列出的任何一个目录里。</p>

	标签：<a href="http://rainux.org/tag/programming_%e7%bc%96%e7%a8%8b/" title="Programming_编程" rel="tag">Programming_编程</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/autoupdatesoftonskycn-cmd/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>正确设置 Vim 的字符编码选项 (gVim/Vim on Win32 中文环境)</title>
		<link>http://rainux.org/vim-gvimvim-on-win32</link>
		<comments>http://rainux.org/vim-gvimvim-on-win32#comments</comments>
		<pubDate>Wed, 19 Oct 2005 17:16:07 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[GNU/Linux]]></category>
		<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>
		<category><![CDATA[Vim]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=106</guid>
		<description><![CDATA[和所有的流行文本编辑器一样，Vim 可以很好的编辑各种字符编码的文件，这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是，和很多来自 Linux 世界的软件一样，这需要你自己动手设置。 Vim 有四个跟字符编码方式有关的选项，encoding、fileencoding、fileencodings、termencoding（这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names），它们的意义如下: encoding: Vim 内部使用的字符编码方式，包括 Vim 的 buffer（缓冲区）、菜单文本、消息文本等。用户手册上建议只在 .vimrc 中改变它的值，事实上似乎也只有在 .vimrc 中改变它的值才有意义。 fileencoding: Vim 中当前编辑的文件的字符编码方式，Vim 保存文件时也会将文件保存为这种字符编码方式（不管是否新文件都如此）。 fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式，并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面，将拉丁语系编码方式 latin1 放到最后面。 termencoding: Vim 所工作的终端（或者 Windows 的 Console 窗口）的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效，而对 Console 模式的 Vim 而言就是 Windows [...]]]></description>
			<content:encoded><![CDATA[<p>和所有的流行文本编辑器一样，Vim 可以很好的编辑各种字符编码的文件，这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。然而不幸的是，和很多来自 Linux 世界的软件一样，这需要你自己动手设置。</p>

<p>Vim 有四个跟字符编码方式有关的选项，encoding、fileencoding、fileencodings、termencoding（这些选项可能的取值请参考 Vim 在线帮助 :help encoding-names），它们的意义如下:</p>

<ul>
<li>encoding: Vim 内部使用的字符编码方式，包括 Vim 的 buffer（缓冲区）、菜单文本、消息文本等。<del>用户手册上建议只在 .vimrc 中改变它的值，事实上似乎也只有在 .vimrc 中改变它的值才有意义。</del></li>
<li>fileencoding: Vim 中当前编辑的文件的字符编码方式，Vim 保存文件时也会将文件保存为这种字符编码方式（不管是否新文件都如此）。</li>
<li>fileencodings: Vim 启动时会按照它所列出的字符编码方式逐一探测即将打开的文件的字符编码方式，并且将 fileencoding 设置为最终探测到的字符编码方式。因此最好将 Unicode 编码方式放到这个列表的最前面，将拉丁语系编码方式 latin1 放到最后面。</li>
<li>termencoding: Vim 所工作的终端（或者 Windows 的 Console 窗口）的字符编码方式。这个选项在 Windows 下对我们常用的 GUI 模式的 gVim 无效，而对 Console 模式的 Vim 而言就是 Windows 控制台的代码页，并且通常我们不需要改变它。</li>
</ul>

<p>好了，解释完了这一堆容易让新手犯糊涂的参数，我们来看看 Vim 的多字符编码方式支持是如何工作的。</p>

<ol>
<li>Vim 启动，根据 .vimrc 中设置的 encoding 的值来设置 buffer、菜单文本、消息文的字符编码方式。</li>
<li>读取需要编辑的文件，根据 fileencodings 中列出的字符编码方式逐一探测该文件编码方式。并设置 fileencoding 为探测到的，看起来是正确的（<a href="#note1">注1</a>）字符编码方式。</li>
<li>对比 fileencoding 和 encoding 的值，若不同则调用 iconv 将文件内容转换为 encoding 所描述的字符编码方式，并且把转换后的内容放到为此文件开辟的 buffer 里，此时我们就可以开始编辑这个文件了。注意，完成这一步动作需要调用外部的 iconv.dll（<a href="#note2">注2</a>），你需要保证这个文件存在于 $VIMRUNTIME 或者其他列在 PATH 环境变量中的目录里。</li>
<li>编辑完成后保存文件时，再次对比 fileencoding 和 encoding 的值。若不同，再次调用 iconv 将即将保存的 buffer 中的文本转换为 fileencoding 所描述的字符编码方式，并保存到指定的文件中。同样，这需要调用 iconv.dll</li>
</ol>

<p>由于 Unicode 能够包含几乎所有的语言的字符，而且 Unicode 的 UTF-8 编码方式又是非常具有性价比的编码方式（空间消耗比 UCS-2 小），因此建议 encoding 的值设置为 utf-8。这么做的另一个理由是 encoding 设置为 utf-8 时，Vim 自动探测文件的编码方式会更准确（或许这个理由才是主要的 ;）。我们在中文 Windows 里编辑的文件，为了兼顾与其他软件的兼容性，文件编码还是设置为 GB2312/GBK 比较合适，因此 fileencoding 建议设置为 chinese（chinese 是个别名，在 Unix 里表示 gb2312，在 Windows 里表示 cp936，也就是 GBK 的代码页）。</p>

<p>以下是我的 .vimrc 中关于字符编码方式设置的内容，这个设置比较有弹性，可以根据系统中的环境变量 $LANG（当然，Windows 中的写法是 %LANG%）的值来自动设置合适的字符编码方式。此时，推荐设置 %LANG% = zh_CN.UTF-8，可以通过后面的 Windows 注册表脚本文件来方便的做到。</p>

<pre name="code" class="vim">" Multi-encoding setting, MUST BE IN THE BEGINNING OF .vimrc!

if has("multi_byte")
  " When 'fileencodings' starts with 'ucs-bom', don't do this manually
  " set bomb
  set fileencodings=ucs-bom,chinese,taiwan,japan,korea,utf-8,latin1
  " CJK environment detection and corresponding setting
  if v:lang =~ "^zh_CN"
    " Simplified Chinese, on Unix euc-cn, on MS-Windows cp936
    set encoding=chinese
    set termencoding=chinese
    if &amp;fileencoding == ''
      set fileencoding=chinese
    endif
  elseif v:lang =~ "^zh_TW"
    " Traditional Chinese, on Unix euc-tw, on MS-Windows cp950
    set encoding=taiwan
    set termencoding=taiwan
    if &amp;fileencoding == ''
      set fileencoding=taiwan
    endif
  elseif v:lang =~ "^ja_JP"
    " Japanese, on Unix euc-jp, on MS-Windows cp932
    set encoding=japan
    set termencoding=japan
    if &amp;fileencoding == ''
      set fileencoding=japan
    endif
  elseif v:lang =~ "^ko"
    " Korean on Unix euc-kr, on MS-Windows cp949
    set encoding=korea
    set termencoding=korea
    if &amp;fileencoding == ''
      set fileencoding=korea
    endif
  endif
   " Detect UTF-8 locale, and override CJK setting if needed
  if v:lang =~ "utf8$" || v:lang =~ "UTF-8$"
    set encoding=utf-8
  endif
else
  echoerr 'Sorry, this version of (g)Vim was not compiled with "multi_byte"'
endif
</pre>

<p>Windows 注册表脚本。</p>

<pre><code>Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\\Environment]
"LANG"="zh_CN.UTF-8"
</code></pre>

<p><a name="note1">注1</a>: 事实上，Vim 的探测准确度并不高，尤其是在 encoding 没有设置为 utf-8 时。因此强烈建议将 encoding 设置为 utf-8<del datetime="2007-04-08T14:49:42+00:00">，虽然<ins datetime="2005-9-21T13:23:5--8:00">如果你想 Vim 显示中文菜单和提示消息的话</ins>这样会带来另一个小问题。参见另一篇 Win32 下 Vim 设置 enconding 为 utf-8 会在显示特定消息时崩溃</del>。（此处提到的崩溃问题在 gVim 7.0 beta 时代就已经被解决了。）</p>

<p><a name="note2">注2</a>: 在 GNU 的 FTP 上可以下载到 <a href="http://mirrors.kernel.org/gnu/libiconv/libiconv-1.9.1.bin.woe32.zip">iconv 的 Win32 版</a>，不推荐去 <a href="http://gnuwin32.sourceforge.net">GnuWin32</a> 下载 libiconv，因为那个版本旧一些，并且需要自己改名 dll 文件。</p>

	标签：<a href="http://rainux.org/tag/gnu-linux/" title="GNU/Linux" rel="tag">GNU/Linux</a>, <a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/vim/" title="Vim" rel="tag">Vim</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/vim-gvimvim-on-win32/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>智能 ABC 在 Windows XP Embedded 下面选字窗口乱码的问题</title>
		<link>http://rainux.org/abcwindows-xp-embedded</link>
		<comments>http://rainux.org/abcwindows-xp-embedded#comments</comments>
		<pubDate>Tue, 22 Feb 2005 14:47:09 +0000</pubDate>
		<dc:creator>急云</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=98</guid>
		<description><![CDATA[这个问题说起来也简单，只要安装 NT 版本的智能 ABC 就可以了。 下面的这个安装包，提供的 NT 版本的安装程序，安装完成以后就可以直接在输入法设置里面添加智能 ABC 了。 智能 ABC for WinXPe 标签：Software_软件, Windows]]></description>
			<content:encoded><![CDATA[<p>这个问题说起来也简单，只要安装 NT 版本的智能 ABC 就可以了。</p>

<p>下面的这个安装包，提供的 NT 版本的安装程序，安装完成以后就可以直接在输入法设置里面添加智能 ABC 了。
<a href="http://rainux.sefans.com/blog/wp-content/uploads/znabc.rar" title="智能 ABC for WinXPe">智能 ABC for WinXPe</a> </p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/abcwindows-xp-embedded/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>[载录]Windows XP Embedded 上手指南</title>
		<link>http://rainux.org/windows-xp-embedded</link>
		<comments>http://rainux.org/windows-xp-embedded#comments</comments>
		<pubDate>Thu, 23 Dec 2004 18:53:29 +0000</pubDate>
		<dc:creator>急云</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=29</guid>
		<description><![CDATA[Windows XP Embedded 上手指南 

作者：MICROSOFT 

概述 
对于一种开发工具的学习，最重要也最困难的阶段就是概念的建立，只要建立了正确的概念，明白整个系统的体系结构和各种工具作用，剩下的工作就是实际操作，积累经验了，最多不过在需要的时候查一查手册。 
本文通过指导读者进行实际操作，一步步地完成一次完整的开发工作，从而帮助读者建立一个清晰明确的概念。 

因为我们开发的产品不是普通的软件，而是专用的操作系统，所以需要针对某个特定的硬件平台（目标机）来进行开发；首先需要一个强大的工作站来运行开发环境和开发工具，然后根据目标机硬件配置和软件需求进行开发，开发完成后将做好的操作系统影象文件（Image）与目标机硬件结合，运行系统并测试。 ]]></description>
			<content:encoded><![CDATA[<p><strong>Windows XP Embedded 上手指南</strong></p>

<p>作者：MICROSOFT </p>

<p><strong>概述</strong></p>

<p>对于一种开发工具的学习，最重要也最困难的阶段就是概念的建立，只要建立了正确的概念，明白整个系统的体系结构和各种工具作用，剩下的工作就是实际操作，积累经验了，最多不过在需要的时候查一查手册。 
本文通过指导读者进行实际操作，一步步地完成一次完整的开发工作，从而帮助读者建立一个清晰明确的概念。 </p>

<p>因为我们开发的产品不是普通的软件，而是专用的操作系统，所以需要针对某个特定的硬件平台（目标机）来进行开发；首先需要一个强大的工作站来运行开发环境和开发工具，然后根据目标机硬件配置和软件需求进行开发，开发完成后将做好的操作系统影象文件（Image）与目标机硬件结合，运行系统并测试。 
<span id="more-29"></span></p>

<p><strong>配置开发工作站</strong></p>

<p>首先介绍开发用的工作站，一台标准PC机，硬件配置要求如下： 
　 操作系统Windows XP Professional 
　 PIII 500MHz 以上（建议1GHz以上） 
　 256MB 内存 （建议512MB） 
　 3GB 剩余硬盘空间 </p>

<p>对该PC机的配置如下： 
　　将硬盘设置两个分区 
　　第二个分区分配为700MB，可以是FAT32格式或NTFS格式（这个分区将包含可启动的Windows XP Embedded Image） 
　　主分区使用所有剩余的硬盘空间，可以设置为FAT32格式或者NTFS格式 
　　在主分区中安装Windows XP Professional系统，并安装Windows XP Embedded 开发工具 </p>

<p>修改BOOT.ini文件，将下面的代码部分增加到该文件中，可以使这台PC机双重启动，作为开发用的Windows XP Professional系统从分区一启动，而开发好的Windows XP Embedded Image从分区二启动。 
[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)Windows 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)Windows="Microsoft Windows XP Professional" /fastdetect 
multi(0)disk(0)rdisk(0)partition(2)Windows="Microsoft Windows XP Embeddedd" /fastdetect </p>

<p><strong>安装Windows XP Embedded开发工具</strong></p>

<p>将Windows XP Embedded开发包的CD1放入CD-ROM中，在自动运行的提示中， 按照以下顺序安装XPE开发工具： 
　　Tools Setup：安装XPE开发工具（包括Target Designer, Component Designer, Component Database Manager, 以及其他工具） 
　　Database Engine Setup： 安装SQL Server 2000 Desktop Edition database engine (MSDE) 
　　Database Setup： 安装组件数据库及Repositories </p>

<p><strong>开发工作站的其他配置</strong></p>

<p>在C盘新建一个XPE_Demo目录，用来放置开发中生成的配置定义文件和组件定义文件。 
从CD-ROM上安装TweakUI示例文件到C：\Program Files\TweakUI。 
这样我们就完成了开发工作站的准备工作。 </p>

<p><strong>硬件平台分析 </strong>
在开发过程中，首先需要运行硬件分析程序来分析当前机器的硬件配置情况。 
操作系统与硬件紧密相关，只用充分地了解和支持硬件，才能让操作系统正常稳定的运行。由于X86结构计算机的硬件比较复杂，普通开发者很难对它充分地理解熟悉，因此，微软提供了一个硬件分析工具来帮助开发者分析硬件。 
Windows XP Embedded提供的这个工具叫Target Analyzer，可以自动分析所在设备的硬件信息，Target Analyzer有两个版本：TA.exe和TAP.exe。分析完成后会在同一个目录中产生一个XML格式的输出文件Devices.pmq。 
TAP.exe是一个32位的应用程序，运行在Windows XP和Windows 2000上，可以运行一些高级的硬件检测。 
TA.exe是一个16位应用程序，运行在DOS上，可以用来检测一些无法安装Windows 2000及Windows XP的系统，但检测的功能要差一些，有的硬件设备无法识别。 </p>

<p>下面我们运行TAP.exe来检测这台开发机的硬件配置： 
　进入C:\Program Files\Windows Embedded\Utilities目录 
　运行TAP.exe，会在同目录中生成Devices.pmq 
用文本编辑器打开这个Device.pmq文件，文件中用XML语言描述了目标设备的硬件信息，例如：在PCI段中，描述了Intel的21440 Ethernet 控制器。 </p>

<p>因为我们是在开发工作站上运行了这个程序，所以Devices.pmq中包含的是开发工作站的硬件信息。 </p>

<p><strong>保存硬件平台信息</strong></p>

<p>使用Devices.pmq中的信息有两个办法，其一可以根据这个文件生成一个 
XPE组件，为以后开发完整的操作系统作准备；其二可以在开发时将这个文件直接导入；将PMQ文件做成XPE组件的好处是，可以一次工作反复使用：做成XPE组件后保存到组件数据库中，以后每次开发系统都可以调用。 
　　运行组件设计器 Component Designer 
　　将刚才生成的Devices.pmq文件导入，选择File/Impot… ，弹出导入对话框 
　　按下“Start”按钮，开始PMQ文件的导入过程，该过程大约耗时10分钟；完成后，会在Component Designer中显示一个‘Devices.sld’组件，将其改名为‘Demo Platform Component’ 
　　展开Component Designer中目录结构 
Windows XP Embedded Client 
Components 
Devices 
选中Devices，将组件的Name属性由‘Devices’改为‘Demo Platform Component’ </p>

<p>你可以将该组件设为‘Selector Prototype Component’类型，成为该类型的组件后，可以在Target Designer中单独地选取该组件所关联的各个设备： 
　　在Prototype栏中按下Browse…，弹出Select Prototype Component对话框。 
　　在Prototype component source栏中选中Database选项。 
　　在组件树列表中展开到Software/Test&amp;Developnent，选中Selector Prototype Component组件。 
　　按下OK确定。 </p>

<p>选择File/Save as菜单将该配置保存为“C:\XPE<em>Demo\Demo\Platform.SLD” 这个SLD文件中就包含了前面开发的Demo Platform Component组件，关闭Component Designer。 
1. 2. 要在Target Designer中使用这个组件，需要先把这个组件保存到组件数据库中： 
　　打开Component Database Manager，开始菜单所有程序Microsoft Windows Embedded StudioComponent Database Manager 
　　点击‘Import’按钮，在SLD File:栏中按下浏览按钮，找到“C:\XPE</em>Demo\Demo\Platform.SLD”，点击Import。 
　　Import成功后，关闭Component Database Manager。 
　　确认工作成果： 
打开Target Designer，选择 File/New菜单，建立一个新的配置Configuration，确认Demo Platform Component 是否在Target Designer左侧的组件浏览器中，如果发现该组件，则说明刚才的硬件分析工作顺利完成了。 </p>

<p><strong>创建初始化配置</strong></p>

<p>要构造一个完整的XPE系统，首先需要在Target Designer中创建一个配置（Configuration），这个配置仅仅是一个空的开发框架，然后在该配置中添加所有的硬件支持组件，系统内核组件和软件功能组件。添加完成后使用Target Designer自动检测组件的关联关系，并自动把缺少的组件添加到配置中。 
　首先运行Target Designer 
　选择File菜单 
　选择New，创建一个新的Windows XP Embedded 配置 
　将该配置的Name 改为DemoPlatform 
在下面的Choose Platform中，选择Windows XP Embedded Client (x86) </p>

<p>按下OK按钮创建该配置并保存 
在Target Designer中间的组件列表栏中，选中DemoPlatform.slx，在右边的属性栏中修改配置的属性，添入您的个人信息（Name, Owner, Author, Description等） </p>

<p><strong>设置高级参数</strong></p>

<p>下面设置一些整个系统运行需要的参数 
在配置浏览器的顶端，展开DemoPlatform.slx，选中Settings，这时右边的属性设置面板会显示可以设置的选项 </p>

<p>在Target Devices Settings下面，点击Show，显示详细的选项 
设置下列的配置信息： 
　　Boot Drive = C: 
　　Windows Folder = D:Windows 
　　Program Files Folder = D:Program Files 
　　Documents and Settings folder = D:Documents and Settings 
　　Boot ARC path = multi(0)disk(0)rdisk(0)partition(2) 
　　Boot Partition Size (MB) = 700 
设置完成后，将配置信息保存到C:\XPE_Demo 目录。 
创建XPE组件 
通常每一个嵌入式设备都会运行一个或多个用户自己的应用程序，另外如果使用了非通用的硬件设备，还需要添加相应的驱动程序；怎样把这些相对独立于操作系统的部分集成到操作系统中来，使其成为一个整体？推荐的方法是，将各个独立的部分做成XPE组件，在开发阶段进行集成；通常该工作可以分成五个阶段： 
　　确定组件使用的资源以及设置 
　　在Component Designer中配置组件的资源和设置选项 
　　创建一个Repository，将该组件使用的文件加入到该Repository中 
　　保存该组件的配置信息 
　　将该组件导入到Component Database Manager中 </p>

<p>下面我们就以一个实际的例子来说明，为TweakUI Control Panel 
程序创建一个XPE组件。 
　　打开Component Designer。 
　　选择FileImport菜单，将浏览的文件类型设置为Setup Information Files（*.inf） 
　　选择“C：\Program Files\TweakUI\TweakUI.inf”,并将其导入，Component Designer可以根据TweakUI.inf中的信息，自动生成一个组件。 
　　需要为这个组件添加一个Repository，这个Repository实际上是一个系统目录，该目录中包含组件所需要的文件，每一个带有文件的组件都会对应一个或多个Repository，打开Component Designer中的Repositories文件夹。 </p>

<p>点击右键，在弹出菜单中选择“Add Repository”，新建一个Repository。 
在该Repository的Name属性中填入Tweak UI Files 
点击Source Path栏中的Browse按钮，找到C：\Program Files\TweakUI。 </p>

<p>在Component Designer中选中TweakUI.inf组件 </p>

<p>在该组件的属性栏中，按下Repository按钮 
在弹出的Select Repository对话框中，选择Tweak UI Files项目，确定。 </p>

<p>最后，选中tweakui.inf组件，在右边的属性设置面板中将该组件的名字改为Tweak UI Control Panel Applet。 
选择File/Save as，保存为"C:\XPE<em>Demo\TweakUI.SLD"，关闭Component Designer。 
到此已经完成了TweakUI组件的创建；同前面创建的硬件信息组件一样，要在Targert Designer中使用这个组件，必须先将其导入到组件数据库中。 
打开Component Database Manager， 
Import这个TweakUI组件：找到"C:\XPE</em>Demo\TweakUI.sld"并导入 
导入完成后，关闭Component Database Manager </p>

<p>打开Target Designer 
打开刚才创建的配置DemoPlatform 
确认Demo Platform Component 组件和Tweak UI Control Panel Applet组件都在Target Designer的组件浏览器中。 </p>

<p>与其他组件不同，利用Target Analyzer的输出文件Devices.pmq生成的组件是一个宏组件，宏组件本身不具备什么功能，仅仅是带有与其他组件的关联关系；前面我们开发了一个名为“Demo Platform Component”的宏组件，利用该组件可以方便的为初始化配置添加硬件支持。 </p>

<p><strong>构造XPE 系统影像文件</strong></p>

<p>到此我们已经完成的硬件信息的分析并开发了一个硬件信息组件，开发了一个应用程序的组件，另外还建立了初始化的配置。在本节中我们来完成一个完整配置的开发工作。 
打开Target Designer 
第一个需要添加的组件是由Devices.pmq文件产生的宏组件Demo Platform Component，加入了这个组件，就把硬件信息全部添加到配置中；只要在Target Designer左侧的组件浏览器面板中双击该组件就可以添加该组件到配置中。 
在组件浏览器中，找到Demo Platform Component组件，将该组件加入配置中。 
如果没有找到该组件，可以在查找栏中输入它的名字进行检索。 </p>

<p>在Target Desinger中包含了一万一千多个组件，怎样找到自己需要的组件呢？下面我们来讨论一下组件浏览器中的过滤器。 
可以通过过滤的方法找到一个组件或一组相关的组件，Windows XP Embedded开发包内包含的大量组件可以通过过滤器方便地进行查找。 
点击在组件浏览器上面的Filter按钮，创建一个新的过滤器 
在Filter Manager对话框中，按New按钮 
在Name栏填入TweakUI 
在过滤规则描述栏中，双击过滤规则“Component Display Name Contains[Sybstring]”，在出现的Filter Editor对话框中，输入TweakK </p>

<p>按下OK关闭过滤编辑器 
在Filter Manager中，Avalable Filter List栏中应该显示Tweak 
选择Tweak过滤器，并按下Apply Filter按钮 </p>

<p>在组件浏览器中，会仅仅显示Tweak UI Control Panel Applet组件 
将该组件加入到配置中 
将过滤器恢复到All Conponents显示状态，显示所有的组件 </p>

<p>下一步，将向配置中添加Design Template组件，这个设计模板组件也是个宏组件，并且与Demo Platform Component 组件非常类似；所谓宏组件是指一个仅仅包含组件关联信息的组件，而没有其他功能。例如可以将与TCP/IP协议有关的20个组件都与一个名为TCP/IP的宏组件关联，通过添加这个TCP/IP宏组件，可以一次添加那20个组件。 
向配置中添加组件的方法有很多，可以单个组件逐一添加；可以添加宏组件；也可以通过Target Designer的关联性检查功能自动添加组件。 
Windows XP Embedded提供了若干的模板组件，从单一的软件功能如TCP/IP、DerictX8.0到整个系统模板如机顶盒模板、POS机模板都有，可以根据实际应用考虑使用其中一个。 
加入Windows-based Terminal Professional组件，这个组件可以在Design Templates文件夹中找到。在配置面板中，扩展这个组件，并选中Settings，右边的属性面板会显示该宏组件中主要的组件模块。 </p>

<p>下一步工作是要向配置中添加其他必须的核心组件，在这个例子中，你的文件系统是FAT格式，所以需要添加FAT组件 
1. 1. 可以在SoftwareSystemStorage and File SystemsInfrastructureFile Systems路径下找到FAT组件 
2. 2. 再加入Fat Format组件，该组件在SoftwareSystemStorage and File SystemsApplications路径下 
3. 3. 加入Explore Shell组件，该组件在SoftwareSystemUser InterfaceShells路径下 
4. 4. 加入NT Loader组件，该组件在Software|SystemSystem ServicesBase.路径下 </p>

<p>最后，进行关联性检查，确保所有的必要组件都已经添加到配置中。 
在Configuration菜单中，选择Check Dependencies进行组件关联性检查，所有宏组件的关联组件以及缺少的组件都会自动添加到配置中。 </p>

<p>关联性检查结束后，会提示一个错误： 
Component: "Regional and Language Options [Version 5.1.2600, R620]" requires at least one additional enabled component not in the configuration. 
Target Designer不能通过自动添加组件解决这个错误，因为有多个组件可以选择，所以Target Designer会将可以选择的组件列出，由开发者自己决定添加哪一个组件。 
选择Target Designer底部的Tasks栏 </p>

<p>双击上面的条目，Target Designer会显示一个提示，要开发者从多个可选的组件中挑选需要的组件。 
在本例子中，选择English Language Support组件，按下Add按钮，尽管其他语言也列出了，但并不是必须的。 </p>

<p><strong>开始菜单选项 </strong>
在关联性检查阶段，User Interface Core组件会被自动添加到配置中，因为其他开发者选中的组件需要该组件的支持；如果需要在Image的开始菜单中包含需要的菜单，则要设置该组件的选项。 
选择的开始菜单选项： 
　　Show Control Panel on Start Menu 
　　Show My Computer on Start Menu 
不要选择的开始菜单项： 
　　Prohibit Access to Hot Keys 
　　Prohibit Access to Control Panel </p>

<p>最后再进行一次关联性检查。 </p>

<p><strong>构造及测试运行时IMAGE</strong></p>

<p>在Configuration菜单中，选中Build Target Image… 菜单项，出现Build对话框 
在Destination栏中，添入一个保存Image的空目录，例如在C:\Windows Embedded Images目录下，建立一个新的空目录Test Configuration </p>

<p>log文件应保存在另外的目录中，不要与Image在同一目录 
按下Build按钮，Target Designer会完成Image的构建；完成后，在指定目录下会生成如下的文件和目录集合 </p>

<p>如果在运行了关联性检查之后，对配置进行了改变，构建Image时，Target Designer会提示开发者再做一次关联性检查。 
构件完成后，会显示如下的提示框： </p>

<p>在上面的例子中，请注意提示No Errors，但有两个Warnings，第一个Warning出现是因为在配置中没有输入PID号码，不输入PID号码构造出来的Image是个限时评估版的；第二个Warning出现是因为Tweak UI 组件被包含进配置，但该组件不是Released版本组件，当然对Image本身没什么影响。 
构造完成后，关闭该对话框。 </p>

<p>将以上Image文件目录中的目录和文件拷贝到D盘的根目录下，因为文件目录必须和前面配置属性中的设定相匹配，拷贝完成后，得到下面图示的目录： 
保存配置信息，选择File菜单的Save菜单项。 
关闭Target Designer 
重启机器 </p>

<p><strong>测试XPE系统</strong></p>

<p>在重启过程中，会提示两个启动选项，运行Windows XP Professional, 或者运行 Windows XP Embedded. 择Windows XP Embedded。 
启动选项使用C：\Boot.ini控制的，在前面我们已经在Boot.ini中添加了如下段落： 
[boot loader] 
timeout=30 
default=multi(0)disk(0)rdisk(0)partition(1)WINNT 
[operating systems] 
multi(0)disk(0)rdisk(0)partition(1)WINDOWS="Microsoft Windows XP Professional" /fastdetect 
multi(0)disk(0)rdisk(0)partition(2)WINDOWS="Microsoft Windows XP Embedded" /fastdetect </p>

<p>当XPE正常运行后，可以查看在该系统中是否包含了我们需要的功能，以此来检验我们的工作。 
打开Control Panel，查看其中是否包含了Tweak UI Control Applet选项。 </p>

<p>运行Tweak UI控制面板程序，可以看到下面的对话框： </p>

<p>到此，我们完成了整个开发过程。 </p>

<hr />

<p>虽然将Windows XP Embedded运行时程序部署到相关设备可能只是举手之劳，但我们仍在此为您准备了几则有助于避免缺陷的提示信息。为明确起见，我会用“部署镜像”这个说法指代将运行时镜像转移到目标设备并在该设备上引导运行时程序；与此同时，为简便起见，我还会将一块标准集成设备电路（IDE）硬盘作为引导介质。在执行镜像部署任务时，您应牢记以下事项。 </p>

<p>您应围绕一些简单事项展开自查： </p>

<p>确认系统引导分区已被格式化为FAT,FAT32或NTFS。 
确认系统引导分区已被设定为活动状态（使用FDISK进行检测或修改）。 
确认系统引导分区（通常为C:或第一块硬盘的第一个分区）具备有效的Windows XP引导扇区。 
确认系统引导分区具备足够的Windows XP引导文件（它们是NTLDR、NTDETECT.COM和BOOT.INI）。 
确认BOOT.INI文件具有指向系统文件位置的正确ARC路径。 
确认系统文件以正确形式处于适当位置。 
确认配置掌握文件存取位置。 
确认系统包含为引导提供支持所必需的驱动程序。 
前两项自查要求相对简单一些，但却有可能导致某些始料未及的问题。 </p>

<p>您可将一个有效的Windows XP引导扇区设置在使用Windows XP Embedded Beta 2所配备之BOOTPREP.EXE工具的引导盘上。BOOTPREP.EXE工具位于Program FilesWindows Embeddedutilities文件夹--如果这个工具不在上述位置，则请使用“添加/删除程序”对“Windows XP Embedded客户端工具安装”设置进行修改，并选择“引导准备”工具。这个工具还配有一个自述文件，您可从中了解全部使用方法和某些具体使用情境。 </p>

<p>如果您没有在编译过程中指定正确的引导ARC路径，那么，BOOT.INI就无法获得通往系统的适当路径。我并不想在此重复有关ARC路径设置的信息--如需获取关于正确创建ARC路径的更多信息资料，敬请查询Microsft知识库或MSDN?。 </p>

<p>显然，如果ARC路径设置正确，那么，系统文件最好也位于这个路径当中--而需要您确保不会发生的则是长文件名（LFN）被转换为DOS 8.3文件名。由Microsoft及第三方提供的相关工具可帮助您在使用无法支持长文件名的操作系统执行文件复制时防止出现长文件名。最有效的复制方法就是将嵌入式系统安装于开发设备，并将相关文件复制到本机Windows 2000或Windows XP操作系统之中。不仅如此，您还可通过网络系统实现系统文件复制。当然，某些第三方工具将可在使用软盘引导的设备上实现LFN网络复制。 </p>

<p>毋庸置疑，您必须确保系统文件具备可为引导提供支持的适当组件。对此加以保障的最简单方法就是利用TAP.EXE查找您计算机上的HW。当然，如果您必须运行TA.EXE或以手工方式添加所需组件，那么，就有可能遗漏较为关键的组件。虽然不同计算机设备的基本组件列表也不尽相同，但您至少应配备BIOS组件（例如标准PC--详见“Hardware:Computers in Target Designer”）、IDE控制器（设备专用）、主IDE信道和从IDE信道组件以及磁盘驱动组件。最后一项必备组件比较微妙，这主要是因为Windows XP Embedded数据库中存在三个磁盘驱动组件。为此，请对每个组件的“属性”分别进行查看，并关注“高级属性”设置。您所需要的是“cmiPnPDevID”属性被赋值为“GenDisk”的那个组件 </p>

<p>您还应确保将配置中的目标驱动器属性设定为指向正确位置的状态。请选取相关配置（配置编辑器树状结构中的顶节点），并在详细资料窗格中点击“高级”。应对以下四个属性进行设置： </p>

<p>cmiTargetBootDrive 系统将从何处开始引导（C:） 
cmiTargetWinDir Windows文件夹所处位置 
cmiTargetProgramFiles Program Files文件夹所处位置 
cmiTargetDocsAndSettings Documents and Setting文件夹所处位置 </p>

<p>如果以上属性在镜像生成前得到正确设置，那么，您将会在首次引导代理（FBA）序列中遭遇引导问题。 </p>

<p>如果您从某一分区开始引导（比方说C:），却从另一分区（比方说D:）运行系统，那么，即使根目录包含了基本引导文件，基于开发设备的运行时程序镜像仍会拥有一个包含系统文件的DriveD文件夹。为此，请确认上述文件夹内容已被复制到正确的驱动器。 </p>

<p>显然，这种方法未必能解决所有引导问题，但逐一落实上述事项却可帮助您更加迅速地排解系统引导问题。 </p>

<hr />

<p>如果您试图降低运行时程序的内存占用量，则可尝试下列方法： </p>

<p>禁用页面文件支持。如果您拥有足够的RAM为希望用户运行的服务提供支持，那么，便无需使用页面文件。请注意，页面文件在任何情况下均处于缺省禁用状态。 
在配置文件中禁用或删除您不需要的任何HW组件。这些驱动程序组件可能具有以连锁反应方式衍生组件依存关系的能力。因此，在配置中保留并不需要的驱动程序组件可能对内存占用量产生一定影响（某些情况下甚至是重大影响）。 
如果您使用TAP.exe生成HW配置，就请参阅禁用由TAP.exe发现的软件枚举设备页面。如果稍有不慎，这些设备便会对内存占用量产生重大影响。 
在目标计算机上将分区转换为NTFS，并对磁盘卷进行压缩（压缩特性需要由NTFS文件系统提供支持）。在某些情况下，这种方法可将内存占用量至少降低40%。请不要忘记，这往往需要您将NTFS组件添加至运行时程序。 </p>

<hr />

<p>我公司要做一个设备，不想出现WINDOWS的任何东西 
比如启动画面，登陆对话框，高手请指较（启动画面已解决） 
还有就是谁知道关于EXP的书，我看到又英文版，但国内时候似乎没有卖 </p>

<p>用minlogon 组件代替winlogon 就可以了 </p>

<hr />

<p>利用“自动登录”组件在系统每次启动时以相关用户身份自动登录。该组件具有可供配置的设置选项，允许您输入缺省域名、用户名和口令。请记住，如果用户以后又在运行时程序中对这些设置值进行修改，那么，自动登录特性便会失效。 </p>

<p>Kernel Baseline Configuration 
Kernel, No Network, No Explorer Shell 
~5 MBytes of Disk Space 
Minlogin 
Networking Support, Shell 
~15 Mbytes of Disk Space (12MB NTFS Compressed Volume) 
Winlogon 
~56 Mbytes of Disk Space (37 MB NTFS Compressed Volume)</p>

<hr />

<p>Windows XP Embedded是这种领先的桌面操作系统的组件化版本，它能够快速开发出最为可靠的全功能连接设备。它采用与Windows XP Professional相同的二进制代码，从而使得嵌入式开发人员能够只选择那些小覆盖范围嵌入式设备所需的丰富定制化特性。Windows XP Embedded构建在已经得到验证的Windows&amp; 2000代码库基础之上，它提供了业内领先的可靠性、安全性和性能，并且具备最新的多媒体、Web浏览、电源管理及设置支持功能。Windows XP Embedded还集成了最新的嵌入式支持功能，例如无头支持以及灵活的启动与存储选项。此外，它还包含一套全新设计的工具集Windows Embedded Studio,这套工具使得开发人员能够更快速配置、构建并部署智能化设计方案。 </p>

<p>对安全和可伸缩网络的支持 </p>

<p>得到增强的实时处理能力 </p>

<p>更为优秀的性能表现 </p>

<p>更为丰富的多媒体和Web浏览功能 </p>

<p>与个人计算机、服务器、Web服务以及其它设备更为出色的互操作性 </p>

<p>行业领先的可靠性、安全性和性能 </p>

<p>　 Windows XP Embedded建立在Windows2000经过实践检验的代码库基础之上，具有独特的32位计算体系结构，以及完全保护的内存模型。它比较关键的可靠性、安全性和性能特性包括： </p>

<p>Windows文件保护：防止核心系统文件在应用程序的安装时被改写。当文件被改写时，Windows文件保护可以恢复正确的版本。 </p>

<p>设备驱动程序回滚：如果在添加新的设备驱动程序时出现了问题，那么将会保存以前安装的驱动程序的一个副本，这使得用户能够重新使用原先的设备驱动程序。 </p>

<p>抢先型多任务体系结构：允许多个应用程序同时运行。其中包括一些增强功能，确保了良好的系统响应和稳定性。 </p>

<p>支持多用户的加密文件系统（EFS）：使用随机生成的密钥对每个文件进行加密。加密和解密过程对用户是透明的。在Windows XP Embedded中，EFS允许多个授权用户访问一个加密的文档。 </p>

<p>组件化形式的最新Windows技术 </p>

<p>通过将Windows&amp; XP Professional组件化，Windows XP Embedded使得开发人员能够利用Windows平台提供最新的Windows技术，同时能够减少内存占用。嵌入式开发人员能够充分利用Windows XP中的所有特性，例如多媒体功能。这些特性包括： </p>

<p>通用串行总线（USB）:支持大量USB外围设备，例如扫描仪、鼠标、键盘等等。 </p>

<p>Internet Explorer 6:提供最新的Web浏览技术，包括视觉刷新、支持Flash和Shockwave文件的回放以及增强保密性。 </p>

<p>Windows XP Embedded也包括一些支持嵌入式的特性，例如： </p>

<p>灵活的启动和存储选项：除了磁盘以外，还为非易失性（永久性）读/写存储设备（例如Flash ROM和电池支持的RAM）提供了启动能力。当El Torito的可启动CD-ROM驱动程序、增强型写过滤器和ROM结合使用时，可以从CDROM启动。Windows XP Embedded也支持DiskOnChip Flash、PCMCIA-ATA、Compact Flash、MultiMediaCard和MemoryStick。 </p>

<p>增强型写过滤器：增强型写过滤器（EWF）将选定的磁盘I/O重新路由到内存或其它的存储媒体，从而让操作系统认为您的只读存储器是可写的。 </p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/windows-xp-embedded/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>NTFS 下的硬链接(hard link)与符号链接(symbolic link)</title>
		<link>http://rainux.org/ntfs-hard-linksymbolic-link</link>
		<comments>http://rainux.org/ntfs-hard-linksymbolic-link#comments</comments>
		<pubDate>Tue, 21 Dec 2004 18:07:21 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=18</guid>
		<description><![CDATA[在 Linux 使用的 ext2 等文件系统里，都有 hard link 与 symbolic link 的功能，这个功能简单的说就是让我们可以用多个路径去访问同一个文件或者目录。比如说让 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一个文件。但 hard link 和 symbolic link 还是有区别的(废话)。 Hard link 表示，它和原文件名指向的是存储设备上同一个文件内容。就好像这个文件内容有多个文件名一样，每个文件名有相等地位。删除其中任何一个之后，事实上文件内容并不会被删除掉，仍然可以用其他的名称来访问这个文件。只有当最后一个指向这个文件内容的文件名被删除掉之后，文件内容才被删除。也就是说，一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别。需要注意的是，因为每个分区(partition)上都可能有相同的存储位置地址，所以 hard link 必须跟被 link 的文件在同一个分区上。另外，目录不支持 hard link。 Symbolic link 也称 soft link，它类似于 Windows 里的快捷方式 .lnk 文件。它本身是一个单独的文件，而这个文件的内容是它所指向的文件的路径。一般的程序存取 symbolic link 时存取的并不是它本身的内容，而是它所指向的文件的内容。当某个文件被删除掉后，它的 symbolic link 就无法存取到这个文件了，因为文件本身已经被删除了。也就是说，一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西。Symbolic link 可以链接任何本地可以访问到的文件或者目录路径。 以上这些是我对 [...]]]></description>
			<content:encoded><![CDATA[<p>在 Linux 使用的 ext2 等文件系统里，都有 hard link 与 symbolic link 的功能，这个功能简单的说就是让我们可以用多个路径去访问同一个文件或者目录。比如说让 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一个文件。但 hard link 和 symbolic link 还是有区别的(废话)。</p>

<p>Hard link 表示，它和原文件名指向的是存储设备上同一个文件内容。就好像这个文件内容有多个文件名一样，每个文件名有相等地位。删除其中任何一个之后，事实上文件内容并不会被删除掉，仍然可以用其他的名称来访问这个文件。只有当最后一个指向这个文件内容的文件名被删除掉之后，文件内容才被删除。也就是说，一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别。需要注意的是，因为每个分区(partition)上都可能有相同的存储位置地址，所以 hard link 必须跟被 link 的文件在同一个分区上。另外，目录不支持 hard link。
<span id="more-18"></span>
Symbolic link 也称 soft link，它类似于 Windows 里的快捷方式 .lnk 文件。它本身是一个单独的文件，而这个文件的内容是它所指向的文件的路径。一般的程序存取 symbolic link 时存取的并不是它本身的内容，而是它所指向的文件的内容。当某个文件被删除掉后，它的 symbolic link 就无法存取到这个文件了，因为文件本身已经被删除了。也就是说，一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西。Symbolic link 可以链接任何本地可以访问到的文件或者目录路径。</p>

<p>以上这些是我对 hard link 和 symbolic link 的理解，我试图用跟文件系统无关和尽量通俗易懂的语言来解释这两个概念。但如果你是一个软件开发者或者系统管理员或者仅仅是想知道更详细的东西，强烈建议你去看看<a href="http://phorum.study-area.org/viewtopic.php?t=12235" target="_blank">这个帖子</a>。</p>

<p>OK，概念解释清楚了。那么，NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事实上是支持 hard link 和 symbolic link 的，虽然 Windows 里没有比较容易使用的相关工具，而且 Explorer 对待 symbolic link 也有很奇怪的行为。</p>

<p>在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个 hard link，用法倒是很简单:</p>

<blockquote>
<pre><code>fsutil hardlink create &lt;新文件名&gt; &lt;现有文件名&gt;
</code></pre>
</blockquote>

<p>也可以使用 <a href="http://unxutils.sourceforge.net/" target="_blank">GNU utilities for Win32</a> 中的 ln 来创建 hard link。这是一些 GNU 工具的 Win32 移植版本，非常好用。另外 <a href="http://www.cygwin.com/" target="_blank">Cygwin</a> 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件)。</p>

<p>当然，如果你想在自己的程序里创建 hard link，那也是很容易的，只需要一个很简单的 API 函数:</p>

<blockquote>
<pre><code>BOOL CreateHardLink(
  LPCTSTR lpFileName,
  LPCTSTR lpExistingFileName,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
</code></pre>
</blockquote>

<p>前两个参数的意思就不用解释了，最后一个参数的用途暂时保留，必须为 NULL。</p>

<p>对于 symbolic link，NTFS 只支持对目录的 symbolic link，微软把它称作 junction。但是对于文件的 symbolic link，微软也有提供解决方案，那就是快捷方式(Shortcut，.lnk 文件)。不过 symbolic link 和快捷方式不是一个层次上的东西，前者是底层文件系统的功能，后者是应用层的功能。</p>

<p>在“管理工具”中的“计算机管理”里的“磁盘管理”里我们可以将一个卷装载到一个 NTFS 卷上的某个空目录里，这实际上就是为被装载卷的根目录建立一个以该空目录名为名的 symbolic link。也可以用命令行工具 MOUNTVOL 来完成这项工作。</p>

<p>遗憾的是 Windows 并没有提供对 NTFS 的 symbolic link 完整支持的工具。“计算机管理”或者 MOUNTVOL 只能对某个卷的根目录创建 symbolic link，而不是对任意目录。幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 <a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx" target="_blank">junction.exe</a> 来全功能的完成对 NTFS symbolic link 的管理。当然，微软也还不至于太莫名其妙，它在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事。不过它的查看 symbolic link 信息的功能不如 junction，因为不支持通配符和子目录扫描。</p>

<p><strong>需要注意的是</strong>，Explorer 对待 symbolic link 有一个很奇怪的行为。那就是，在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别，删除这个 symbolic link 将会删除被 link 的目录下的所有文件！而著名的强大的方便的扩展性强的(原谅我在这里用了这么多修饰词，我确实太喜欢 TC 了。)文件管理工具 Total Commander 则没有这个问题。</p>

<p>文中的某些基本概念和知识来源于以下两个页面:<br />
http://answers.google.com/answers/threadview?id=341355<br />

http://phorum.study-area.org/viewtopic.php?t=12235</p>

<p>感谢提供这两个页面内容的各位。</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/ntfs-hard-linksymbolic-link/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>在 NTFS 里使用目录符号链接</title>
		<link>http://rainux.org/ntfs</link>
		<comments>http://rainux.org/ntfs#comments</comments>
		<pubDate>Mon, 06 Dec 2004 16:21:24 +0000</pubDate>
		<dc:creator>Rainux</dc:creator>
				<category><![CDATA[Software 软件]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Software_软件]]></category>

		<guid isPermaLink="false">http://rainux.sefans.com/blog/?p=16</guid>
		<description><![CDATA[以前接触 Linux 时，非常喜欢其 ext2 文件系统的链接/符号链接(symbolic link)功能，这个功能简单的说就是可以让一个文件或者目录实体拥有多个名称。比如让 /bin/ls 和 /home/rainux/ls 这两个文件路径指向同一个文件，或者让 /bin/ 和 /home/rainux/bin/ 表示同一个目录。访问多个名称中的任意一个都是直接访问该文件本身。这个功能在某些时候非常有用。 用了这么久 Windows 2000，只知道 NTFS 文件系统可以将一个分区(partition)加载到目录里，比如让 C:\Cache 指向的是一个单独的分区。刚才到 Sysinternals.com 上去找那个蓝屏屏保才顺便看到 Windows 2000 以及之后版本的 NTFS 是支持目录符号链接的，但是 MS 并没有在 Windows 里附带这样的工具。而使用 Sysinternals.com 提供的命令行工具 junction.exe 就可以创建目录符号链接。 现在，可以让 D:\WinTools 和 E:\WinTools 指向同一个目录了，这将在一定程度上解决一些盘符相关的问题。 标签：Software_软件, Windows]]></description>
			<content:encoded><![CDATA[<p>以前接触 Linux 时，非常喜欢其 ext2 文件系统的链接/符号链接(symbolic link)功能，这个功能简单的说就是可以让一个文件或者目录实体拥有多个名称。比如让 /bin/ls 和 /home/rainux/ls 这两个文件路径指向同一个文件，或者让 /bin/ 和 /home/rainux/bin/ 表示同一个目录。访问多个名称中的任意一个都是直接访问该文件本身。这个功能在某些时候非常有用。</p>

<p>用了这么久 Windows 2000，只知道 NTFS 文件系统可以将一个分区(partition)加载到目录里，比如让 C:\Cache 指向的是一个单独的分区。刚才到 Sysinternals.com 上去找那个蓝屏屏保才顺便看到 Windows 2000 以及之后版本的 NTFS 是支持目录符号链接的，但是 MS 并没有在 Windows 里附带这样的工具。而使用 Sysinternals.com 提供的命令行工具 <a href="http://www.sysinternals.com/ntw2k/source/misc.shtml#junction">junction.exe</a> 就可以创建目录符号链接。</p>

<p>现在，可以让 D:\WinTools 和 E:\WinTools 指向同一个目录了，这将在一定程度上解决一些盘符相关的问题。</p>

	标签：<a href="http://rainux.org/tag/software_%e8%bd%af%e4%bb%b6/" title="Software_软件" rel="tag">Software_软件</a>, <a href="http://rainux.org/tag/windows/" title="Windows" rel="tag">Windows</a><br />
]]></content:encoded>
			<wfw:commentRss>http://rainux.org/ntfs/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

