<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<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>shamantou blog site</title><link>http://ooplab.org/</link><description></description><generator>RainbowSoft Studio Z-Blog 1.8 Arwen Build 81206</generator><language>zh-CN</language><copyright>Copyright 2006-2009 | ooplab.org | shamantou@gmail.com | 沪ICP备08011244号 | Some Rights Reserved. </copyright><pubDate>Thu, 08 Jul 2010 15:59:52 +0800</pubDate><item><title>Hight resolution timer</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/701.html</link><pubDate>Thu, 08 Jul 2010 15:57:33 +0800</pubDate><guid>http://ooplab.org/post/701.html</guid><description><![CDATA[<p><span style="font-size: 10pt; color: blue">#pragma</span><span style="font-size: 10pt"> <span style="color: blue">once</span></span></p><div align="left"><span style="font-size: 10pt; color: blue">#include</span><span style="font-size: 10pt"> <span style="color: maroon">&quot;Mmsystem.h&quot;</span></span></div><div align="left">&nbsp;</div><div align="left"><span style="font-size: 10pt; color: blue">extern</span><span style="font-size: 10pt"> <span style="color: blue">void</span> <span style="color: black">PASCAL</span> <span style="color: black">OnTimer</span>(<span style="color: black">UINT</span> <span style="color: black">uTimerID</span>, <span style="color: black">UINT</span> <span style="color: black">uMsg</span>, <span style="color: black">DWORD_PTR</span> <span style="color: black">dwUser</span>, <span style="color: black">DWORD_PTR</span> <span style="color: black">dw1</span>, <span style="color: black">DWORD_PTR</span> <span style="color: black">dw2</span>);</span></div><div align="left">&nbsp;</div><div align="left"><span style="font-size: 10pt; color: blue">namespace</span><span style="font-size: 10pt"> <span style="color: black">Utility</span></span></div><div align="left"><span style="font-size: 10pt">{</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">class</span> <span style="color: black">MyTimer</span></span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">private</span>:</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">MMRESULT</span> <span style="color: black">wTimerID</span>;</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span>:</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">MyTimer</span>(<span style="color: blue">void</span>)</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span>:</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~<span style="color: black">MyTimer</span>(<span style="color: blue">void</span>)</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">timeKillEvent</span>(<span style="color: black">wTimerID</span>);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">timeEndPeriod</span>(1);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; <span style="color: blue">public</span>:</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">bool</span> <span style="color: black">CreateTimer</span>()</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">TIMECAPS</span> <span style="color: black">tc</span>;</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">UINT</span> <span style="color: black">wTimerRes</span>;</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(<span style="color: black">timeGetDevCaps</span>(&amp;<span style="color: black">tc</span>,<span style="color: blue">sizeof</span>(<span style="color: black">TIMECAPS</span>))!=<span style="color: black">TIMERR_NOERROR</span>)</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">ASSERT</span>(0);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">return</span> 0;</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">wTimerRes</span>=<span style="color: black">min</span>(<span style="color: black">max</span>(<span style="color: black">tc</span>.<span style="color: black">wPeriodMin</span>,1),<span style="color: black">tc</span>.<span style="color: black">wPeriodMax</span>);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">timeBeginPeriod</span>(<span style="color: black">wTimerRes</span>);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">wTimerID</span>=<span style="color: black">timeSetEvent</span>(1,1,(<span style="color: black">LPTIMECALLBACK</span>)<span style="color: black">OnTimer</span>,<span style="color: black">NULL</span>,<span style="color: black">TIME_PERIODIC</span>);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue">if</span>(<span style="color: black">wTimerID</span>==<span style="color: black">NULL</span>) </span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black">ASSERT</span>(0);</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></div><div align="left">&nbsp;</div><div align="left"><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp; };</span></div><div><span style="font-size: 10pt">}</span></div><p>&nbsp;</p><p>[download here] <a href="http://ooplab.org/upload/2010/7/MyTimer.h" target="_blank">MyTimer.h</a></p>]]></description><category>Industry</category><comments>http://ooplab.org/post/701.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=701</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=701&amp;key=600881f5</trackback:ping></item><item><title>STL中Set介绍【转】</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/700.html</link><pubDate>Fri, 25 Jun 2010 17:38:39 +0800</pubDate><guid>http://ooplab.org/post/700.html</guid><description><![CDATA[<div class="postcontent">这是微软帮助文档中对集合（set）的解释： &ldquo;描述了一个控制变长元素序列的对象（注：set中的key和value是Key类型的，而map中的key和value是一个pair结构中的两个分 量）的模板类，每一个元素包含了一个排序键（sort key）和一个值(value)。对这个序列可以进行查找、插入、删除序列中的任意一个元素，而完成这些操作的时间同这个序列中元素个数的对数成比例关 系，并且当游标指向一个已删除的元素时，删除操作无效。&rdquo;<br />而一个经过更正的和更加实际的定义应该是：一个集合（set）是一个容器，它其中所包含的元素的值是唯一的。这在收集一个数据的具体值的时候是有用的。集 合中的元素按一定的顺序排列，并被作为集合中的实例。如果你需要一个键/值对（pair）来存储数据，map是一个更好的选择。一个集合通过一个链表来组 织，在插入操作和删除操作上比向量（vector）快，但查找或添加末尾的元素时会有些慢。<br /><br />下面是一个例子： <br /><br />//程序：set演示<br />//目的：理解STL中的集合（set）<br /><br />#include ＜string＞<br />#include ＜set＞<br />#include ＜iostream＞<br />using namespace std;<br /><br />int main(int argc, char* argv[])<br />{<br />set ＜string＞ strset;<br />set ＜string＞::iterator si;<br />strset.insert(&quot;cantaloupes&quot;);<br />strset.insert(&quot;apple&quot;);<br />strset.insert(&quot;orange&quot;);<br />strset.insert(&quot;banana&quot;);<br />strset.insert(&quot;grapes&quot;);<br />strset.insert(&quot;grapes&quot;); <br />for (si=strset.begin(); si!=strset.end(); si++) <br />{ cout ＜＜ *si ＜＜ &quot; &quot;; }<br />cout ＜＜ endl;<br />return 0;<br />}<br /><br />// 输出： apple banana cantaloupes grapes orange<br />//注意：输出的集合中的元素是按字母大小顺序排列的，而且每个值都不重复。 <br /><br />如果你感兴趣的话，你可以将输出循环用下面的代码替换：<br /><br />copy(strset.begin(), strset.end(), ostream_iterator＜string＞(cout, &quot; &quot;)); <br /><br />.集合（set）虽然更强大，但我个人认为它有些不清晰的地方而且更容易出错，如果你明白了这一点，你会知道用集合（set）可以做什么。<br /><br />所有的STL容器<br /><br />容器（Container）的概念的出现早于模板（template），它原本是一个计算机科学领域中的一个重要概念，但在这里，它的概念和STL混合在一起了。下面是在STL中出现的7种容器：<br /><br /><span style="background-color: #ffff99">vector</span>（向量）&mdash;&mdash;STL中标准而安全的数组。只能在vector 的&ldquo;前面&rdquo;增加数据。<br /><br /><span style="background-color: #ffff99">deque</span>（双端队列double-ended queue）&mdash;&mdash;在功能上和vector相似，但是可以在前后两端向其中添加数据。 <br /><br /><span style="background-color: #ffff99">list</span>（列表）&mdash;&mdash;游标一次只可以移动一步。如果你对链表已经很熟悉，那么STL中的list则是一个双向链表（每个节点有指向前驱和指向后继的两个指针）。<br /><br /><span style="background-color: #ffff99">set</span>（集合）&mdash;&mdash;包含了<span style="background-color: #ccffff"><span style="color: #333399">经过排序了的数据</span></span>，这些数据的值(value)必须是唯一的。<br /><br /><span style="background-color: #ffff99">map</span>（映射）&mdash;&mdash;经过排序了的二元组的集合，map中的每个元素都是由两个值组成，其中的key（键值，一个map中的键值必须是唯一的）是在排序 或搜索时使用，它的值可以在容器中重新获取；而另一个值是该元素关联的数值。比如，除了可以ar[43] = &quot;overripe&quot;这样找到一个数据，map还可以通过ar[&quot;banana&quot;] = &quot;overripe&quot;这样的方法找到一个数据。如果你想获得其中的元素信息，通过输入元素的全名就可以轻松实现。<br /><br /><span style="background-color: #ffff99">multiset</span>（多重集）&mdash;&mdash;和集合（set）相似，然而其中的值不要求必须是唯一的（即可以有重复）。<br /><br /><span style="background-color: #ffff99">multimap</span>（多重映射）&mdash;&mdash;和映射（map）相似，然而其中的键值不要求必须是唯一的（即可以有重复）。<br />注意：如果你阅读微软的帮助文档，你会遇到对每种容器的效率的陈述。比如：log(n*n)的插入时间。除非你要处理大量的数据，否则这些时间的影响是可 以忽略的。如果你发现你的程序有明显的滞后感或者需要处理时间攸关（time critical）的事情，你可以去了解更多有关各种容器运行效率的话题。<br /><br />怎样在一个map中使用类？<br /><br />Map是一个通过key（键）来获得value(值)的模板类。<br /><br />另一个问题是你希望在map中使用自己的类而不是已有的数据类型，比如现在已经用过的int。建立一个&ldquo;为模板准备的（template-ready）&rdquo;类，你<u>必须确保在该类中包含一些成员函数和重载操作符</u>。下面的一些成员是必须的：<br /><br /><span style="background-color: #cc99ff">缺省的构造函数（通常为空）<br /></span><br /><span style="background-color: #cc99ff">拷贝构造函数<br /></span><br /><span style="background-color: #cc99ff">重载的&rdquo;=&rdquo;运算符<br /></span><br />你应该重载尽可能多的运算符来满足特定模板的需要，比如，如果你想定义一个类作为 map中的键（key），你必须重载相关的运算符。但在这里不对重载运算符做过多讨论了。<br /><br />//程序：映射自定义的类。<br />//目的：说明在map中怎样使用自定义的类。<br /><br />#include ＜string＞<br />#include ＜iostream＞<br />#include ＜vector＞<br />#include ＜map＞<br />using namespace std;<br /><br />class CStudent<br />{<br />public :<br />int nStudentID;<br />int nAge;<br />public :<br />//缺省构造函数&mdash;&mdash;通常为空<br />CStudent() { }<br />// 完整的构造函数<br />CStudent(int nSID, int nA) { nStudentID=nSID; nAge=nA; }<br />//拷贝构造函数<br />CStudent(const CStudent&amp; ob) <br />{ <br />nStudentID=ob.nStudentID; nAge=ob.nAge; }<br />// 重载&ldquo;=&rdquo;<br />void operator = (const CStudent&amp; ob) <br />{<br />nStudentID=ob.nStudentID; nAge=ob.nAge; <br />}<br />};<br /><br />int main(int argc, char* argv[])<br />{<br />map ＜string, CStudent＞ mapStudent;<br /><br />mapStudent[&quot;Joe Lennon&quot;] = CStudent(103547, 22);<br />mapStudent[&quot;Phil McCartney&quot;] = CStudent(100723, 22);<br />mapStudent[&quot;Raoul Starr&quot;] = CStudent(107350, 24);<br />mapStudent[&quot;Gordon Hamilton&quot;] = CStudent(102330, 22);<br /><br />// 通过姓名来访问Cstudent类中的成员<br />cout ＜＜ &quot;The Student number for Joe Lennon is &quot; ＜＜ <br />(mapStudent[&quot;Joe Lennon&quot;].nStudentID) ＜＜ endl;<br /><br />return 0;<br />} <br /><br />TYPEDEF<br /><br />如果你喜欢使用typedef关键字，下面是个例子：<br /><br />typedef set ＜int＞ SET_INT;<br />typedef SET_INT::iterator SET_INT_ITER <br /><br />编写代码的一个习惯就是使用大写字母和下划线来命名数据类型。<br /><br />ANSI / ISO字符串<br /><br />ANSI/ISO字符串在STL容器中使用得很普遍。这是标准的字符串类，并得到了广泛地提倡，然而在缺乏格式声明的情况下就会出问题。你必须使用&ldquo;＜＜&rdquo;和输入输出流（iostream）代码（如dec, width等）将字符串串联起来。<br /><br />可在必要的时候使用c_str()来重新获得字符指针。</div>]]></description><category>C++</category><comments>http://ooplab.org/post/700.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=700</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=700&amp;key=6d9050e6</trackback:ping></item><item><title>MFC，COM，COM+，ATL</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/699.html</link><pubDate>Wed, 03 Mar 2010 16:16:41 +0800</pubDate><guid>http://ooplab.org/post/699.html</guid><description><![CDATA[<p><span style="color: #000000">1st read at Mar,03,2010</span></p><p><font color="#ff0000">一、什么是MFC<br /><br /></font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是WinOS下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个输助软件开发包,MFC作为与VC++血肉相连的部分(注意C++和VC++的区别:C++是一种程序设计语言,是一种大家都承认的软件编制的通用规范,而VC++只是一个编译器,或者说是一种编译器+源程序编辑器的IDE,WS,PlatForm,这跟Pascal和Dephi的关系一个道理,Pascal是Dephi的语言基础,Dephi使用Pascal规范来进行Win下应用程序的开发和编译,却不同于Basic语言和VB的关系,Basic语言在VB开发出来被应用的年代已经成了Basic语言的新规范,VB新加的Basic语言要素,如面对对象程序设计的要素,是一种性质上的飞跃,使VB既是一个IDE,又成长成一个新的程序设计语言),MFC同BC++集成的VCL一样是一个非外挂式的软件包,类库,只不过MFC类是微软为VC++专配的.. <br /><span style="background-color: #ffff99">MFC是Win API与C++的结合,</span>API,即微软提供的WinOS下应用程序的编程语言接口,是一种软件编程的规范,但不是一种程序开发语言本身,可以允许用户使用各种各样的第三方(如我是一方,微软是一方,Borland就是第三方)的编程语言来进行对Win OS下应用程序的开发,使这些被开发出来的应用程序能在WinOS下运行,比如VB,VC++,Java,Dehpi编程语言函数本质上全部源于API,因此用它们开发出来的应用程序都能工作在WinOS的消息机制和绘图里,遵守WinOS作为一个操作系统的内部实现,这其实也是一种必要<span style="background-color: #ffff99">,微软如果不提供API,这个世上对Win编程的工作就不会存在</span>,微软的产品就会迅速从时尚变成垃圾,上面说到MFC是微软对API函数的专用C++封装,这种结合一方面让用户使用微软的专业C++ SDK来进行Win下应用程序的开发变得容易,因为MFC是对API的封装,微软做了大量的工作,隐藏了好多内节程序开发人员在Win下用C++ &amp; MFC编制软件时的大量内节,如应用程序实现消息的处理,设备环境绘图,这种结合是以方便为目的的,必定要付出一定代价(这是微软的一向作风),因此就造成了MFC对类封装中的一定程度的的冗余和迂回,但这是可以接受的.. <br />最后要明白<span style="background-color: #ffff99">MFC不只是一个功能单纯的界面开发系统,它提供的类绝大部分用来进行界面开发</span>,关联一个窗口的动作,但它提供的类中有好多类不与一个窗口关联,即类的作用不是一个界面类,不实现对一个窗口对象的控制(如创建,销毁),而是一些在WinOS(用MFC编写的程序绝大部分都在WinOS中运行)中实现内部处理的类,如数据库的管理类等,学习中最应花费时间的是消息和设备环境,对C++和MFC的学习中最难的部分是指针,C++面向对像程序设计的其它部分,如数据类型,流程控制都不难,建议学习数据结构C++版.. <br /><br />&nbsp;</p><p><span style="color: red"><br />二、什么是COM<br /><br /></span><br /><br />----COM的发展及其局限性</p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓COM（Componet Object Model，组件对象模型），是一种说明如何建立可动态互变组件的规范，此规范提供了为保证能够互操作，客户和组件应遵循的一些二进制和网络标准。通过这种标准将可以在任意两个组件之间进行通信而不用考虑其所处的操作环境是否相同、使用的开发语言是否一致以及是否运行于同一台计算机。<br />COM的优点？<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先：用户一般希望能够定制所用的应用程序，而组件技术从本质上讲就是可被定制的，因而用户可以用更能满足他们需要的某个组件来替换原来的那个。其次，由于组件是相对应用程序独立的部件，我们可以在不同的程序中使用同一个组件而不会产生任何问题，软件的可重用性将大大的得到增强。第三，随着网络带宽及其重要性的提高，分布式网络应用程序毫无疑问的成为软件市场上越来越重要的买点。组件价构可以使得开发这类应用程序的过程得以简化。<br /><br /><span style="color: red">什么是COM+？<br /><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; M+并不是COM的简单升级，COM+的底层结构仍然以COM为基础，它几乎包容了COM的所有内容，<span style="background-color: #ffff00">COM+综合了COM、DCOM和MTS这些技术要素</span>，它把COM组件软件提升到应用层而不再是底层的软件结构，它通过操作系统的各种支持，使组件对象模型建立在应用层上，把所有组件的底层细节留给操作系统，因此，COM+与操作系统的结合更加紧密。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COM+不再局限于COM的组件技术，它更加注重于分布式网络应用的设计和实现。COM+继承了COM几乎全部的优势，同时又避免了COM实现方面的一些不足，把COM、DCOM和MTS的编程模型结合起来，继承了它们的绝大多数特性，在原有的特性上增加了新的功能。</span></p><p><span style="color: #000000"><span style="color: #ff0000"><span style="color: #000000">&nbsp;COM+的新的优点?</span><br /></span></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下列出COM+的几个主要特性：</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;COM+不仅继承了COM所有的优点，而且还增加了一些服务，比如队列服务、负载平衡、内存数据库、事件服务等。</span></p><p><span style="color: #000000">　　 队列服务对于分布式应用非常有意义，特别是在现在网络速度很慢的情况下，这种机制可以保证应用系统能够可靠地运行。在应用系统包含大量节点但服务器又繁忙的情况下，客户应用程序可以把它们的请求放到队列中，当服务器负载比较轻的时候再处理这些请求；</span></p><p><span style="color: #000000">　　 又如COM+提供了负载平衡服务，它可以实现动态负载平衡，而且COM+应用程序的负载平衡特性并不需要编写代码来支持，客户程序和组件程序都可以按通常的方式实现。获得负载平衡特性并不是用程序设计的方式来实现的，而是通过配置实现分布式应用程序的负载平衡，如上所讲的队列服务，其实也反映了一种负载平衡。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; (1) 真正的异步通讯。COM+底层提供了队列组件服务，这使客户和组件有可能在不同的时间点上协同工作，COM+应用无须增加代码就可以获得这样的特性。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; (2) 事件服务。新的事件机制使事件源和事件接收方实现事件功能更加灵活，利用系统服务简化了事件模型，避免了COM可连接对象机制的琐碎细节。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; (3) 可伸缩性。COM+的可伸缩性来源于多个方面，动态负载平衡以及内存数据库、对象池等系统服务都为COM+的可伸缩性提供了技术基础，COM+的可伸缩性原理上与多层结构的可伸缩特性一致。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; (4) 可管理和可配置性。管理和配置是应用系统开发完成后的行为，在软件维护成本不断增加的今天，COM+应用将有助于软件厂商和用户减少这方面的投入。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp; (5) 易于开发。COM+应用开发的复杂性和难易程度将决定COM+的成功与否，虽然COM+开发模型比以前的COM组件开发更为简化，但真正提高开发效率仍需要借助于一些优秀的开发工具。</span></p><p><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; COM+标志着Microsoft的组件技术达到了一个新的高度，它不再局限于一台机器上的桌面系统，它把目标指向了更为广阔的企业内部网，甚至Internet国际互连网络。COM+与多层结构模型以及Windows操作系统为企业应用或Web应用提供了一套完整的解决方案。<br /></span>&nbsp;<br />&nbsp;<br />三、什么是ATL</p><p>----自从1993年Microsoft首次公布了COM技术以后，Windows平台上的开发模式发生了巨大的变化，以COM为基础的一系列软件组件化技术将Windows编程带入了组件化时代。广大开发人员在为COM带来的软件组件化趋势欢欣鼓舞的同时，对于COM开发技术的难度和烦琐的细节也感到极其的不便。COM编程一度被视为一种高不可攀的技术，令人望而却步。开发人员希望能够有一种方便快捷的COM开发工具，提高开发效率，更好地利用这项技术。</p><p>----针对这种情况，Microsoft公司在推出COMSDK以后，为简化COM编程，提高开发效率，采取了许多方案，特别是在MFC（MicrosoftFoundationClass）中加入了对COM和OLE的支持。但是随着Internet的发展，分布式的组件技术要求COM组件能够在网络上传输，而又尽量节约宝贵的网络带宽资源。采用MFC开发的COM组件由于种种限制不能很好地满足这种需求，因此Microsoft在1995年又推出了一种全新的COM开发工具&mdash;&mdash;ATL。</p><p>----<span style="background-color: #ccffcc">ATL是ActiveXTemplateLibrary的缩写</span>，它是一套C++模板库。使用ATL能够快速地开发出高效、简洁的代码，同时对COM组件的开发提供最大限度的代码自动生成以及可视化支持。<span style="color: #ff0000">为了方便使用，从MicrosoftVisualC++5.0版本开始，Microsoft把ATL集成到VisualC++开发环境中。</span>1998年9月推出的VisualStudio6.0集成了ATL3.0版本。目前，ATL已经成为Microsoft标准开发工具中的一个重要成员，日益受到C++开发人员的重视。</p><p>----ATL究竟给开发人员带来了什么样的益处呢？这要先从ATL产生以前的COM开发方式说起。</p><p>----在ATL产生以前，开发COM组件的方法主要有两种：<span style="background-color: #cc99ff">一是使用COMSDK直接开发COM组件</span>，<span style="background-color: #cc99ff">另一种方式是通过MFC提供的COM支持来实现</span>。</p><p>----直接使用COMSDK开发COM组件是最基本也是最灵活的方式。通过使用Microsoft提供的开发包，我们可以直接编写COM程序。但是，这种开发方式的难度和工作量都很大，一方面，要求开发者对于COM的技术原理具有比较深入的了解（虽然对技术本身的深刻理解对使用任何一种工具都是非常有益的，但对于COM这样一整套复杂的技术而言，在短时间内完全掌握是很难的）；另一方面，直接使用COMSDK要求开发人员自己去实现COM应用的每一个细节，完成大量的重复性工作。这样做的结果是，不仅降低了工作效率，同时也使开发人员不得不把许多精力投入到与应用需求本身无关的技术细节中。虽然这种开发方式对于某些特殊的应用很有必要，但这种编程方式并不符合组件化程序设计方法所倡导的可重用性，因此，直接采用COMSDK不是一种理想的开发方式。</p><p>----使用MFC提供的COM支持开发COM应用可以说在使用COMSDK基础上提高了自动化程度，缩短了开发时间。MFC采用面向对象的方式将COM的基本功能封装在若干MFC的C++类中，开发者通过继承这些类得到COM支持功能。为了使派生类方便地获得COM对象的各种特性，MFC中有许多预定义宏，这些宏的功能主要是实现COM接口的定义和对象的注册等通常在COM对象中要用到的功能。开发者可以使用这些宏来定制COM对象的特性。</p><p>----另外，在MFC中还提供对Automation和ActiveXControl的支持，对于这两个方面，VisualC++也提供了相应的AppWizard和ClassWizard支持，这种可视化的工具更加方便了COM应用的开发。</p><p>----MFC对COM和OLE的支持确实比手工编写COM程序有了很大的进步。但是MFC对COM的支持还不够完善和彻底，例如对COM接口定义的IDL语言，MFC并没有任何支持，此外对于近些年来COM和ActiveX技术的新发展MFC也没有提供灵活的支持。这是由MFC设计的基本出发点决定的。MFC被设计成对Windows平台编程开发的面向对象的封装，自然要涉及Windows编程的方方面面，COM作为Windows平台编程开发的一个部分也得到MFC的支持，但是MFC对COM的支持是以其全局目标为出发点的，因此对COM的支持必然要服从其全局目标。从这个方面而言，MFC对COM的支持不能很好地满足开发者的要求。</p><p>----随着Internet技术的发展，Microsoft将ActiveX技术作为其网络战略的一个重要组成部分大力推广，然而使用MFC开发的ActiveXControl，代码冗余量大，即所谓的&ldquo;肥代码&rdquo;（FatCode），而且必须要依赖于MFC的运行时刻库才能正确地运行。虽然MFC的运行时刻库只有部分功能与COM有关，但是由于MFC的继承实现的本质，ActiveXControl必须背负运行时刻库这个沉重的包袱。如果采用静态连接MFC运行时刻库的方式，这将使ActiveXControl代码过于庞大，在网络上传输时将占据宝贵的网络带宽资源；如果采用动态连接MFC运行时刻库的方式，这将要求浏览器一方必须具备MFC的运行时刻库支持。总之，MFC对COM技术的支持在网络应用的环境下也显得很不灵活。<br /><br /><strong>后补:</strong><br /><br /><span style="color: red"><a id="articleTitle">什么是ORM?</a> <br /><br /><span style="color: #000000">对象关系映射（Object Relational Mapping，简称ORM）是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说，ORM是通过使用描述对象和数据库之间映射的元数据，将java程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。这也同时暗示者额外的执行开销；然而，如果ORM作为一种中间件实现，则会有很多机会做优化，而这些在手写的持久层并不存在。更重要的是用于控制转换的元数据需要提供和管理；但是同样，这些花费要比维护手写的方案要少；而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。<br /><br />对象-关系映射（Object/Relation Mapping，简称ORM），是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法，关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式，业务实体在内存中表现为对象，在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系，而在数据库中，关系数据无法直接表达多对多关联和继承关系。因此，对象-关系映射(ORM)系统一般以中间件的形式存在，主要实现程序对象到关系数据库数据的映射。<br /><br />面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的，而关系数据库则是从数学理论发展而来的，两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。<br /><br />让我们从O/R开始。字母O起源于&quot;对象&quot;(Object),而R则来自于&quot;关系&quot;(Relational)。几乎所有的程序里面，都存在对象和关系数据库。在业务逻辑层和用户界面层中，我们是面向对象的。当对象信息发生变化的时候，我们需要把对象的信息保存在关系数据库中。<br /><br />当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码，用来从数据库保存，删除，读取对象信息，等等。你在DAL中写了很多的方法来读取对象数据，改变状态对象等等任务。而这些代码写起来总是重复的</span><br /><br /><span style="color: #000000">相关介绍: <a href="http://baike.baidu.com/view/197951.htm"><font color="#2e9ce9">http://baike.baidu.com/view/197951.htm</font></a></span></span></p><p>&nbsp;</p><p><strong><span style="color: red"><span style="color: #000000">附带一个DCOM测试程序，Server、Client端都采用C++开发</span></span></strong></p><p><a target="_blank" href="http://ooplab.org/upload/2010/3/DcomTest.rar"><strong>DcomTest.rar</strong></a></p><p><a target="_blank" href="http://ooplab.org/upload/2010/3/DCOM例子（fromCADCAECAM）.rar">DCOM例子（fromCADCAECAM）.rar</a></p>]]></description><category>C++</category><comments>http://ooplab.org/post/699.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=699</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=699&amp;key=e01350aa</trackback:ping></item><item><title>Happy New Year</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/696.html</link><pubDate>Sat, 13 Feb 2010 19:49:14 +0800</pubDate><guid>http://ooplab.org/post/696.html</guid><description><![CDATA[<p>Happy New Year!</p><p>时间过得好快，匆匆一年又过！</p>]]></description><category>Living</category><comments>http://ooplab.org/post/696.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=696</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=696&amp;key=6356f411</trackback:ping></item><item><title>Lost</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/695.html</link><pubDate>Thu, 07 Jan 2010 23:39:36 +0800</pubDate><guid>http://ooplab.org/post/695.html</guid><description><![CDATA[<p style="text-align: center;"><span style="font-family: Comic Sans MS;">SUDDENLY I FOUND MYSELF LOST</span></p><p style="text-align: center;"><span style="font-family: Comic Sans MS;"><span style="color: rgb(0, 0, 0);">FEELING SO BAD<br /></span></span></p><p style="text-align: center;"><span style="font-family: Comic Sans MS;"><span style="color: rgb(0, 0, 0);">WHAT IS WRONG WITH ME</span><span style="font-size: 22px;"><span style="color: rgb(255, 0, 0);"><strong>?</strong></span></span></span></p><p style="text-align: center;">&nbsp;</p><p style="text-align: center;"><img title="" alt="" src="http://ooplab.org/upload/2010/1/201001072348070433.jpg" onload="ResizeImage(this,520)" style="width: 538px; height: 495px;" /></p>]]></description><category>Living</category><comments>http://ooplab.org/post/695.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=695</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=695&amp;key=3c062dc0</trackback:ping></item><item><title>如何安装Ajax</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/694.html</link><pubDate>Thu, 07 Jan 2010 22:22:18 +0800</pubDate><guid>http://ooplab.org/post/694.html</guid><description><![CDATA[<p><strong>在VS下使用Ajax：</strong></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<a title="ASPAJAXExtSetup.msi" href="http://download.microsoft.com/download/5/4/6/5462bcbd-e738-45fa-84ca-fa02b0c4e1c2/ASPAJAXExtSetup.msi">ASPAJAXExtSetup.msi</a>，安装结束后就可以在VS2005下使用Ajax了。</p><p>&nbsp;</p><p><strong>使用微软开发好的Ajax控件：</strong></p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.下载<a title="AjaxControlToolkit" href="http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx?ReleaseId=1425">AjaxControlToolkit</a>。</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 2.将AjaxControlToolkit解压到：C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0&nbsp;AJAX Extensions\v1.0.61025\AjaxContronlToolkit\下。</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 3.双击运行AjaxControlToolkit.sln,将C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\SampleWebSite\Bin下面生成的</p><p>AjaxControlToolkit.dll和AjaxControlToolkit.pdb复制到 C:\Program Files\Microsoft ASP.NET\ASP.NET 2.0 AJAX Extensions\<span style="color: rgb(0, 0, 128);">v1.0.61025</span></p><p><span style="color: rgb(0, 0, 128);">\AjaxControlToolkit\Binaries</span>文件夹下面。</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp; 4.将复制过的Dll添加到工具栏（如下图）</p><p>&nbsp;</p><p><img onload="ResizeImage(this,520)" src="http://ooplab.org/upload/2010/1/201001072225081674.png" alt="" title="" /></p><p>&nbsp;</p><p><img onload="ResizeImage(this,520)" src="http://ooplab.org/upload/2010/1/201001072225232675.png" alt="" title="" /></p><p>5. OK, Enjoy Ur Ajax.</p><p><img onload="ResizeImage(this,520)" src="http://ooplab.org/upload/2010/1/201001072225232675.png" alt="" title=""/></p>]]></description><category>C++</category><comments>http://ooplab.org/post/694.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=694</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=694&amp;key=00c0c53b</trackback:ping></item><item><title>VC Manifest</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/692.html</link><pubDate>Mon, 04 Jan 2010 09:49:22 +0800</pubDate><guid>http://ooplab.org/post/692.html</guid><description><![CDATA[<p>Windows XP 以后系统采用一种新的方式来链接dll。就是manifest.&nbsp;&nbsp;manifest其实是一段dll。它可以单独存在也可以嵌入到dll/exe中。如 果单独存在的时候，就是exe名字后加一个.manifest. 比如Test.exe。那么可以生成一个Test.exe.manifest和它放在一起。我们可以使用工具来生成一个exe需要的manifest。系 统会根据Manifest来加载所需要的dll。Windows目录下也多了一个目录叫 WinSXS，这里放了不同版本的系统dll。比如各种不同版本的VC/MFC运行库。这个不同版本不会互相干扰，总的来说。Manifest解决了 dll hell问题。<br />不过随之而来的问题是，大部分的vs.net 2005的用户在新建&ldquo;win32项目－windows应用程序&rdquo;的时候，新建的工程都通不过去，出现如下提示： Solution to &ldquo;MSVCR80D.dll not found&rdquo;&ldquo;，没有找到MSVCR80D.dll，因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。&rdquo;明明是装了VC的。系统也明明有这 个MSVRD80D的。为啥呢？因为VCRDXX.dll现在有manefiset检查功能，如果manifest有问题。产生原因有多种：</p><ul>    <li>其一是用户链接了静态库，这个静态库却链接了其他版本的MSVCRT库，检查一下。</li>    <li>其二是VS的问题，编译生成的manifest有问题。 可以从菜单里选择：? Project/Properties/Linker/Manifest File/Generate Manifest?? 改成Yes，让VC生成manifest.</li></ul><p>如上情况不起作用。可以参考我从网上找到的一些方法。或者改用静态链接到C++运行库和MFC库。另外，有人说重新编译CRT的库，这个我个人太不推荐。：）</p><br /><p>以下是我从网上招的资料，也比较有效：</p><br /><p>解决方案一微软对于这个问题应该也有处理，不过感觉不是很人性化。在&ldquo;属性-&gt;配置属性-&gt;清单工具-&gt;常规&ldquo;下有一个&rdquo;使用FAT32解决办法，把它选成是，就可以了。（注意：一定要先配置这个选项，然后再编译工程，要不然还是不好用：）</p><br /><p>解决方案二找到你的工程的文件夹，如（myproject），找到其下的myproject\myproject\Debug\ myproject.rec，把它删掉（删掉整个Debug目录也可以），重新编译，搞定！</p><br /><p>解决方案三首先找到你的vs.net安装目录（如我的是E:\Program Files\Microsoft Visual Studio 8），定位到Microsoft Visual Studio 8\VC\VCWizards\AppWiz\Generic\Application文件夹，备份这个Application文件夹）</p><br /><p>打开html\2052，看到两个文件了吧，就那个AppSettings.htm了，打开，在266行&ldquo; &rdquo;后回车，然后插入一下内容：</p><br /><p>选择你所使用的文件系统:</p><br /><p>&lt;INPUT TYPE=&quot;radio&quot; CLASS=&quot;Radio&quot; checked&nbsp;&nbsp;NAME=&quot;filesystem&quot; ID=&quot;FAT32&quot; ACCESSKEY=&quot;F&quot; TITLE=&quot;FAT32&quot;&gt;FAT32(F) &lt;INPUT TYPE=&quot;radio&quot; CLASS=&quot;Radio&quot;&nbsp;&nbsp;NAME=&quot;filesystem&quot; ID=&quot;NTFS&quot; ACCESSKEY=&quot;N&quot; TITLE=&quot;NTFS&quot;&gt;NTFS(N)好，保存关闭，这个改完了，准备下一个。</p><br /><p>打开scripts\2052，这里就一个文件，ue打开它，找到138行</p><b>var bATL = wizard.FindSymbol(&rdquo;SUPPORT_ATL&rdquo;) </b><p>其后回车，插入如下内容：</p><br /><p>var MFTool = config.Tools(&quot;VCManifestTool&quot;); MFTool.UseFAT32Workaround = true;</p><font color="#000000"> </font><p>好，继续找到210行(源文件的210，你加了上边的语句就不是210了)</p><b>config = proj.Object.Configurations.Item(&rdquo;Release&rdquo;)</b><p>注意这次要在这行&ldquo;前边&rdquo;加如下内容：</p><br /><p>if(bFAT32) { var MFTool = config.Tools(&quot;VCManifestTool&quot;); MFTool.UseFAT32Workaround = true; } 好了，终于都改完了，打开你的vs.net 2005新建一个win32应用程序看看吧，效果还不错吧</p><br /><a target="_blank" href="http://forums.microsoft.com/MSDN/default.aspx?SiteID=1"><font color="#0000ff">http://forums.microsoft.com/MSDN/default.aspx?SiteID=1</font></a><br /><b>manifest原理和用途</b><p>dll是被动态调用的，所以会被若干个程序共享使用的 但是如果dll在应用程序不知道的情况下升级了、或是被另一个程序更改了，就可能会出现问题，即&rdquo;DLL Hell&rdquo;</p><br /><p>随着系统资源越来越丰富，硬盘不那么紧张，所以在XP以后的操作系统中，用新的机制来管理DLL</p><br /><p>（这种机制，这不仅仅是对于.NET而言，对于普通的Native程序也是一样的）</p><br /><p>Madifest是个XML的描述文件，对于每个DLL有DLL的Manifest文件，对于每个应用程序Application也有自己的Manifest</p><br /><p>对于应用程序而言，Manifest可以是一个和exe文件同一目录下的.manifest文件，也可以是作为一个资源嵌入在exe文件内部的(Embed Manifest)</p><br /><p>XP以前版本的windows，会像以前那样执行这个exe文件，寻找相应的dll，没有分别Manifest只是个多余的文件或资源，dll文件会直接到system32的目录下查找，并且调用</p><br /><p>而XP以后的操作系统，则会首先读取Manifest，获得exe文件需要调用的DLL列表（此时获得的，并不直接是DLL文件的本身的位置，而是DLL 的manifest）操作系统再根据DLL的Manifest去寻找对应的DLL&lt;因此就可能区别不同版本的同一个DLL文件，或是指定一个程序本 身Isolated的DLL&gt;</p><br /><p>不过使用Visual Studio 2005以后的一个新问题是，VS2005带的8.0新版的C运行库(VC 8.0 CRT)文件在XP以后支持manifest的Windows版本中被调用时，将会check一下Application自身的Manifest，否则将 会拒绝被调用。这也就是说，使用Visual Studio开发的Application，Manifest将是必不可少的（搞不懂MS为啥要这样设置，所以与VS2003.NET不同了。后来想想， 除了MS自己说的哪些冠冕堂皇的原因，至少这样一来Linux的Wine模拟要麻烦多了）</p><br /><p>除非，你的程序是静态链接的，没有使用dll，只使用了操作系统核心的 Kernel32.dll, User32.dll, Ole32.dll, 或ShDocVW.dll 等。project的设置必须是Use Standard Windows Libraries、Not Using ATL、No Common Language Runtime support</p><br /><p>那么你可以不需要考虑Manifest 可以关掉它</p><br /><p>VS2005中Menifest相关的设置</p><br /><ul>    <li>Project/Properties/Linker/Manifest File/Generate Manifest 决定是否生成Manifest，如上情况才可以关闭</li>    <li>Project/Properties/Linker/Manifest File/Allow Isolation 这个是设置DLL的调用的，并不能决定Manifest是否还是必须的</li>    <li>Project/Properties/Manifest Tool/Input and Output/Embed Manifest 决定Manifest是个单独的文件还是嵌入到exe内的资源</li></ul><p>对于我来说，使用SDL必须是启用DLL的动态链接方式，所以必须开启Manifest，并且让Manifest Embed进入exe比较方便</p><br /><p>与上面内容相应的 是关于如何发布软件的问题，事实上只有VC6.0的CRT库是绑定作为Windows的一部分的，之后从VS.net开始，VC程序制作安装包也是要考虑 库文件的，只不过VC6.0时推荐拷入System32，VC.net时推荐放在exe文件local目录，而现在VS2005则还需要考虑 Manifest的问题了，看似麻烦，其实也还好，VS自带工具打包，下面一些网址也有讲如何手工做redistribution</p><br /><p>参考网址</p><ul>    <li>http://msdn2.microsoft.com/en-us/library/ms235342.aspx</li>    <li>http://msdn2.microsoft.com/en-us/library/ms235265.aspx</li>    <li>http://msdn2.microsoft.com/en-us/library/8kche8ah.aspx</li>    <li>http://blog.kalmbachnet.de/?postid=54</li>    <li>http://blogs.msdn.com/nikolad/archive/2005/03/18/398720.aspx</li></ul>]]></description><category>C++</category><comments>http://ooplab.org/post/692.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=692</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=692&amp;key=fa651f78</trackback:ping></item><item><title>Tools</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/691.html</link><pubDate>Tue, 22 Dec 2009 22:29:27 +0800</pubDate><guid>http://ooplab.org/post/691.html</guid><description><![CDATA[<p>1. <a target="_blank" href="http://ooplab.org/upload/2009/12/ActivePorts端口查看器汉化版.rar">ActivePorts端口查看器汉化版.rar</a></p><p>2. PDF破解器，去除打印限制，密码等 <a href="http://ooplab.org/upload/AdultPDFPasswordRecovery.rar" target="_blank">AdultPDFPasswordRecovery.rar</a></p><p>3 &nbsp;<a target="_blank" href="http://ooplab.org/upload/WinMD5.rar"><font color="#0066cc">WinMD5.rar</font></a></p><p>4.&nbsp; Visual Assist X 1557 + Crack Patch&nbsp; <a href="http://ooplab.org/upload/VA_X_1557.rar" target="_blank">download</a>&nbsp;&nbsp; 经测试是OK的，能稳定在VS2005下运行。</p><p>5. <a target="_blank" href="http://ooplab.org/upload/2009/12/depends.rar">depends.rar</a>&nbsp; which can used to see dll info</p><p>6. Series Port Debuger,&nbsp;&nbsp; <a target="_blank" href="http://ooplab.org/upload/2009/12/serialdebug.rar">serialdebug.rar</a></p><p>&nbsp;7. TCP Socket debug,&nbsp;&nbsp; <a target="_blank" href="http://ooplab.org/upload/2009/12/socket_tool.rar">socket_tool.rar</a></p><p>8. Application Spy&nbsp;, <a target="_blank" href="http://ooplab.org/upload/2009/12/spy.rar">spy.rar</a></p><p>9. Diff Tool, <a target="_blank" href="http://ooplab.org/upload/2009/12/diff.rar">download</a></p>]]></description><category>Tools</category><comments>http://ooplab.org/post/691.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=691</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=691&amp;key=397636f6</trackback:ping></item><item><title>Programming Practise</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/690.html</link><pubDate>Sun, 20 Dec 2009 00:14:32 +0800</pubDate><guid>http://ooplab.org/post/690.html</guid><description><![CDATA[<p>1~20个数字排列组合排成圈，求满足任意相邻2组数字和为质数，求解。</p><p>刚拿到这个题目起初我还以为此题无解，但既然有这样的题目，那就应该是有对应的方法的吧，遂写code测试之。</p><p>很明显的递归类型题目，呵呵，可能因为很久没写递归程序的缘故吧，从开始写到穷举完所有解前后竟然花费了我一个小时时间， 汗！&nbsp; 看来以后要多多做这方面的trainning了。</p><p>结果很令人大跌眼镜。 此题竟然有<font size="2">6309300个解， 穷解所有解并写到磁盘文件前后竟然花费了180sec，看来算法效率还是需要提升啊。 </font></p><p>&nbsp;</p><p><font size="2">附上最后的10组解：</font></p><p><font size="2">6309293:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 7&nbsp; 6&nbsp; 5 14&nbsp; 9&nbsp; 4&nbsp; 3&nbsp;  2<br />6309294:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9&nbsp; 2&nbsp; 3 14&nbsp; 5&nbsp; 6&nbsp; 7&nbsp;  4<br />6309295:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9&nbsp; 2&nbsp; 5 14&nbsp; 3&nbsp; 4&nbsp; 7&nbsp;  6<br />6309296:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9&nbsp; 4&nbsp; 7&nbsp; 6&nbsp; 5 14&nbsp; 3&nbsp;  2<br />6309297:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9 14&nbsp; 3&nbsp; 2&nbsp; 5&nbsp; 6&nbsp; 7&nbsp;  4<br />6309298:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9 14&nbsp; 3&nbsp; 4&nbsp; 7&nbsp; 6&nbsp; 5&nbsp;  2<br />6309299:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9 14&nbsp; 5&nbsp; 2&nbsp; 3&nbsp; 4&nbsp; 7&nbsp;  6<br />6309300:&nbsp; 1 18 19 12 17 20 11&nbsp; 8 15 16 13 10&nbsp; 9 14&nbsp; 5&nbsp; 6&nbsp; 7&nbsp; 4&nbsp; 3&nbsp;  2<br /><br />Total find result:<br />6309300&nbsp; (总共的解的个数)</font></p><p>&nbsp;</p><p><font size="2">附上我写的测试源代码：</font></p><p><a target="_blank" href="http://ooplab.org/upload/2009/12/Ring.rar">Ring.rar</a></p><p><span style="color: rgb(255, 255, 255);">源代码解压缩密码是 hello</span></p>]]></description><category>Test&amp;amp;Trainning</category><comments>http://ooplab.org/post/690.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=690</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=690&amp;key=3860a0aa</trackback:ping></item><item><title>蜗居</title><author>yufeng.huang@hotmail.com (shamantou)</author><link>http://ooplab.org/post/689.html</link><pubDate>Mon, 14 Dec 2009 23:15:00 +0800</pubDate><guid>http://ooplab.org/post/689.html</guid><description><![CDATA[<p>&nbsp;</p><p><a href="http://ooplab.org/upload/2009/12/蜗居完整版小说.txt" target="_blank">蜗居完整版小说.txt</a></p><p>城市奋斗破灭论， 这是一个怎样的社会？</p>]]></description><category>Living</category><comments>http://ooplab.org/post/689.html#comment</comments><wfw:comment>http://ooplab.org/</wfw:comment><wfw:commentRss>http://ooplab.org/feed.asp?cmt=689</wfw:commentRss><trackback:ping>http://ooplab.org/cmd.asp?act=tb&amp;id=689&amp;key=efe053d6</trackback:ping></item></channel></rss>
