﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Fun In C++-随笔分类-Enjoy Software</title><link>http://www.cppblog.com/HienChu/category/5068.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 21 Jul 2011 06:08:18 GMT</lastBuildDate><pubDate>Thu, 21 Jul 2011 06:08:18 GMT</pubDate><ttl>60</ttl><item><title>杂七杂八——Name与x:Name的关系 （转载）</title><link>http://www.cppblog.com/HienChu/archive/2011/07/16/151172.html</link><dc:creator>HienChu</dc:creator><author>HienChu</author><pubDate>Sat, 16 Jul 2011 08:42:00 GMT</pubDate><guid>http://www.cppblog.com/HienChu/archive/2011/07/16/151172.html</guid><wfw:comment>http://www.cppblog.com/HienChu/comments/151172.html</wfw:comment><comments>http://www.cppblog.com/HienChu/archive/2011/07/16/151172.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/HienChu/comments/commentRss/151172.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/HienChu/services/trackbacks/151172.html</trackback:ping><description><![CDATA[<p><em>很不错的文章，相信很多人都被这个问题困扰过<br /><br /></em><strong style="color: #ff0000; font-size: 10pt">以下内容转载自</strong><a style="color: #ff0000; font-size: 10pt" href="http://blog.csdn.net/FantasiaX/article/details/3499767"><strong>http://blog.csdn.net/FantasiaX/article/details/3499767</strong></a><strong style="color: #ff0000; font-size: 10pt">，版权归作者所有<br /></strong></p>
<h1 style="font-size: 16pt">杂七杂八&#8212;&#8212;Name与x:Name的关系</h1>
<p>&nbsp;</p>
<h2 style="font-size: 12pt">小序：</h2>
<p>&nbsp;</p>
<p>如果想用Google搜包含冒号的内容怎么办？比如我想搜x:Name这个字符串&#8230;&#8230;</p>
<p>原来，应该是这样&#8212;&#8212;x::Name</p>
<p>这世道，连搜索也要加转义，全民程序员，要不要人活了？</p>
<p>&nbsp;</p>
<h2 style="font-size: 12pt">正文：</h2>
<p>&nbsp;</p>
<p>从第一天学习XAML语言开始，我就一直没分清为什么对于一个XAML标签既可以设置它的Name又可以设置它的x:Name。问过一些同事，大家好像对这种比较孔乙己的问题不太感兴趣。今天花了些时间看了看，收获还挺多的。与大家分享一下。</p>
<p>&nbsp;</p>
<p>首先，让我们剖析一下XAML代码与C#代码之间的关系。</p>
<p>&nbsp;</p>
<p>大家都知道，XAML是&#8220;用来设计UI&#8221;的，设计师用XAML设计出来的UI其后台代码（程序逻辑）可以由程序员用C#或者VB去写&#8212;&#8212;这叫做Code-behind。实际上，设计师用XAML和程序用C#都是在构建同一个类，换句话说就是：把一个类劈成两半，与UI相关的那半由设计师用XAML写，与逻辑相关的那半由程序员用C#写。</p>
<p>&nbsp;</p>
<p>.NET之所以支持这种劈开写的功能，得益于partial这个关键字。请大家看这两段代码</p>
<p>&nbsp;</p>
<div class="highlighter">
<ol class="highlighter-c"><li><span class="comment">// For UI </span></li><li class="alt"><span class="keyword">public</span> partial <span class="keyword">class</span> Car</li><li>{</li><li class="alt">Color bodyColor;</li><li>Color windowColor;</li><li class="alt">Polygon door;</li><li>Polygon seat;</li><li class="alt">}</li><li class="alt"><span class="comment">// For logic </span></li><li><span class="keyword">public</span> partial <span class="keyword">class</span> Car</li><li class="alt">{</li><li><span class="keyword">public</span> <span class="keyword">void</span> Accelerate() { <span class="comment">/*80, 90... 120, 140....1200...flying...*/</span>}</li><li class="alt"><span class="keyword">public</span> <span class="keyword">void</span> Break() {<span class="comment">/*zizizizizizizizizi....*/</span> }</li><li>}</li></ol></div>
<div class="highlighter">
<ol class="highlighter-c"><li><span class="keyword">public</span> <span class="keyword">class</span> Car</li><li class="alt">{</li><li><span class="comment">// UI </span></li><li class="alt">Color bodyColor;</li><li>Color windowColor;</li><li class="alt">Polygon door;</li><li>Polygon seat;</li><li><span class="comment">// logic </span></li><li class="alt"><span class="keyword">public</span> <span class="keyword">void</span> Accelerate() { <span class="comment">/*80, 90... 120, 140....1200...flying...*/</span>}</li><li><span class="keyword">public</span> <span class="keyword">void</span> Break() {<span class="comment">/*zizizizizizizizizi....*/</span> }</li><li class="alt">}</li></ol></div>
<p>实际效果是完全一样的。只是前者是把UI和逻辑劈开写，后者是混在一起写罢了。</p>
<p>&nbsp;</p>
<p>劈开的确是劈开了，但让设计师用C#代码去实现UI恐怕不现实&#8212;&#8212;让Blend直接生成C#不是不可能是事情，只是C#描述UI太不直观了。于是，微软更进一步，把界面描述语言又向设计师方向推进了一层，也就是XAML语言。于是，开发和设计的格局就变成了这样：</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/FantasiaX/EntryImages/20081211/p6.jpg" /></p>
<p>&nbsp;</p>
<p>有了XAML和将XAML解析为C#/VB的解析器，设计师们就能以自己最高的工作效率与程序员们合作开发软件了。目前关于XAML是如何解析成C#/VB的资料非常少。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p style="font-size: 14pt"><strong>Name揭秘</strong></p>
<p>&nbsp;</p>
<p>下面让我们把目光集中在XAML-&gt;C#的解析上来，看看Name和x:Name的本质是什么。</p>
<p>&nbsp;</p>
<p>让我们看一段代码：</p>
<p>&nbsp;</p>
<div class="highlighter">
<ol class="highlighter-xml"><li><span class="tag">&lt;</span><span class="tag-name">Window</span> <span class="attribute">x:Class</span>=<span class="attribute-value">"WpfApplication2.Window1"</span></li><li class="alt"><span class="attribute">xmlns</span>=<span class="attribute-value">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span></li><li><span class="attribute">xmlns:x</span>=<span class="attribute-value">"http://schemas.microsoft.com/winfx/2006/xaml"</span></li><li class="alt"><span class="attribute">Title</span>=<span class="attribute-value">"Window1"</span> <span class="attribute">Height</span>=<span class="attribute-value">"100"</span> <span class="attribute">Width</span>=<span class="attribute-value">"300"</span> <span class="attribute">Background</span>=<span class="attribute-value">"SteelBlue"</span><span class="tag">&gt;</span></li><li><span class="tag">&lt;</span><span class="tag-name">StackPanel</span><span class="tag">&gt;</span></li><li class="alt"><span class="tag">&lt;</span><span class="tag-name">TextBox</span> <span class="attribute">Name</span>=<span class="attribute-value">"textBox1"</span><span class="tag">/&gt;</span></li><li><span class="tag">&lt;</span><span class="tag-name">TextBox</span> <span class="attribute">Name</span>=<span class="attribute-value">"textBox2"</span><span class="tag">/&gt;</span></li><li class="alt"><span class="tag">&lt;</span><span class="tag-name">Button</span> <span class="attribute">Content</span>=<span class="attribute-value">"Show Name"</span> <span class="attribute">Click</span>=<span class="attribute-value">"Button_Click"</span><span class="tag">/&gt;</span></li><li><span class="tag">&lt;/</span><span class="tag-name">StackPanel</span><span class="tag">&gt;</span></li><li><span class="tag">&lt;</span><span class="tag-name">x:Code</span><span class="tag">&gt;</span></li><li class="alt"><span class="cdata">&lt;![CDATA[</span></li><li><span class="cdata"></span></li><li class="alt"><span class="cdata">private void Button_Click(object sender, RoutedEventArgs e)</span></li><li><span class="cdata">{</span></li><li class="alt"><span class="cdata">Button btn = e.OriginalSource as Button;</span></li><li><span class="cdata">textBox1.Text = btn.Name;</span></li><li class="alt"></li><li><span class="cdata">textBox2.Name = "Made_in_China";</span></li><li class="alt"><span class="cdata">textBox2.Text = textBox2.Name;</span></li><li><span class="cdata">}</span></li><li class="alt"><span class="cdata"></span></li><li><span class="cdata">]]&gt;</span></li><li class="alt"><span class="tag">&lt;/</span><span class="tag-name">x:Code</span><span class="tag">&gt;</span></li><li><span class="tag">&lt;/</span><span class="tag-name">Window</span><span class="tag">&gt;</span></li></ol></div>
<p>运行结果是：</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/FantasiaX/EntryImages/20081211/p2.jpg" /></p>
<p>&nbsp;</p>
<p>我用XAML定义了三个UI元素，其中两个TextBox是有Name的。凡是你在XAML代码里设置了它的Name，那么在C#代码里就会有一个对应的变量。这可也很好解释，看看IL程序集就知道了&#8212;&#8212;</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/FantasiaX/EntryImages/20081211/p3.jpg" width="311" height="399" /></p>
<p>&nbsp;</p>
<p>不难看出，XAML解析器会为XAML代码中设置了Name的元素声明同名的引用变量，而且设置Name的元素则不会有引用变量生成（不过这个元素对应的对象是存在的，并且是VisualTree/LogicalTree上的结点）。</p>
<p>&nbsp;</p>
<p><span style="color: rgb(0,0,128)">通过上面的代码，我看可以看出，Name的作用有两个：</span></p>
<p><span style="color: rgb(0,0,128)">1. 告诉XAML解析器为设置了Name的元素声明对应的引用变量（本例中是textBox1和textBox2），变量名使用Name的值。</span></p>
<p><span style="color: rgb(0,0,128)">2. 将XAML元素对应的对象（本例中是两个TextBox的实例）的Name属性设置为Name的值。</span></p>
<p>&nbsp;</p>
<p>注意，引用变量一旦声明之后名字就不能改了，但对象的Name属性仍然可以改（示例中我就把由textBox2变量引用着的实例的Name属性改成Made_in_China了。）</p>
<p>&nbsp;</p>
<p>让我们再挖深点儿&#8212;&#8212;TextBox的Name属性是从哪儿继承来的呢？查一查MSDN，原来是从FrameworkElement那儿继承来的。这个Name属性是非常重要的&#8212;&#8212;如果你想在一棵&#8220;树&#8221;上查找叫某个名字的元素，调用&#8220;树根&#8221;的FindName方法就可以做到了。特别需要注意的是&#8212;&#8212;FindName所使用的参数是对象Name属性的值而不是引用着这个对象的变量的名字。如果你的程序里只在XAML里设置了一次Name，那么引用变量的名字和对象Name属性的值恰好一样。但如果你改变了对象Name属性的值，那可就要小心了！请看下面的代码：</p>
<p>&nbsp;</p>
<div class="highlighter">
<ol class="highlighter-c"><li><strong>&lt;Window x:Class=<span class="string">"WpfApplication2.Window1"</span></strong></li><li class="alt"><strong>xmlns=<span class="string">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span></strong></li><li><strong>xmlns:x=<span class="string">"http://schemas.microsoft.com/winfx/2006/xaml"</span></strong></li><li class="alt"><strong>Title=<span class="string">"Window1"</span> Height=<span class="string">"100"</span> Width=<span class="string">"300"</span> Background=<span class="string">"SteelBlue"</span>&gt;</strong></li><li><strong>&lt;StackPanel&gt;</strong></li><li class="alt"><strong>&lt;TextBox Name=<span class="string">"textBox1"</span>/&gt;</strong></li><li><strong>&lt;TextBox Name=<span class="string">"textBox2"</span>/&gt;</strong></li><li class="alt"><strong>&lt;Button Content=<span class="string">"Show Name"</span> Click=<span class="string">"Button_Click"</span>/&gt;</strong></li><li><strong>&lt;/StackPanel&gt;</strong></li><li><strong>&lt;x:Code&gt;</strong></li><li class="alt"><strong>&lt;![CDATA[</strong></li><li><strong></strong></li><li class="alt"><strong><span class="keyword">private</span> <span class="keyword">void</span> Button_Click(<span class="keyword">object</span> sender, RoutedEventArgs e)</strong></li><li><strong>{</strong></li><li class="alt"><strong>textBox2.Name = <span class="string">"Made_in_China"</span>;</strong></li><li><strong><span class="comment">//this.RegisterName("Made_in_China", this.textBox2); </span></strong></li><li class="alt"><strong>TextBox t = <span class="keyword">this</span>.FindName(<span class="string">"Made_in_China"</span>) <span class="keyword">as</span> TextBox;</strong></li><li><strong><span class="keyword">if</span>(t==<span class="keyword">null</span>)</strong></li><li class="alt"><strong>{</strong></li><li><strong><span class="keyword">return</span>;</strong></li><li class="alt"><strong>}</strong></li><li><strong><span class="keyword">else</span></strong></li><li class="alt"><strong>{</strong></li><li><strong>MessageBox.Show(<span class="string">"OK"</span>);</strong></li><li class="alt"><strong>}</strong></li><li><strong>}</strong></li><li class="alt"><strong></strong></li><li><strong>]]&gt;</strong></li><li class="alt"><strong>&lt;/x:Code&gt;</strong></li><li><strong>&lt;/Window&gt;</strong></li></ol></div>
<p><span style="background-color: rgb(248,248,248); color: rgb(0,0,0)">注意，除非我取消对第17行的注释，不然，尽管我已经把textBox2.Name改成了Made_in_China，但由于这个新名字还没有被注册（即没有使用RegisterName方法将Made_in_China和textBox2所引用的对象关联起来），我们仍然不能通过FindName找到它。</span></p>
<p>&nbsp;</p>
<p><span style="background-color: rgb(248,248,248); color: rgb(0,0,0)">我知道这段话挺拗口，不过有一点你想通过某种方法查找由DataTemplate自动生成的UI元素时，或许应该跑来读一读这段绕口令:P</span></p>
<p>&nbsp;</p>
<p><span style="background-color: rgb(248,248,248); color: rgb(0,0,0)">最后再啰嗦一句：为什么这个Name属性可以起到在运行时被当作查找标识呢？是因为FrameworkElement被一个名为RuntimeNamePropertyAttribute的attribute所修饰。这个attribute明确指定，FrameworkElement的Name属性具备了作为查找标识的资格。TextBox等类派生自FrameworkElement，自然也有这个功能。下面是FrameworkElement类的声明。</span></p>
<p>&nbsp;</p>
<p><strong></strong></p><strong>
<div class="highlighter">
<ol class="highlighter-c"><li>[RuntimeNamePropertyAttribute(<span class="string">"Name"</span>)]</li><li class="alt">[StyleTypedPropertyAttribute(Property = <span class="string">"FocusVisualStyle"</span>, StyleTargetType = <span class="keyword">typeof</span>(Control))]</li><li>[XmlLangPropertyAttribute(<span class="string">"Language"</span>)]</li><li class="alt"><span class="keyword">public</span> <span class="keyword">class</span> FrameworkElement : UIElement, </li><li>IFrameworkInputElement, IInputElement, ISupportInitialize</li><li class="alt">{</li><li><span class="comment">//... </span></li><li class="alt">}</li></ol></div>
<p style="font-size: 14pt">x:Name揭秘</p>
<p></strong>&nbsp;</p>
<p>&nbsp;</p>
<p style="font-size: 14pt"></p>
<p>&nbsp;</p>
<p>x:Name的x加一个冒号，说明它来自x这个名称空间。这个名称空间是定义在XAML的根元素上的。也就是这句：</p>
<p>&nbsp;</p>
<div class="highlighter">
<ol class="highlighter-xml"><li><span class="attribute">xmlns:x</span>=<span class="attribute-value"><a href="http://schemas.microsoft.com/winfx/2006/xaml"><font color="#336699">http://schemas.microsoft.com/winfx/2006/xaml</font></a></span></li></ol></div>
<p>这个x就是XAML的字头了。这个名称空间的本意就是告诉我们&#8212;&#8212;这个名称空间里所装的元素都与XAML解析有关。比如，我在代码里还使用了x:Code，把本来应该呆在C#代码里的内容请到XAML里来了。</p>
<p>&nbsp;</p>
<p><span style="color: rgb(0,0,128)">可见，x:Name与Name根本不是一个层面上的东西&#8212;&#8212;Name是直接与元素和面向对象编程相关的东西；x:Name是XAML语言解析层面上的东西。</span></p>
<p>&nbsp;</p>
<p>如果我们把上面代码中的所有Name都改成x:Name，所有效果都是一样的。</p>
<p>不知道XAML中标有x:的内容是不是会被&#8220;预处理&#8221;一下。</p>
<p>&nbsp;</p>
<p style="font-size: 14pt"><strong>Name与x:Name关系揭秘</strong></p>
<p>&nbsp;</p>
<p>不过，如果你的逻辑感比较强，你会发现这样一个问题&#8212;&#8212;为一个XAML元素声明对应的引用变量，这不是面向对象编程层面的东西而是XAML解析层的东西。而且，如果Name在语义学上&#8220;恪守本分&#8221;的话，它应该只去设置一下对象的Name属性值而不去管是不是声明变量的事儿。</p>
<p>&nbsp;</p>
<p>大胆设想一下，你会猜到，当XAML解析器发现一个元素的Name被设置了，就会去调用x:Name的那套机制。也就是说，引用变量是在x:Name机制被调用的时候声明的。同样，如果你设置的是元素的x:Name，XAML解析器会在声明变量之后再去给实例的Name属性设置值。</p>
<p>&nbsp;</p>
<p>这样的猜想能够得到证实吗？让我们在MSDN里搜刮一下。</p>
<p>&nbsp;</p>
<p>在x:Name的注释里，我们能找到这段话：</p>
<p>&nbsp;</p>
<p>Under the standard build configuration for a WPF application project that uses XAML, partial classes, and code-behind, the specified x:Name becomes the name of a field that is created in the underlying code when XAML is processed, and that field holds a reference to the object. </p>
<p>&nbsp;</p>
<p>而在FrameworkElement.Name属性的文档里，又能找到这句话：</p>
<p>&nbsp;</p>
<p>This property essentially provides a WPF framework-level convenience property to set the XAML x:Name Attribute. </p>
<p>&nbsp;</p>
<p>也就是说，Name的确会去调x:Name那套机制。为什么这么做？可能是为了写起来方便。不过，我真不太喜欢这种搅和在一起的风格。我宁可使用Name去给对象的Name属性赋值而使用x:Name去声明变量。</p>
<p>&nbsp;</p>
<p><span style="color: rgb(0,0,128)">貌似&#8220;Under the standard build configuration &#8221;这句话有点玄机。不知道非standard编译配置会有什么样的效果，怎样才能自定义编译配置呢？</span></p>
<p>&nbsp;</p>
<p>不喜欢这种风格的原因还在于：Name和x:Name互相调用会在某些逻辑下出问题，特别是&#8220;先有鸡还是先有蛋&#8221;这种情况下。</p>
<p>&nbsp;</p>
<p><strong style="font-size: 14pt">关于在XAML中使用同一个程序集中的User Control</strong></p>
<p>&nbsp;</p>
<p>说到&#8220;先有鸡还是先有蛋&#8221;的问题，让我想起了另一个困扰自己很久的问题。请看下面的代码：</p>
<p>&nbsp;</p>
<p>假设我有这样一个project，</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/FantasiaX/EntryImages/20081211/p4.jpg" width="254" height="203" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>现在我想把MyControl用在我的Window1里。如果代码写成这样：</p>
<p>&nbsp;</p>
<div class="highlighter">
<ol class="highlighter-c"><li>&lt;Window x:Class=<span class="string">"WpfApplication.Window1"</span></li><li class="alt">xmlns=<span class="string">"http://schemas.microsoft.com/winfx/2006/xaml/presentation"</span></li><li>xmlns:x=<span class="string">"http://schemas.microsoft.com/winfx/2006/xaml"</span></li><li class="alt">xmlns:local=<span class="string">"clr-namespace:WpfApplication"</span></li><li>Title=<span class="string">"Window1"</span> Height=<span class="string">"300"</span> Width=<span class="string">"300"</span>&gt;</li><li class="alt">&lt;Grid&gt;</li><li>&lt;local:MyControl Name=<span class="string">"myControl"</span>/&gt;</li><li class="alt">&lt;/Grid&gt;</li><li>&lt;/Window&gt;</li></ol></div>
<p>当编译的时候，会报出错误：</p>
<p>&nbsp;</p>
<p align="center"><img alt="" src="http://p.blog.csdn.net/images/p_blog_csdn_net/FantasiaX/EntryImages/20081211/p5.jpg" width="271" height="175" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>最让人哭笑不得的原因就是&#8220;因为MyControl是在同一个程序集里，你就得使用x:Name而不是Name！&#8221;这算什么解释？<span style="background-color: rgb(255,255,0)">跟是不是同一个程序集有什么关系？</span></p>
<p>&nbsp;</p>
<p>=====================================</p>
<p>崔维福的补充：</p>
<p>"<span style="background-color: rgb(255,255,0)">跟是不是同一个程序集有什么关系</span>" 具体来说还是有关系的。你一定知道Name不能和x：Name同时用，因为在build的时候他知道这两个做了相同的工作，什么工作呢，就是做在&#8220;类名.g.cs&#8221;，中添加了后台代码，x:Name是Attribute，而Name是DP，编译器可以挖掘Attribute来为自己的后台添加内容，但是不能用Name来添加，因为自己还没有被构造完全呢。所以呢就是告诉你，要用x：Name，要不就把这个contro放到别的project下，它好能把它构造出来！希望我解释的够清楚！</p>
<p>&nbsp;</p>
<p>作者：</p>
<p>感谢崔先生的批注，您对技术精益求精的精神让我非常景仰，向您学习、致敬！</p>
<p>=====================================</p>
<p>&nbsp;</p>
<p>TO BE CONTINUE...</p>
<p>&nbsp;</p><img src ="http://www.cppblog.com/HienChu/aggbug/151172.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/HienChu/" target="_blank">HienChu</a> 2011-07-16 16:42 <a href="http://www.cppblog.com/HienChu/archive/2011/07/16/151172.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>chm文件“该页无法显示”的解决办法</title><link>http://www.cppblog.com/HienChu/archive/2007/09/02/31395.html</link><dc:creator>HienChu</dc:creator><author>HienChu</author><pubDate>Sun, 02 Sep 2007 07:13:00 GMT</pubDate><guid>http://www.cppblog.com/HienChu/archive/2007/09/02/31395.html</guid><wfw:comment>http://www.cppblog.com/HienChu/comments/31395.html</wfw:comment><comments>http://www.cppblog.com/HienChu/archive/2007/09/02/31395.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/HienChu/comments/commentRss/31395.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/HienChu/services/trackbacks/31395.html</trackback:ping><description><![CDATA[前些天在网上搜罗了些C++的经典书籍，大多是.chm格式的。刚刚有空，想拿来读读，可是郁闷的事情发生了，点击目录时，右面竟然显示&#8220;该页无法显示&#8221;！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 郁闷，下的时候还好好的，怎么现在就down了呢？难道是病毒？<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 百度了问题之后，发现答案前篇一律:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#800080> 一.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、开始运行，输入：regsvr32 C:\windows\system32\hhctrl.ocx ，确定，重新关联文件。 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、执行一下windows目录里的hh.exe 。 <br></font></p>
<p><font color=#800080>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 在微软网站上下载hhupd.exe,安装hh.exe后并运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.实际上,下载hhupd.exe后,运行后就可以了。这个东西大小为461kb 3.在c:\windows\system32里找到&#8220;Hhctrl.ocx&#8221;文件,然后运行:&#8220;regsvr32 c:\windows\system32\hhctrl.ocx...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 三 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1，右键关联chm文件的&#8220;打开方式&#8221;到\Windows\HH.exe <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2，在命令行运行regsvr32 itss.dll <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3，在命令行运行regsvr32 hhctrl.ocx </font></p>
<p><font color=#800080>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#000000>但这些方法我对我却丝毫不起作用，于是只能自寻出路。我试着把某个文件copy到桌面上，试着打开，居然成功了。直觉告诉我，问题出在文件夹的名称上。因为我突然想起自己在整理之后把目录名称改成了"C__C++__C#&#8221;,于是试探性的更改了文件夹名称，试了几次，终于确定了罪魁祸首——是&#8220;#&#8221;。把"C#&#8221;改成"C Sharp"以后，问题解决了。</font></font><font color=#800080><br></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 那究竟为什有了"#"就不行了呢？因为.chm是以html格式存储内容的，所以每一页都对应了一个本地的URL地址。在URL地址的标准规定中"#"是属于特殊字符，代表书签，详细的标准说明可以参看这里<a href="http://www.128kj.com/article/article9/D15BCF6C477EAA03699B8B9FB25B3CD9.htm?id=675"><u><font color=#0000ff>http://www.128kj.com/article/article9/D15BCF6C477EAA03699B8B9FB25B3CD9.htm?id=675</font></u></a>。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果目录名称里含有"#"或者其他特殊字符的话，URL地址就因此而被中断了，自然&#8220;该页无法显示&#8221;。<br></p>
<img src ="http://www.cppblog.com/HienChu/aggbug/31395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/HienChu/" target="_blank">HienChu</a> 2007-09-02 15:13 <a href="http://www.cppblog.com/HienChu/archive/2007/09/02/31395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>