<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[飘忽不定的博客]]></title>
	  <link>http://blog.163.com/long_lh</link>
	  <description><![CDATA[ 摩天轮转啊转，何时轮到我……]]></description>
	  <language>zh-CN</language>
	  <pubDate>Sun, 10 May 2009 15:38:24 +0800</pubDate>
	  <lastBuildDate>Sun, 10 May 2009 15:38:24 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[long_lh]]></managingEditor>
	  <webMaster><![CDATA[飘忽不定]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[飘忽不定的博客]]></title>
	  	<url>http://blog.163.com/long_lh/style/common/user_default.gif</url>
	  	<link>http://blog.163.com/long_lh</link>
	  </image>
  <item>
  	<title><![CDATA[设计模式学习之路--Strategy（策略）模式]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020082171384832</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Strategy模式的意图：定义一系列的算法，把它们一个个封装起来，并且使它们可相互替换。&nbsp; </P>
<P align=center><STRONG>Strategy模式：关键特征</STRONG></P>
<P><STRONG>意图</STRONG>： 让你可以使用不同的业务规则或算法——取决于它们出现的场景。</P>
<P><STRONG>问题</STRONG>： 需要根据发出请求的客户或被处理的数据对算法作出选择。如果你只是拥有一些不发生变化的算法，你就</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不需要Strategy模式。</P>
<P><STRONG>解决方案</STRONG>： 将算法的选择和算法的实现相分离。让客户可以基于场景作出选择。</P>
<P><STRONG>参与者与协作者</STRONG>： Strategy规定如何使用不同的算法。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConcreteStrategies实现这些不同的算法。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Context通过类型为Strategy的引用使用特定的ConcreteStrategy。Strategy与Context交互实现</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所选的算法（有时候Strategy必须向Context做查询）。Context将来自Client的请求转发给Strategy。</P>
<P><STRONG>效果</STRONG>： Strategy模式定义了一系列的算法。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch语句或条件语句得到了避免。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你必须以相同的方式调用所有的算法（它们必须拥有相同的接口）ConcreteStrategies与Context之间的交互</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能需要在Context中加入getState之类的方法。</P>
<P><STRONG>实现</STRONG>： 让使用算法的类（Context）包含一个抽象类（Strategy），抽象类中有一个抽象方法指定如何调用算法。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个派生类根据需要实现算法。注意：如果你希望拥有某些默认行为，这个方法可以不是抽象的。</P>
<P><STRONG>注意</STRONG>：在原型化的Strategy模式中，选择要使用的特定实现的责任是由Client对象来实行的，</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这提供了Strategy模式的场景。</P>
<P align=center><A href="http://img.blog.163.com/photo/zpMQBb48Pn1kv_QgQW9y4A==/3179259861947257649.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/zpMQBb48Pn1kv_QgQW9y4A==/3179259861947257649.jpg"></A></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Strategy模式建立在几条原则的基础上：</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp;&nbsp; 对象拥有责任。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp; 这些责任的不同的特定实现通过使用多态来表现。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. 需要将几个不同的实现按照——概念上——相同的算法来管理。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. 一个好的设计经验：将问题领域中发生的行为彼此分离——也就是说，使它们解耦。这让我可以改变对某一</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;行为负责的类，而不会对其他行为产生不好的影响。</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020082171384832</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020082171384832</guid>
    <pubDate>Mon, 17 Mar 2008 14:09:41 +0800</pubDate>
    <dcterms:modified>2008-03-18T09:47:10+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[设计模式学习之路--Abstract Factory（抽象工厂）模式]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020082111024392</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Abstract Factory模式的意图是： 提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们的具体的类。</P>
<P align=center><STRONG>Abstract Factory模式：关键特征</STRONG></P>
<P><STRONG>意图</STRONG>：你需要为特定的客户（或情况）提供特定系列的对象。</P>
<P><STRONG>问题</STRONG>：一系列相关的对象需要被实例化。</P>
<P><STRONG>解决方案</STRONG>：协调不同系列对象的创建过程。提供一种方法保持如何在客户对象外部执行对象实例化的规则，</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;客户对象将使用这些实例化出来的对象。</P>
<P><STRONG>参与者与协作者</STRONG>：AbstractFactory为如何创建需要的每个系列的对象定义接口。典型情况下，</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 每个系列都独立拥有自己的ConcreteFactory，通过它被实例化。</P>
<P><STRONG>效果</STRONG>：这个模式将使用哪些对象的规则与如何使用这些对象的逻辑相隔离。</P>
<P><STRONG>实现</STRONG>：定义一个抽象类来指定哪些对象将被创建。然后为每个系列实现一个具体类。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表或文件也可以被用于达到同样的目的。</P>
<P align=center><A href="http://img.blog.163.com/photo/lZPHU8NJ2eW70nHwLzIUyg==/1430737306620839980.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/lZPHU8NJ2eW70nHwLzIUyg==/1430737306620839980.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你必须协调不同系列对象的创建时，你应该使用Abstract Factory模式。它提供一种方法来遵循如何在客户对象外部执行对象的实例化的规则，客户对象将使用这些实例化出来的对象。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; 首先，确定实例化的规则，并定义一个抽象类，其中的接口为每种需要被实例化的对象提供一种方法。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; 然后，从这个抽象类为每个系列实现一个具体类。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; 客户对象使用具体工厂对象来创建自己需要的服务者对象。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>备注：</STRONG>在开始学习COM的时候，就接触到了类工厂的概念，但是当时一直就比较朦胧。现在对它有了一个更具体化的认识了吧。</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020082111024392</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020082111024392</guid>
    <pubDate>Tue, 11 Mar 2008 10:38:29 +0800</pubDate>
    <dcterms:modified>2008-03-18T09:47:05+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[设计模式学习之路--Bridge（桥接）模式]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/27693480200821053220743</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bridge模式的意图：将抽象部分与它的实现部分分离，使它们都可以独立地变化。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 抽象部分：不同的事物在概念层次上的联系。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分离： 让各部分的行为各自独立，或至少显示指出关联。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现部分：不是指实际构建抽象部分的方式，而是抽象类的对象和用来实现抽象类的派生类的对象。 &nbsp;&nbsp; </P>
<P align=center><STRONG>Bridge模式：关键特征</STRONG></P>
<P align=left><STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 意图</STRONG>： 将一组实现部分从另一组使用它们的对象中分离出来。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>问题</STRONG>： 一个抽象类的派生类必须使用多种实现部分，但又不能引起类数量的爆炸。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>解决方案</STRONG>： 为所有的实现部分定义一个接口，让抽象类的所有派生类使用这个接口。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>参与者与协作者</STRONG>： Abstraction为正在实现的对象定义接口。Implementor为特定的实现部分类定义接口。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Abstraction的派生类使用Implementor的派生类，而不必知道自己使用的特定ConcreteImplementor。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>效果</STRONG>： 实现部分与使用它的对象的分离增加了灵活性。客户对象不需要了解实现问题。</P>
<P align=left>&nbsp;<STRONG>&nbsp;&nbsp;&nbsp; 实现</STRONG>：&nbsp; 将实现部分封装在一个抽象类中。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在被实现的抽象部分基类中包含一个实现部分基类的句柄。</P>
<P align=center><A href="http://img.blog.163.com/photo/yV9qGxVnKuJ9BuWPRZQOGw==/5349994882339726661.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/yV9qGxVnKuJ9BuWPRZQOGw==/5349994882339726661.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Bridge模式中用到的面向对象原则</P>
<P align=left>&nbsp;</P>
<P align=center><A href="http://img.blog.163.com/photo/yJqQWCBFDgCWjLcZkIE79g==/883831426871923383.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/yJqQWCBFDgCWjLcZkIE79g==/883831426871923383.jpg"></A></P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/27693480200821053220743</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/27693480200821053220743</guid>
    <pubDate>Tue, 11 Mar 2008 09:47:04 +0800</pubDate>
    <dcterms:modified>2008-03-18T09:46:39+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[设计模式学习之路--Adapter(适配器)模式]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020082514643778</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Adapter模式的意图是：将一个类的接口转换成客户希望的另外一个接口。Adapter模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。是为一个内容合适但接口不匹配的对象创建一个新的接口的方法。Adapter模式最通常的用途就是保持多态。</P>
<P align=center><STRONG><FONT size=4>Adapter模式：关键特征</FONT></STRONG></P>
<P><STRONG>意图</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将一个无法控制的现有对象与一个特定接口想匹配。</P>
<P><STRONG>问题</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个系统拥有正确的数据和行为，但接口却是错误的。典型用途：你必须吧某些东西实现为我们</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义或已经拥有的抽象类的派生类。</P>
<P><STRONG>解决方案</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Adapter模式用我们需要的接口对无法修改的类进行包装。</P>
<P><STRONG>参与者与协作者</STRONG>：Adapter对Adaptee的接口进行适配，使它与Target（Adapter派生自它）相匹配。让Client把</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Adaptee当作Target的一个类型来使用它。</P>
<P><STRONG>效果</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Adapter模式让现存的对象适应新的类结构，而不受它们的接口限制。</P>
<P><STRONG>实现</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将现存的类包含在另一个类之中。包容类与需要的接口相匹配，并调用被包容类的方法。</P>
<P>&nbsp;</P>
<P align=center><A href="http://img.blog.163.com/photo/b3BN7vn_OWO2XCX-rujINA==/3395432644061222094.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/b3BN7vn_OWO2XCX-rujINA==/3395432644061222094.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;Facade模式和Adapter都是包装器，它们之间有什么差异呢？</P>
<P align=center><A href="http://img.blog.163.com/photo/7hdx5UGWArJl3zjPTYR4bg==/5401223328101428475.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/7hdx5UGWArJl3zjPTYR4bg==/5401223328101428475.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在两个模式中，我都拥有现存的类。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是在Facade模式中，我无须针对某个接口进行设计；而在Adapter模式中我则必须针对某个特定接口进行设计。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Facade模式中我对多态行为不感兴趣，而在Adapter模式中我可能对多态行为感兴趣。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Facade模式中，我的动机是简化接口。而在Adapter模式中——尽管也是越简单越好——我的目的是针对一个现有的接口进行设计，并不能简化任何东西，即使可能有另一个更简单的接口。</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020082514643778</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020082514643778</guid>
    <pubDate>Wed, 5 Mar 2008 13:58:06 +0800</pubDate>
    <dcterms:modified>2008-03-05T13:58:06+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[设计模式学习之路--Facade(外观)模式]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/27693480200825105040353</link>
    <description><![CDATA[<div><P align=center>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<STRONG>Facade模式的意图</STRONG>是：为了子系统的一组接口提供一个一致的界面，Facade模式定义了一个高层接口，</P>
<P align=left>这个接口使得这一子系统更加容易使用。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://img.blog.163.com/photo/L3-eKvmGqhT49AkVlHYsyA==/2833045640593321434.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/L3-eKvmGqhT49AkVlHYsyA==/2833045640593321434.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT size=5><STRONG>Facade模式：关键特征</STRONG></FONT></P>
<P align=left><STRONG>意图</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 希望简化现有系统的使用方法。你需要定义自己的接口</P>
<P align=left><STRONG>问题</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只需要使用一个复杂系统的一个子集。或者需要用一种特殊的方式与系统交互。</P>
<P align=left><STRONG>解决方案</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Facade向客户展现使用现有系统的一个新的接口。</P>
<P align=left><STRONG>参与者与协作者</STRONG>： 向客户展现一个定制的接口，让客户更容易地使用现有系统。</P>
<P align=left><STRONG>效果</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Facade模式简化了对所需子系统的使用。但是，由于Facade并不完整，</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;因此某些功能对于客户可能是不可用的。</P>
<P align=left><STRONG>实现</STRONG>：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 定义一个（或一组）新的类来提供所需的接口。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让新的类使用现有的系统。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://img.blog.163.com/photo/e16_vvNOdVU7YQKohdOdsA==/2323857407723722393.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/e16_vvNOdVU7YQKohdOdsA==/2323857407723722393.jpg"></A></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Facade模式之所以被这样命名，因为它在原始系统的前面建造了一个新的前端接口（一个“外观”）。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>Facade模式适用于以下情况：</STRONG></P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.&nbsp;&nbsp; 不需要使用一个复杂系统的所有功能，并且可以创建一个新的类来包容访问原有系统所使用的所有规则</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你创建的API是原始系统接口的一个子集——通常它就是——比原始系统的API简单得多。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.&nbsp; 希望包装或隐藏原有系统。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp; 希望使用原有系统的功能，并且希望增加一些新的功能。</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4. “编写一个新的类”的代价小于“让所有人学会使用原有系统”或“在未来维护整个系统”所需的代价。</P>
<P align=left>&nbsp;</P>
<P align=left>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>感言： </STRONG>现在回想起来，Facade模式在我刚刚开始工作的时候，接手的危化车项目里面就使用到了。当时主要是使用一个COM组件来封装对GIS控件（当时使用的是MO控件）的功能调用。可惜当时经验不足，而且在缺乏高手的指导的情况下，我是没能理解这种模式的真正好处的，所以虽然在大多情况下是使用了封装后的接口，而在一些功能接口上，还是直接的使用了GIS控件。这样的弊端在公司决定更换GIS控件的时候，终于凸显了出来（虽然比完全没有使用Facade模式更换来得轻松，但也还是费了一些周折的。）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/27693480200825105040353</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/27693480200825105040353</guid>
    <pubDate>Wed, 5 Mar 2008 11:11:43 +0800</pubDate>
    <dcterms:modified>2008-03-05T11:11:43+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[设计模式学习之路--开篇（浪子回头）]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/276934802008245753705</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说来真的很惭愧，从事软件开发这一块也有好长时间了，回过头来，却发现好多经典的书都没有拜读过，连设计模式都没有认真的看过。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 书上的东西不能给我们具体的解决方法，却告诉了我们分析问题和设计问题的方法，拓宽了思维模式。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发的时间长了，就越来越觉得思维被局限啦。急切的需要什么东西来引导我来突出这个限制。设计模式将是其中的一站。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多年来，都是停留在了表象的东西，从来没有更深入的去挖掘，也许现在是时候了……</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <STRONG>备注： 摘录部分不会专门提示，可以到下列资料中查找到。<BR></STRONG>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 资料来源：《Design Patterns Explained》 中文名：《设计模式精解》</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 【美】Alan Shalloway &amp; James R.Trott著&nbsp; 熊节译 清华大学出版社</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/276934802008245753705</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/276934802008245753705</guid>
    <pubDate>Tue, 4 Mar 2008 17:07:53 +0800</pubDate>
    <dcterms:modified>2008-03-05T11:19:32+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[拜早年啦]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020081183243944</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 明天回家了，断网10天。所以就先预祝各位鼠年吉祥如意，财源广进！<IMG src="http://st.blog.163.com/style/common/htmlEditor/portrait/west/preview/west49.gif"></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020081183243944</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020081183243944</guid>
    <pubDate>Fri, 1 Feb 2008 20:32:43 +0800</pubDate>
    <dcterms:modified>2008-02-01T20:32:43+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[EVC中LoadLibrary失败]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020080164135139</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 朋友说LoadLibrary的时候，返回错误代码：126。 这个一般引起的原因就是没有找到对应的文件。按道理来说应该是很好解决的，将对应文件拷贝到执行文件相同的目录下就可以了（网上还有一种说法，就是对应文件中如果它的依赖文件没有的话，也会引起这个错误，这个没有试验过！但是不管怎么样，一个完整的环境，应该是包含所有的依赖文件的。） 但是问题来了，他的开发环境是EVC4， 是在做Mobile开发，在Embedded（模拟器）环境下调试出现的问题。这个就很让人费解啦。因为我以前没有接触过此类开发，所以对这个情况相当的不了解。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 带着问题，用vs2008创建了一个&nbsp;Smart Device工程，测试了一把，果然出现了同样的问题。检查了一下配置，发现是没有问题的。那么问题出在了哪里呢？执行文件和库文件是放置在了一起啊！～ 为什么还会报126的错误呢？无意中发现，执行文件在调试的时候是被放置到了模拟器里面去了，这个就找到突破口了，也就是在调试过程中，虽然执行文件拷贝到了模拟器，但是其它文件没有自动的拷贝过去啊！那么重点就是怎么将文件同步到模拟器中，就成了解决问题的方法啦！</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在EVC中通过Tools--&gt;Remote &nbsp; File &nbsp; Viewer 这个功能，就可以实现模拟器与本机文件的同步。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在VS200*系列中，在Visual Studio Remote Tools里面可以找到Remote &nbsp; File &nbsp; Viewer 。或者到系统里面去寻找\Program Files\CE Remote Tools\5.01\bin\ccfilevw.exe。</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020080164135139</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020080164135139</guid>
    <pubDate>Wed, 16 Jan 2008 16:01:35 +0800</pubDate>
    <dcterms:modified>2008-01-16T16:28:51+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[拷贝构造函数与=重载符造成的困惑]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020079267180745</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天在编制程序的时候, 遇到了一个问题, 有个结构体在释放的时候老是出错。整不明白！先把代码贴一下：</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef CArray&lt;int, int&amp;&gt;&nbsp; ARR_INT;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef struct _SS</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARR_INT&nbsp;&nbsp; arr;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const _SS&amp; operator = (const _SS&amp; s)</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr.copy(s);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return *this;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }SS;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef CArray&lt;SS, SS&amp;&gt;&nbsp; ARR_SS;</P>
<P>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; void main()</P>
<P>&nbsp;&nbsp;&nbsp; { </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ARR_SS arr;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SS&nbsp; sA;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arr.Add(sA);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SS sB = arr[0];</P>
<P>&nbsp;&nbsp;&nbsp; }</P>
<P>&nbsp;&nbsp; 现在问题出来了， 编译的时候会提示， 说没有拷贝构造函数。 这个分析了下， 应该是在</P>
<P>&nbsp;&nbsp; SS sB = arr[0]; 这里实际上是调用的拷贝构造函数， 而不是重载的=操作符。有两种解决方法，</P>
<P>&nbsp;&nbsp; 一是在SS结构中定义一个拷贝构造函数</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; SS(const _SS&amp; s)</P>
<P>&nbsp;&nbsp;&nbsp; {</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *this = s;</P>
<P>&nbsp;&nbsp;&nbsp; }&nbsp;</P>
<P>&nbsp; 二是 将 SS sB = arr[0]; 改成 SS sB; sB = arr[0];</P>
<P>&nbsp; 三是 使用引用。SS&amp; sB = arr[0];</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020079267180745</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020079267180745</guid>
    <pubDate>Fri, 26 Oct 2007 19:45:03 +0800</pubDate>
    <dcterms:modified>2007-10-26T19:45:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[vc中如何使用静态库的资源]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/27693480200792211541503</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近在使用静态库的时候，发现静态库不能带资源，在使用的时候静态库查找自带资源的时候会报错，看了下MSDN：<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “If you add an rc file to a static library, you may experience difficulties due to the limitation that only one rc file may be present in a Dll or Exe. This problem may be overcome by including the library's .rc file into the parent project's .rc file.” （如果你想为一个静态库添加资源文件，你会遇到困难。因为在DLL或EXE中只能存在一个资源文件。你可以通过将静态库的资源文件加入到你自己的工程资源文件中来解决这个问题。）<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在，已经知道解决的方法了， 那么如何给工程添加一个其它资源文件呢？这个就是我下面要讲到的。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先：选择 view&nbsp; ——&gt; Resource Includes </P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://img.blog.163.com/photo/Y-knHreasyj2OPqiYM3Z1w==/3699425618908383299.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/Y-knHreasyj2OPqiYM3Z1w==/3699425618908383299.jpg"></A></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Resource Includes对话框中，在Read-only symbol directives中添加资源头文件，在Compile-time directives中添加资源文件</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://img.blog.163.com/photo/o-xtO1gQ21LssEeu8n-xbw==/3699425618908383298.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/o-xtO1gQ21LssEeu8n-xbw==/3699425618908383298.jpg"></A>&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 再就是添加导入的资源文件目录，因为资源文件中一般是使用的相对路径。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Project ——&gt; Settings， 选择Project Settings对话框中的Resources， 在Additional resource Include directories中添加导入的资源文件目录。</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A href="http://img.blog.163.com/photo/08ncP73UiV0sJrp0R27Bvw==/1483373127265539206.jpg" target=_blank><IMG src="http://img.blog.163.com/photo/08ncP73UiV0sJrp0R27Bvw==/1483373127265539206.jpg"></A></P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好的， 现在再编译着试试看， 在静态库使用自身资源的时候，是不是不会再报错了呢！～<BR></P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/27693480200792211541503</comments>
    <slash:comments>3</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/27693480200792211541503</guid>
    <pubDate>Mon, 22 Oct 2007 11:05:41 +0800</pubDate>
    <dcterms:modified>2007-10-22T11:05:41+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[为vc工程添加Unicode Debug和Unicode Release     ]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/27693480200799112658267</link>
    <description><![CDATA[<div><P>转自：<A href="http://blog.csdn.net/djhdu/archive/2004/11/08/171766.aspx">http://blog.csdn.net/djhdu/archive/2004/11/08/171766.aspx</A></P>
<P>通过使用unicode编译，软件可以适应多种情况，如何在自己的工程中添加这两种编译方式呢？下面是一个简单的步骤</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、新建一个工程；<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、选择“Build-&gt;Configurations”菜单<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、点击“Add”按钮，添加“Unicode Debug”-拷贝“win32 Debug”配置<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 添加“Unicode Release”-拷贝“win32 Release”配置&nbsp;，然后点击“OK”<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、选择“Project-&gt;Setting”菜单<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5、切换到“General ”TAB页<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;6、修改“Win32 Unicode Debug”的Intermediate Files和Output Files为DebugU&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7、修改“Win32 Unicode Release”的Intermediate Files和Output Files为ReleaseU&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8、切换到“C++&nbsp;”&nbsp;Tab页<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9、从下拉列表框中选择“Preprocessor”<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10、为“Win32 Unicode Debug”和“Win32 Unicode Release”分别添加_UNICODE和UNICODE</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<FONT color=#ff0000>11、 切换到“Link&nbsp;”Tab页</FONT></P>
<P><FONT color=#ff0000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 12、选择Output,&nbsp; 再在Entry-point symbol中填入wWinMainCRTStartup, 即可</FONT></P>
<P><FONT color=#ff0000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><FONT color=#0000ff size=2>（</FONT></P>
<P><FONT color=#0000ff size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这步很重要， 要不然，你编译的时候会报错。</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT color=#0000ff size=2>&nbsp;&nbsp; 程序入口设置错误, 提示:</FONT></P>
<P style="TEXT-INDENT: 2em"><FONT color=#0000ff size=2>&nbsp;&nbsp; msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved external symbol </FONT><A href="mailto:_WinMain@16"><FONT color=#0000ff size=2>_WinMain@16</FONT></A></P>
<P style="TEXT-INDENT: 2em"><FONT color=#0000ff><FONT size=2>&nbsp; 通常, MFC项目的程序入口函数是WinMain, 如果编译项目的Unicode版本, </FONT></FONT></P>
<P style="TEXT-INDENT: 2em"><FONT color=#0000ff><FONT size=2>&nbsp;&nbsp; 程序入口必须改为wWinMainCRTStartup</FONT><FONT size=2>&nbsp;&nbsp;&nbsp;</FONT></FONT> </P>
<P style="TEXT-INDENT: 2em"><FONT color=#0000ff><FONT size=2>）</FONT></FONT>&nbsp;&nbsp;&nbsp;&nbsp; </P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/27693480200799112658267</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/27693480200799112658267</guid>
    <pubDate>Tue, 9 Oct 2007 11:26:58 +0800</pubDate>
    <dcterms:modified>2007-10-09T11:27:56+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[电子书下载]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/276934802007625253311</link>
    <description><![CDATA[<div><P><A href="http://realking1980.bokee.com/2646136.html">http://realking1980.bokee.com/2646136.html</A></P>
<P>超强的电子书集合！</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/276934802007625253311</comments>
    <slash:comments>9</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/276934802007625253311</guid>
    <pubDate>Mon, 2 Jul 2007 17:02:53 +0800</pubDate>
    <dcterms:modified>2007-07-02T17:02:53+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[让vc6和最新的msdn集成]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020076214258659</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;原文地址：&nbsp;<A href="http://www.codeproject.com/macro/VSNetHelp.asp">http://www.codeproject.com/macro/VSNetHelp.asp</A></P>
<P>&nbsp;&nbsp; 让vc6中按F1，可以使其跟MSDN2005关联起来。 原文中代码是与MSDN2003关联， 只要做少量修改就可以关联2005.</P>
<H2>Introduction</H2>
<P>After Oct. 2001, you cannot get help by pressing F1 in VC6 with latest MSDN. Microsoft has changed the help format from CHM to document explorer.</P>
<UL type=square>
<LI><I>Is it possible to use the latest MSDN in VC6?</I> 
</LI><LI><I>The answer is <B>YES</B>!</I> </LI></UL>
<H2>Details</H2>
<P>First, we must know how VC6 brings up the help after you press F1. This is easy if you have a debugger such as Soft-ICE.</P>
<P>If you don't install MSDN, after you press F1, VC6 will popup a message box which says you haven't installed MSDN. Set a breakpoint at <CODE>MessageBox</CODE>. Press F1 and the debugger will popup. Look at the stack. You will see this function was called from "<I>C:\Program Files\Common Files\Microsoft Shared\VS98\vshelp.dll</I>".</P>
<P>Then we use Dependency Walker ("depends" in Visual Studio Tools) to see what functions are exported. We will see <CODE>DllRegisterServer</CODE> and <CODE>DllUnregisterServer</CODE>. It's obviously a COM.</P>
<P>Use VC6 to create a simple console project. Add the following line to your <I>.cpp</I> file.</P><PRE><SPAN>#import "C:\Program Files\Common Files\Microsoft Shared\VS98\vshelp.dll"</SPAN></PRE>
<P>And build your project. Open the <I>Debug</I> directory, and you will find "<I>vshelp.tlh</I>" and "<I>vshelp.tli</I>". Open "<I>vshelp.tlh</I>", you will see:</P><PRE><SPAN>struct</SPAN> __declspec(uuid(<SPAN>"854d7ac0-bc3d-11d0-b421-00a0c90f9dc4"</SPAN>))
    HRESULT ALinkSearch (
        LPWSTR pszALink,
        <SPAN>long</SPAN> dwFlags,
        <SPAN>long</SPAN> dwReserved );
    ULONG (STDMETHODCALLTYPE *AddRef)(IUnknown * This);
    ULONG (STDMETHODCALLTYPE *Release)(IUnknown * This);
    HRESULT (STDMETHODCALLTYPE *KeywordSearch)(IUnknown * This, 
      LPWSTR pszKeyword, <SPAN>long</SPAN> dwFlags, <SPAN>long</SPAN> dwReserved);
};

<SPAN>struct</SPAN> _IVsHelpSystem
{
    <SPAN>struct</SPAN> _IVsHelpSystemVtbl *lpVtbl;
};</PRE>
<P>What we need to do now is create an instance of this COM. And we will get the address of the table. Now we need to know how to bring up the help of the latest MSDN. It seems it's not documented. It's also a COM.</P>
<P>Add the following line to your <I>.cpp</I> file. You will get the COM definition.</P><PRE><SPAN>#import "C:\Program Files\Common Files\Microsoft Shared\MSEnv\vshelp.tlb"</SPAN></PRE>
<P>In "<I>vshelp.tlh</I>",</P><PRE></PRE>
<P>Obviously, this is what we need. So in the function <CODE>KeywordSearch</CODE>, call <CODE>DisplayTopicFromF1Keyword</CODE> which will launch the latest MSDN.</P>
<P>Here is the code to hook the function <CODE>KeywordSearch</CODE>:</P><PRE>HRESULT hr =
<SPAN>if</SPAN> (SUCCEEDED(hr))
{
    HRESULT hr =
    <SPAN>if</SPAN> (SUCCEEDED(hr))
    {
        iHelp = (_IVsHelpSystem *)vc6Help.GetInterfacePtr();

        TRACE1(<SPAN>"iHelp = %x\n"</SPAN>, iHelp);
        TRACE1(<SPAN>"lpVtbl = %x\n"</SPAN>, iHelp-&gt;lpVtbl);
        TRACE1(<SPAN>"KeywordSearch = %x\n"</SPAN>, iHelp-&gt;lpVtbl-&gt;KeywordSearch);

        OldKeywordSearch = iHelp-&gt;lpVtbl-&gt;KeywordSearch;

        DWORD dwOldProtect;
        <SPAN>if</SPAN> (VirtualProtect(iHelp-&gt;lpVtbl, <SPAN>sizeof</SPAN>(
          _IVsHelpSystemVtbl), PAGE_READWRITE, &amp;dwOldProtect))
            iHelp-&gt;lpVtbl-&gt;KeywordSearch = MyKeywordSearch;
    }
}</PRE>
<P>Here is the code of <CODE>MyKeywordSearch</CODE>. In this function, we will use the help collection specified by Dependency Walker as the default help collection. If default help collection is specified, we will check if it's 'MSDN Online'. If yes, we will call <CODE>ShellExecute</CODE> to start a browser to show the help. Otherwise, we will find the help collection's filename from the registry.</P>
<DIV><IMG height=9 src="http://www.codeproject.com/images/minus.gif" width=9 preid="6"><SPAN> Collapse</SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000>//此处就是获取帮助文件的关联路径,</FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000>//首先获取 HKEY_CURRENT_USER\\<SPAN>Software\\Microsoft\\Dependency Walker\\External Help,的</SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN>//Collection值， 如果其为Online, 则使用URL中的地址，关联网上MSDN帮助</SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN>//否则, 从</SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN>//MSDN2003对应: HKEY_LOCAL_MACHINE\\<SPAN>SOFTWARE\\Microsoft\\MSDN\\7.0\\Help\\0x0409</SPAN></SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN><SPAN>//MSDN2005对应: HKEY_LOCAL_MACHINE\\<SPAN>SOFTWARE\\Microsoft\\MSDN\\8.0\\Help\\0x0804</SPAN></SPAN></SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN><SPAN><SPAN>//中, 查找名称为Collection的项, 关联其对应的Filename</SPAN></SPAN></SPAN></FONT></SPAN></DIV>
<DIV><SPAN><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><SPAN></SPAN></FONT></SPAN>HRESULT __stdcall MyKeywordSearch(IUnknown * This, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPWSTR pszKeyword, <SPAN>long</SPAN> dwFlags, <SPAN>long</SPAN> dwReserved)<BR>{<BR>&nbsp;&nbsp;&nbsp; ASSERT(theHelp != NULL);<BR><BR>&nbsp;&nbsp;&nbsp; LONG lResult;<BR>&nbsp;&nbsp;&nbsp; HKEY hKey;<BR>&nbsp;&nbsp;&nbsp; lResult = RegOpenKeyEx(HKEY_CURRENT_USER,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>"Software\\Microsoft\\Dependency Walker\\External Help"</SPAN>,<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>0</SPAN>, KEY_READ, &amp;hKey);<BR>&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR szCollection[MAX_PATH];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD cbCollection = MAX_PATH;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lResult = RegQueryValueEx(hKey, <SPAN>"Collection"</SPAN>, NULL, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, (LPBYTE)szCollection, &amp;cbCollection);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE1(<SPAN>"use collection: %s\n"</SPAN>, szCollection);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (stricmp(szCollection, <SPAN>"Online"</SPAN>) == <SPAN>0</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WCHAR szURL[<SPAN>1024</SPAN>];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwURL = <SPAN>sizeof</SPAN>(szURL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lResult = RegQueryValueExW(hKey, L<SPAN>"URL"</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, NULL, (LPBYTE)szURL, &amp;dwURL);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WCHAR *p = wcsstr(szURL, L<SPAN>"%1"</SPAN>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (p)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p[<SPAN>1</SPAN>] = L's';<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WCHAR szLink[<SPAN>1024</SPAN>];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (_snwprintf(szLink, <SPAN>sizeof</SPAN>(szLink)/<SPAN>sizeof</SPAN>(WCHAR), <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; szURL, pszKeyword) &gt; <SPAN>0</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE1(<SPAN>"use collection: %S\n"</SPAN>, szLink);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ShellExecuteW(NULL, L<SPAN>"open"</SPAN>, szLink, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, NULL, SW_SHOWNORMAL);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hKey);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>return</SPAN> S_OK;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <SPAN>/* end Online */</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>else</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY hHelp;</DIV>
<DIV><FONT style="BACKGROUND-COLOR: #c0c0c0" color=#993366>//MSDN2003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT><FONT style="BACKGROUND-COLOR: #c0c0c0" color=#993366>lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>"SOFTWARE\\Microsoft\\MSDN\\7.0\\Help\\0x0409"</SPAN>,<BR>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>0</SPAN>, KEY_READ|KEY_ENUMERATE_SUB_KEYS, &amp;hHelp);&nbsp;&nbsp; </FONT></DIV>
<DIV><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><FONT color=#993366><FONT color=#ff0000>//MSDN2005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></FONT></FONT></DIV>
<DIV><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000><FONT color=#993366><FONT color=#ff0000>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>"SOFTWARE\\Microsoft\\MSDN\\8.0\\Help\\0x0804"</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<SPAN>0</SPAN>, KEY_READ|KEY_ENUMERATE_SUB_KEYS, &amp;hHelp);</FONT>&nbsp;&nbsp;&nbsp; </FONT></FONT></DIV>
<DIV><FONT style="BACKGROUND-COLOR: #c0c0c0" color=#993366><BR></FONT>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwIndex = <SPAN>0</SPAN>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR szGuid[MAX_PATH];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>while</SPAN> (RegEnumKey(hHelp, dwIndex++, szGuid, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MAX_PATH) == ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKEY hGuid;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (RegOpenKeyEx(hHelp, szGuid, <SPAN>0</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY_READ, &amp;hGuid) != ERROR_SUCCESS)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>continue</SPAN>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR szCollection2[MAX_PATH];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD cbCollection2 = MAX_PATH;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lResult = RegQueryValueEx(hGuid, NULL, NULL, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, (LPBYTE)szCollection2, &amp;cbCollection2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS &amp;&amp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stricmp(szCollection, szCollection2) == <SPAN>0</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cbCollection2 = MAX_PATH;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lResult = RegQueryValueEx(hGuid, <SPAN>"Filename"</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL, NULL, (LPBYTE)szCollection2, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;cbCollection2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>if</SPAN> (lResult == ERROR_SUCCESS &amp;&amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strnicmp(szCollection2, <SPAN>"ms-help://"</SPAN>, <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>sizeof</SPAN>(<SPAN>"ms-help://"</SPAN>)-<SPAN>1</SPAN>) == <SPAN>0</SPAN>)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TRACE1(<SPAN>"use collection: %s\n"</SPAN>, szCollection2);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; theHelp-&gt;SetCollection(szCollection2, <SPAN>""</SPAN>);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hGuid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <SPAN>break</SPAN>;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hGuid);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <SPAN>/* end RegEnumKey(hHelp) */</SPAN><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hHelp);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <SPAN>/* end not Online */</SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hKey);<BR>&nbsp;&nbsp;&nbsp; }<BR><BR>&nbsp;&nbsp;&nbsp; theHelp-&gt;SyncIndex(pszKeyword, <SPAN>1</SPAN>);<BR>&nbsp;&nbsp;&nbsp; theHelp-&gt;DisplayTopicFromF1Keyword(pszKeyword);<BR><BR>&nbsp;&nbsp;&nbsp; <SPAN>return</SPAN> S_OK;<BR>}</DIV>
<P>Easy, right?</P>
<P>There are two things you must keep in mind. First, we must declare the vc6Help in global space and release it when the program quits. This is because the <I>vshelp.dll</I> will be freed if there is no more instance. If so, then what we modified will be gone with it. Then second, we must call <CODE>VirtualProtect</CODE> to make the virtual table become writable, otherwise you cannot modify the virtual table because it's read only.</P>
<P>Sometimes, you may have a couple of help collections installed. After you press F1, it may not show the help collection you want.</P>
<H4>How to set the default help collection?</H4>
<OL>
<LI>I believe you have installed the latest Platform SDK. If you don't have one, download it from <A href="http://www.microsoft.com/msdownload/platformsdk/sdkupdate/" target=_blank>Microsoft</A>. It's free and useful. You must download and install it. 
</LI><LI>Run '<I>Depends.exe</I>' under the <I>SDK\bin</I> directory. 
</LI><LI>Select menu 'Options'-&gt;'Configure External Function Help Collection'. 
</LI><LI>Choose the help collection you want. You can even choose 'MSDN Online' and this add-in will show online help. This means you can get help without having MSDN installed. </LI></OL>
<H2>How to use it?</H2>
<P>Click VC6's menu "Tools"-&gt;"Customize"-&gt;"Add-ins and Macro Files"-&gt;"Browse". Then choose "<I>VSNetHelp.dll</I>", and click "Close".</P>
<P>Move the caret to a keyword, press F1. You got it!</P>
<P><!-- Article Ends --></P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020076214258659</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020076214258659</guid>
    <pubDate>Mon, 2 Jul 2007 13:42:58 +0800</pubDate>
    <dcterms:modified>2007-07-02T13:42:58+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[CHtmlView中如何响应复制粘贴]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020075952832497</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp;CHtmlView中不直接支持复制粘贴， 这个是需要添加代码来实现的，其实现如下：</P>
<P>主要是使用CHtmlView中的ExecWB函数，通过截取键盘响应，来分别进行操作。</P><PRE><B>void ExecWB(</B>
<B>   OLECMDID </B><SPAN>cmdID</SPAN><B>,            //执行命令ID</B>
<B>   OLECMDEXECOPT </B><SPAN>cmdexecopt</SPAN><B>,   //执行选项 </B>
<B>   VARIANT* </B><SPAN>pvaIn</SPAN><B>,            //输入参数 </B>
<B>   VARIANT* </B><SPAN>pvaOut</SPAN>              <STRONG>//输出参数</STRONG></PRE><PRE><B>);</B></PRE>
<P>BOOL CFullScreenIEView::PreTranslateMessage(MSG* pMsg) <BR>{<BR>&nbsp;// TODO: Add your specialized code here and/or call the base class</P>
<P>&nbsp;if( pMsg-&gt;message==WM_KEYDOWN )<BR>&nbsp;{<BR>&nbsp;&nbsp;BOOL&nbsp;&nbsp; bCtrl&nbsp;&nbsp; =&nbsp;&nbsp; GetAsyncKeyState(VK_CONTROL)&nbsp;&nbsp; &amp;&nbsp;&nbsp; 0x8000; <BR>&nbsp;&nbsp;if( bCtrl )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;switch( pMsg-&gt;wParam )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;case 0x41:&nbsp;&nbsp;&nbsp;//如果是ctrl + A， 全选<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecWB(OLECMDID_SELECTALL, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;</P>
<P>&nbsp;&nbsp;&nbsp;case 0x43:&nbsp;&nbsp;//如果是ctrl + C， 复制<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecWB(OLECMDID_COPY, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;</P>
<P>&nbsp;&nbsp;&nbsp;case 0x56:&nbsp;&nbsp;//如果是ctrl + P， 粘贴<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;</P>
<P>&nbsp;&nbsp;&nbsp;case 0x58:&nbsp;//如果是ctrl + X，&nbsp;剪切<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecWB(OLECMDID_CUT, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return TRUE;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;break;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;}</P>
<P>&nbsp;return CHtmlView::PreTranslateMessage(pMsg);<BR>}&nbsp; </P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020075952832497</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020075952832497</guid>
    <pubDate>Sat, 9 Jun 2007 17:28:32 +0800</pubDate>
    <dcterms:modified>2007-06-09T17:28:32+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ADO 连接 PostgreSQL]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020075453244955</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp; CString strConnString;<BR>&nbsp;strConnString.Format(_T("Provider=MSDASQL.1;Password=%s;User Properties=\"DRIVER={<FONT color=#ff0000>PostgreSQL</FONT>};DATABASE=%s;SERVER=%s;PORT=%d;UID=%s;PWD=%s;TextAsLongVarchar=0;ByteaAsLongVarBinary=1\""),&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strDatabasePassword,&nbsp; //密码<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strDatabaseUserName,&nbsp;&nbsp;//用户名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strDatabaseName,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连接数据库名称<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strIP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据库主机IP<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.lPort,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//端口， 一般为5432<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strDatabaseUserName,&nbsp;&nbsp;//用户名<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_sLoginUser.strDatabasePassword); //密码<BR>&nbsp;<BR>&nbsp;try<BR>&nbsp;{<BR>&nbsp;&nbsp;if( gspDestConn==NULL )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;gspDestConn.CreateInstance(__uuidof(Connection));<BR>&nbsp;&nbsp;&nbsp;if( gspDestConn==NULL )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;MessageBox(NULL, _T("连接数据库失败!"), _T("错误"), MB_OK|MB_ICONERROR);<BR>&nbsp;&nbsp;&nbsp;&nbsp;return FALSE;<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;gspDestConn-&gt;CursorLocation = adUseClient;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;else<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;gspDestConn-&gt;Close();<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;gspDestConn-&gt;Open(_bstr_t(strConnString),_bstr_t(m_sLoginUser.strDatabaseUserName),_bstr_t(m_sLoginUser.strDatabasePassword),adAsyncConnect); //这里必须用adAsyncConnect, 好像用&nbsp; adConnectUnspecified就会报错， 不清楚是什么原因</P>
<P>}</P>
<P>catch (_com_error &amp;e) <BR>&nbsp;{<BR>&nbsp;&nbsp;CString strMsg;<BR>&nbsp;&nbsp;strMsg.Format(_T("连接数据库失败! 错误代码: %s"), e.ErrorMessage());<BR>&nbsp;&nbsp;MessageBox(NULL, _T(strMsg), _T("错误"), MB_OK|MB_ICONERROR);<BR>&nbsp;&nbsp;return FALSE;<BR>&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020075453244955</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020075453244955</guid>
    <pubDate>Mon, 4 Jun 2007 17:32:44 +0800</pubDate>
    <dcterms:modified>2007-06-04T17:33:32+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Access中的OLE字段的使用方法]]></title>	
    <link>http://blog.163.com/long_lh/blog/static/2769348020075451341632</link>
    <description><![CDATA[<div><P>&nbsp;&nbsp;&nbsp;&nbsp; 想将一个文件存到Access数据库里面， 按我的想法就是把文件拆分成N个字符串，</P>
<P>再将这些字符串存储到数据库里面， 实现以后， 发现了一个问题， 就是在入库的时候，</P>
<P>速度特别的慢， 好像是在拆分入库的时候， 占取了很多时间。</P>
<P>&nbsp;&nbsp;&nbsp; 后来问了下朋友， 说Access里面有一个OLE字段， 可以用来存储二进制流， 那么怎</P>
<P>么使用OLE呢？&nbsp; 在网上面， 找到了一些方法， 选取了一种， 感觉又简单， 又快捷，将</P>
<P>实现代码， 贴下， 供参考：</P>
<P>入库代码：</P>
<P>&nbsp; _StreamPtr spStream = NULL;&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp;_variant_t varBLOB;<BR>&nbsp;&nbsp;&nbsp;VariantClear(&amp;varBLOB);<BR>&nbsp;&nbsp;&nbsp;spStream.CreateInstance(__uuidof(Stream)); //创建一个流<BR>&nbsp;&nbsp;&nbsp;if( spStream!=NULL )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;put_Type(adTypeBinary);&nbsp; //设置流的类型<BR>&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp; varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR);&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;Open(varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());&nbsp;//必须在LoadFromFile以前， Open它<BR>&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;LoadFromFile(_bstr_t(_T(strFilePath)));&nbsp;&nbsp;//从文件加载数据流<BR>&nbsp;&nbsp;&nbsp;&nbsp;varBLOB = spStream-&gt;Read(adReadAll);&nbsp;&nbsp;//获取数据流<BR>&nbsp;&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;&nbsp;spDestRs-&gt;GetFieldsAdo()-&gt;GetItem(_bstr_t(_T("content")))-&gt;put_Value(varBLOB); //入库</P>
<P>&nbsp;</P>
<P>出库代码：</P>
<P>&nbsp;&nbsp; _StreamPtr spStream = NULL;<BR><BR>&nbsp;&nbsp;&nbsp;spStream.CreateInstance(__uuidof(Stream));</P>
<P>&nbsp;&nbsp;&nbsp;if (spDestRs-&gt;AbsolutePosition!=adPosEOF &amp;&amp; spDestRs-&gt;AbsolutePosition!=adPosBOF)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;_variant_t vValue;<BR>&nbsp;&nbsp;&nbsp;&nbsp;spDestRs-&gt;GetFieldsAdo()-&gt;GetItem(_bstr_t(_T("content")))-&gt;get_Value(&amp;vValue);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( spStream!=NULL )<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;put_Type(adTypeBinary);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_variant_t&nbsp; varOptional(DISP_E_PARAMNOTFOUND, VT_ERROR); <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;Open(varOptional, adModeUnknown, adOpenStreamUnspecified, _bstr_t(), _bstr_t());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;Write(vValue);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;SaveToFile(_bstr_t(_T(strFilePath)), adSaveCreateOverWrite);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;if( spStream!=NULL )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spStream-&gt;Close();<BR>&nbsp;&nbsp;&nbsp;}</P></div>]]></description>
	    <author><![CDATA[飘忽不定]]></author>
	    <comments>http://blog.163.com/long_lh/blog/static/2769348020075451341632</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://blog.163.com/long_lh/blog/static/2769348020075451341632</guid>
    <pubDate>Mon, 4 Jun 2007 17:25:30 +0800</pubDate>
    <dcterms:modified>2007-06-04T17:26:50+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[web:  友情链接]]></title>	
    <link>http://blog.163.com/long_lh/prevResource.do?selectId=fks_087068085085081071081085074065083080088064080094086</link>
    <description><![CDATA[<ul>
	<li>
	<a href="http://blog.163.com/long_lx" target="_blank">大哥</a>
	</li>

	<li>
	<a href="http://blog.163.com/snowflyzhou" target="_blank">白天蓝天</a>
	</li>

	<li>
	<a href="http://www.51testing.com/?48580" target="_blank">guxingyun</a>
	</li>

	<li>
	<a href="http://sunny0927.blog.163.com/" target="_blank">妖 府</a>
	</li>

	<li>
	<a href="http://blog.sina.com.cn/youguozi" target="_blank">晃晃悠悠</a>
	</li>

	<li>
	<a href="http://www.blogjava.net/crespo9907/" target="_blank">吾将上下而求索</a>
	</li>

	<li>
	<a href="http://www.blogjava.net/ilovezmh" target="_blank">乖，别哭的薄壳</a>
	</li>

	<li>
	<a href="http://blog.sina.com.cn/zhaojiaxiaobao" target="_blank">赵家小宝的窝窝</a>
	</li>

	<li>
	<a href="http://hexun.com/lacertavivi/default.html" target="_blank">手中的气泡</a>
	</li>
</ul>]]></description>
	    <author><![CDATA[long_lh]]></author>
    <guid isPermaLink="false">collection/static/fks_087068085085081071081085074065083080088064080094086</guid>
    <pubDate>Wed, 15 Aug 2007 14:33:48 +0800</pubDate>
    <dcterms:modified>2007-08-15T14:33:48+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[飘忽不定关注的博友]]></title>	
    <link>http://blog.163.com/long_lh/friends</link>
    <description><![CDATA[<div>
			<a href="http://snowflyzhou.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/4qluYhnhH8JaxUx5CeijWw==/1705456883890011128.jpg" border="0" />白云蓝天</a>
</div>]]></description>
    <guid isPermaLink="true">http://blog.163.com/long_lh/friends</guid>
    <pubDate>Tue, 1 Jan 2008 00:00:00 +0800</pubDate>
    <dcterms:modified>2008-01-01T00:00:00+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>