<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-xxrl(孔曰成仁,孟曰取义)</title><link>http://www.cnblogs.com/xxrl/</link><description>MSN:***@hotmail.com
qq:3256748
email:lecoda@gmail.com</description><language>zh-cn</language><lastBuildDate>Thu, 21 Aug 2008 11:45:35 GMT</lastBuildDate><pubDate>Thu, 21 Aug 2008 11:45:35 GMT</pubDate><ttl>60</ttl><item><title>全身“大扫除”五方案</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/10/1190899.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Sat, 10 May 2008 01:24:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/10/1190899.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1190899.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/10/1190899.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1190899.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1190899.html</trackback:ping><description><![CDATA[<div class="articleTitle">
<div style="display: inline;">
<strong id="t_4ab83bac010094zn">全身&#8220;大扫除&#8221;五方案</strong>
</div>
</div>
<br />
<p><strong><a href="http://blog.photo.sina.com.cn/showpic.html#url=http://static7.photo.sina.com.cn/orignal/4ab83bac44cc31a2cac56" target="_blank"><img style="margin: 0px auto; display: block; text-align: center;" src="http://static7.photo.sina.com.cn/bmiddle/4ab83bac44cc31a2cac56"  alt="" /></a></strong></p>
<p>&nbsp;</p>
<p><strong>&nbsp;&nbsp;
一、食物排毒法：</strong></p>
<p>
在5-7天内给你的身体来个大扫除，自我清理毒素。</p>
<p><font color="#ff4040">　　起床后喝一大杯温柠檬水</font></p>
<p>
起床后不要立刻进食或忙着洗脸刷牙，此时你最需要的是加了一片新鲜柠檬片(如果没有新鲜的，干柠檬片也可以)的温开水，它可以促进肾脏的循环，激发一
天的新陈代谢的开始。如果你有每天服用维他命或鱼油丸的习惯，此时也可以一并服下，帮助在接下来的早餐中吸收最多的营养元素，保证一天的营养和机体正常运
作。</p>
<p><font color="#ff4040">　　有益排毒的碱性食物</font></p>
<p>　　1
肝脏是解毒的重要器官，所以必须减缓肝脏的超负荷运动。需要控制小麦、肉类、乳制品，盐和糖，食物添加剂、防腐剂、饱和脂肪、酒和油炸食品的摄入量。以米饭为主食，能净化肠胃且不会加重消化负担，它所含的淀粉质对清肝脏来说也是灵丹妙药。</p>
<p>　　2
尽情享受蔬菜和水果，高解毒的食品有：猕猴桃、柑橘、葡萄、菠萝、黄瓜、菠菜、卷心菜、水田芹。不要担心所有的蔬菜都有一点微苦，是由于它们含有净化物质。</p>
<p>
TIPS：使用食物排毒的人在刚开始的两天可能感觉不太好，不过不必紧张，人体此时正在进入一种&#8220;康复危机&#8221;，此时肝脏正在努力去除毒素，会导致头痛、疲乏。</p>
<p>&nbsp;</p>
<p><a href="http://blog.photo.sina.com.cn/showpic.html#url=http://static10.photo.sina.com.cn/orignal/4ab83bac44cc3208f6589" target="_blank"><img style="margin: 0px auto; display: block; text-align: center;" src="http://static10.photo.sina.com.cn/bmiddle/4ab83bac44cc3208f6589"  alt="" /></a></p>
<p><strong>　　</strong></p>
<p><strong>&nbsp;&nbsp;
二、运动排毒法：</strong></p>
<p>
对于喜欢运动却懒得动手做菜或没有条件禁食的人来说，这是最合适的方法。</p>
<p>
1、每日至少散步30分钟，做些轻柔舒缓的运动，如慢跑、打太极拳。</p>
<p>
2、练习腹式呼吸：平躺下来，用鼻孔吸气，然后屏气，气流经过腹腔，再慢慢从鼻孔呼气。</p>
<p>
3、洗桑拿来帮助出汗，10到15分钟后冲一下凉水澡，刺激血液循环。</p>
<p>
4、运动的同时，要时刻补充水分，也可以喝绿茶，但绝不能喝碳酸饮料。市场上的运动型饮料，在排毒的几天里最好不要饮用。</p>
<p><strong>　　三、美容排毒法：</strong></p>
<p>
皮肤是身体排毒的重要途径，而当体内毒素累积过多时，皮肤也会首先报警。肤色黯淡、干涩无光、痘痘频频、油腻严重——这些都是身体中毒的迹象。</p>
<p><font color="#ff4040">　　身体干刷按摩</font></p>
<p>
每天洗澡时用丝瓜筋手套对肌肤进行干按摩，被誉为促进身体排毒的真正妙方。按摩加速血液循环和淋巴液畅通，从而使体内有毒废物易于冲洗出去。通常可采用圈状按摩手法，自下而上地对全身施加按摩力，注意按摩方向为肢体末端向心脏方向。</p>
<p><strong>　　四、泡澡排毒：</strong></p>
<p>
泡澡绝对是帮助肌肤排毒的好方法，可将积存在皮下组织内的酸性废物冲洗掉，将滞留在身体的二氧化碳及不好的物质代谢出来，从而使肌肤变得健康有弹性。天然浴盐和芳香精油是排毒泡澡的首选，在浴缸中加入浴盐和迷迭香、茶树及柠檬精油，会起到不错的排毒效果。</p>
<p><strong>　　五、简易排毒法：</strong></p>
<p>
如果你工作忙碌，作息时间不稳定，可以使用简易的方法轻松排毒。</p>
<p>
1、每天早上侧卧着喝一杯加柠檬的温水，这一动作有利于水经过肝脏，带走在体内沉积了一夜的毒素。</p>
<p>
2、每天吃一个苹果，其为天然的解毒剂，它所含的果胶能替我们把从污浊空气中吸进体内的金属废物排出。</p>
<p>
3、每星期缚1-2次具有排毒功能的面膜，通过肌肤排汗的过程，促进淋巴及血液循环，从而将毒素排出。</p>
<table border="0" cellpadding="0" cellspacing="0" width="90%">
    <tbody>
        <tr>
            <td class="letter_green12" align="right" height="40">
            <br />
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal"><span style="font-family: 宋体;">
小站一共收录了</span><strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;">近<span xml:lang="EN-US" lang="EN-US">4500</span>篇</span></strong><span style="font-family: 宋体;">有关健康的文章（</span><strong><span style="font-size: 12pt; color: purple; font-family: 宋体;">健康饮食<span xml:lang="EN-US" lang="EN-US">/</span>健康睡眠<span xml:lang="EN-US" lang="EN-US">/</span>健康运动<span xml:lang="EN-US" lang="EN-US">/</span>健康容貌<span xml:lang="EN-US" lang="EN-US">/</span>健康性福<span xml:lang="EN-US" lang="EN-US">/</span>健康心理<span xml:lang="EN-US" lang="EN-US">/</span>综合类健康资讯等</span></strong><span style="font-family: 宋体;">），涵盖面广，简单实用。</span></p>
<p class="MsoNormal" style="text-align: center;" align="center">
<strong><span style="font-size: 16pt; color: red; font-family: 方正粗圆_GBK;" xml:lang="EN-US" lang="EN-US">//</span></strong><strong><span style="font-size: 16pt; color: red; font-family: 方正粗圆_GBK;">&#8220;加油&#8221;前必读
<span xml:lang="EN-US" lang="EN-US">//
</span></span></strong></p>
<p class="MsoNormal"><strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;">自助式加油</span></strong><span xml:lang="EN-US" lang="EN-US">-</span><span style="font-family: 宋体;">根据您的需要和兴趣，可在本博首页</span>
<span style="font-family: 宋体;">
&#8220;分类&#8221;中点击相关主题</span><span xml:lang="EN-US" lang="EN-US">(</span><span style="font-family: 宋体;">如&#8220;健康饮食&#8221;</span><span xml:lang="EN-US" lang="EN-US">)</span><span style="font-family: 宋体;">，直接阅读所有有关健康饮食的文章</span><span xml:lang="EN-US" lang="EN-US">,</span><span style="font-family: 宋体;">达到针对性强、效率性高的&#8220;加油&#8221;目的。另外本博<strong>首页右上角新增</strong>的<strong>搜索功能</strong>也不错哦：）</span></p>
<p class="MsoNormal"><strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;">互动式加油<span xml:lang="EN-US" lang="EN-US">-</span></span></strong><span style="font-family: 宋体;">如果您看了文章后还有疑问，请给我留言或在评论中写下您的问题，我将尽力并尽早以博文、公开征求答案等形式回复您的问题。</span></p>
<p class="MsoNormal"><strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;">欢迎您收藏本博<img src="http://blogimg.sinajs.cn/images/control/face/002.gif"  alt="" /></span></strong><span style="font-family: 宋体;">，好随时查阅，同时也方便将相关文章的地址发给您的亲朋好友们，一个善意的提醒，会更温馨亲情、甜蜜爱情、深刻友情哦</span><span xml:lang="EN-US" lang="EN-US">...</span><span style="font-family: 宋体;">爱好自己是对所有爱您的人</span><span xml:lang="EN-US" lang="EN-US">--</span><span style="font-family: 宋体;">最高和最重要的回报！愿小站能做您健康人生的好伴侣！</span></p>
<p class="MsoNormal" style="text-align: center;" align="center">
<strong><span style="font-size: 15pt; font-family: 方正粗圆_GBK;" xml:lang="EN-US" lang="EN-US">-
<span style="color: red;"><span>&nbsp;</span></span></span></strong><strong><span style="font-size: 15pt; color: navy; font-family: 方正粗圆_GBK;">全球第一家中文版电子化</span></strong>
<strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;" xml:lang="EN-US" lang="EN-US"><span>&nbsp;</span>24</span></strong><strong><span style="font-size: 15pt; color: red; font-family: 方正粗圆_GBK;">小时健康加油站<span xml:lang="EN-US" lang="EN-US"><span>&nbsp;</span></span></span></strong>
<strong><span style="font-size: 15pt; font-family: 方正粗圆_GBK;" xml:lang="EN-US" lang="EN-US">-</span></strong></p>
<p class="MsoNormal"><span style="font-family: 宋体;">
曾被加拿大中文电台《博客世界》节目，以及凤凰卫视旗下《凤凰健康》杂志等多家媒体报道，并荣登新浪健康&#8220;博客秀&#8221;。</span></p>
<p class="MsoNormal"><strong><span style="font-size: 15pt; color: navy; font-family: 方正粗圆_GBK;">每次加油最佳时长<span xml:lang="EN-US" lang="EN-US">&lt;30</span>分钟 <span xml:lang="EN-US" lang="EN-US">!</span> 定期加油，为生命注入能量
<span xml:lang="EN-US" lang="EN-US">! !</span></span></strong></p>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1190899.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41822/" target="_blank">[新闻]第一财经周刊:当前互联网世界正处无秩序时代</a>]]></description></item><item><title>转载 typedef大全</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185365.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:34:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185365.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185365.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185365.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185365.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185365.html</trackback:ping><description><![CDATA[摘要: 这两天在看程序的时候,发现很多地方都用到typedef,在结构体定义,还有一些数组等地方都大量的用到.但是有些地方还不是很清楚,今天下午,就想好好研究一下.上网搜了一下,有不少资料.归纳一下:来源一:Using typedef to Curb Miscreant Code Typedef 声明有助于创建平台无关类型，甚至能隐藏复杂和难以理解的语法。不管怎样，使用 typedef 能为代码带来意想不&nbsp;&nbsp;<a href='http://www.cnblogs.com/xxrl/archive/2008/05/06/1185365.html'>阅读全文</a><img src ="http://www.cnblogs.com/xxrl/aggbug/1185365.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>MFC的DLL 概述</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185360.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:32:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185360.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185360.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185360.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185360.html</trackback:ping><description><![CDATA[摘要: DLL的背景知识 静态链接和动态链接 当前链接的目标代码(.obj)如果引用了一个函数却没有定义它，链接程序可能通过两种途径来解决这种从外部对该函数的引用： 静态链接 链接程序搜索一个或者多个库文件(标准库.lib)，直到在某个库中找到了含有所引用函数的对象模块，然后链接程序把这个对象模块拷贝到结果可执行文件(.exe)中。链接程序维护对该函数的所有引用，使它们指向该程序中现在含有该函数拷贝的地方&nbsp;&nbsp;<a href='http://www.cnblogs.com/xxrl/archive/2008/05/06/1185360.html'>阅读全文</a><img src ="http://www.cnblogs.com/xxrl/aggbug/1185360.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>[转]MFC .DLL指南(一)</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185352.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185352.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185352.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185352.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185352.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185352.html</trackback:ping><description><![CDATA[<h2 class="diaryTitle">MFC .DLL指南(一)- -</h2>
<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;
</p>
<p>这
里要提到的一点是,在用COM和ATL前,程序员一般用.DLLs来代替它们.&nbsp;你可以用.DLL做很多事.如果你有几个程序要用到相同的函数或资源,你
可以将代码放到一个.DLL中.将多个程序要共同用到的代码放到一个简单的.DLL中可以节省维护时间,因为代码就在一个地方.:)修理和其他的改动最多
做一次就够了.如果你有一个在不同时间用不同程序的程序,你应该把这些程序做成.DLLs,根据需要的导入相应的.DLL.有很多理由要用到.DLLS.<br />
&nbsp;&nbsp;虽
然用.DLL能做的COM全能做,但是仍有很多好原因使得我们要用.DLLs,所以它们没有消失.但是.DLLs还是有很多严重缺点的,这些严重的缺点就
是我们为什么会首先想到用COM.但.DLLs仍然是很实用的工具.对照COM和ATL,.DLLs是非常简单的来实现的.学习COM和ATL需要投入大
量的时间和努力.实现.DLL却相对简单,修改起来也不难.如果你会一些C++和MFC,你现在就可以实现.DLLs.<br />
&nbsp;&nbsp;这篇文章回顾一下用MFC实现.DLLs的几种形式,包括何时用和怎么用各种形式.在下一篇将讨论.DLLs的局限性(这就是为何会出现COM和ATL)</p>
<p>&nbsp;&nbsp;<br />
Different&nbsp;types&nbsp;of&nbsp;.DLLs</p>
<p>&nbsp;&nbsp;可
以用MFC来实现两种.DLLs:一个是MFC扩展.DLL,一个是正规的.DLLs.正规的.DLLs有两种实现方
式:dynamically&nbsp;linked&nbsp;或者&nbsp;statically&nbsp;linked.Visual&nbsp;C++也允许你用
generic&nbsp;Win32&nbsp;.DLL,但本文我们只讨论以MFC为基础的.DLL形式.</p>
<p>&nbsp;&nbsp;MFC&nbsp;extension&nbsp;.DLLs<br />
&nbsp;&nbsp;每
一个.DLL都有一些接口.接口是一套变量,指针,函数或者是类,可以通过客户程序来访问.MFC的扩展.DLL有一个C++形式的接口,也就是说它提供
给客户程序("export")C++函数或者整个类.导出函数可以用C++或者MFC的数据形式作为参数或返回值.当导出整个类,客户程序可以创建此类
的对象或者派生于此类.在.DLL中,你也可以用MFC和C++.<br />
&nbsp;&nbsp;Visual&nbsp;C++用的MFC的类代码库也存在于.DLL中.一个扩
展.DLL是动态连接到MFC的代码库的.DLL的.客户程序也必须动态的连接到MFC的代码库.随着时间的推移,MFC的库也在增长.结果,就有了几个
不同的MFC的代码库的版本.客户端和扩展的.DLL必须建立在相同版本的MFC上.因此,一个MFC扩展的.DLL要运行,客户端和此扩展的.DLL必
须动态的连到相同的MFC代码库的.DLL上,并且,此库还得在该程序运行的机器上好使.<br />
&nbsp;&nbsp;注意:如果你的程序静态的连接到MFC,但是你希望
改变它便于从一个扩展的.DLL中访问函数,这时,你要改此应用程序为动态连接到MFC.在Visual&nbsp;C++,在菜单中
选"Project&nbsp;|&nbsp;Settings",在"General"设置标签中可以把你的程序改成动态连接到MFC.<br />
&nbsp;&nbsp;MFC扩展.DLLs非常小.你可以建立一个导出一些函数或者类的大约10-15KB的.DLL.显然的,你的.DLL的大小要以你要存多少代码到你的.DLL中为准.但是通常MFC扩展的.DLLs是相对小和快捷的.<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Regular&nbsp;.DLLs<br />
&nbsp;&nbsp;MFC
的扩展.DLL只能工作在用MFC编的客户程序上.如果你的.DLL可以被大多数的Win32程序导入和运行,你应改选择正规的.DLL.但你只能导出
C-style函数.你不能导出类.你不能导出C++函数或overloaded函数.不能用MFC的数据类型作为参数和返回值.但可以在你的.DLL中
用C++和MFC,但是你的接口必须全是C-style.&nbsp;&nbsp;<br />
&nbsp;&nbsp;当然正规的.DLL也要访问MFC的代码库的.DLL.可以动态,可以静态连
接.如果动态连接,意味着你的.DLL函数所需的MFC代码不用建立在你的.DLL中,你的.DLL会从你的客户端的机器上MFC的代码库的.DLL中取
得所需要的代码.如果正确的MFC代码库的.DLL版本没找到,你的.DLL将不能工作.像MFC扩展的.DLL一样,正规的.DLL也非常小,只能在客
户端所在的机器有MFC代码库的.DLL情况下工作.<br />
&nbsp;&nbsp;如果你静态连接到MFC代码库,你的.DLL包括它自己的所有的所需的MFC代码.那
么,它将非常庞大,但是它不依赖于客户端的电脑配置.如果你不知道主机的机器配置情况,这是一个很好的方法.如果你的客户在你的公司范围内,你可以知道他
们的MFC&nbsp;.DLL的配置情况,或者你的安装程序带了正确版本的MFC&nbsp;.DLL,那么静态连接就不是一个好方法了.</p>
<p>&nbsp;&nbsp;<br />
Building&nbsp;a&nbsp;.DLL</p>
<p>&nbsp;&nbsp;可
以用App&nbsp;Wizard来实现以MFC为基础的.DLL.选择"File&nbsp;|&nbsp;New",在"Projects"标签上,选
择"MFC&nbsp;AppWizard&nbsp;(.DLL).",为你的工程选一个名字,然后单击"OK".在下一个屏幕,选择建立一个MFC扩展的.DLL,或者正
规的.DLL"using&nbsp;shared&nbsp;MFC&nbsp;.DLL"(就是动态连接到MFC),或者正规的.DLL(静态的连接到MFC).选择其中一个,
按"Finish".<br />
&nbsp;&nbsp;App&nbsp;Wizard新建立的.DLL没做任何事.编译新的.DLL,但是它不导出任何类和函数,本质上来说,没有任何用,你现在有两个工作:<br />
&nbsp;&nbsp;1.增加函数.<br />
&nbsp;&nbsp;2.修改客户端来调用你的.DLL.<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Export&nbsp;a&nbsp;Class<br />
&nbsp;&nbsp;上
面提到,只有MFC的扩展.DLL能导出MFC/C++类.假设你建立了一个扩展的.DLL,你可以通过从另一个工程加入.cpp和.h文件来创建一个
类,也可以在你的工程中创建新类.要导出这个新类,你必须在类的声明前加一个宏"AFX_EXT_CLASS",像这样:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;AFX_EXT_CLASS&nbsp;CMyClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//class&nbsp;declaration&nbsp;goes&nbsp;here<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;还用一种方法来导出一个类,很简单而且很好,我会在下面讨论客户端如何做才能用上你的导出类提到.<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;Export&nbsp;objects&nbsp;and&nbsp;variables<br />
&nbsp;&nbsp;代替导出整个类的方法,你可以导出该类在.DLL中的对象.客户端程序可以调用所有的该导出对象的公有函数和访问它的公有成员变量.<br />
&nbsp;&nbsp;首先,创建一个.h文件,定义了你的新类.然后创建实现你的新类的.cpp文件.在.cpp文件底部,在你所有的公有的,私有的类函数后,创建一个这样的类的实例:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;CMyClass&nbsp;myObject;</p>
<p>&nbsp;&nbsp;这
行的作用是创建一个CMyClass类的实例,当客户端导入.DLL时,使得客户端可以访问该实例.通过该实例,访问它的公有函数和成员编量.注意,每个
客户端导入.DLL将获得该实例的一个拷贝,也就是说,如果不同的程序访问相同的.DLL,如果一个程序改变了该实例,不会影响另一个程序.<br />
&nbsp;&nbsp;除了导出实例,你可以用同样的方法导出变量.如果你加上此行:<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;int&nbsp;x;</p>
<p>&nbsp;&nbsp;就可以导出变量,为客户端应用.下面说的很重要:你只能导出全局的实例或者变量.局部的实例或者变量当它们跑出作用域,就会停止生存.如果用下面的方法,将不会正常工作:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyFunction(&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;CMyClass&nbsp;myObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;int&nbsp;x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;一旦实例或者变量跑出作用域,它们将停止生存.</p>
<p>&nbsp;&nbsp;Export&nbsp;a&nbsp;function<br />
&nbsp;&nbsp;导出函数和导出变量是很相似的.你可以简单的在函数前面加上"_declspec(dllexport)"</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllexport)&nbsp;int&nbsp;MyExportedFunction(int);</p>
<p>&nbsp;&nbsp;这就是导出的全部.记住,只有MFC扩展的.DLL能导出C++函数或者以MFC的数据类型为参数或者返回值.正规的.DLLs只能导出C-style函数.</p>
<p>&nbsp;&nbsp;<br />
Using&nbsp;the&nbsp;.DLL&nbsp;in&nbsp;a&nbsp;client&nbsp;application</p>
<p>&nbsp;&nbsp;一个.DLL不能运行它自己.它需要客户端导入它,调用它的接口.<br />
&nbsp;&nbsp;当你编译你的.DLL时,编译器创建两个很重要的文件:&nbsp;.DLL文件和.lib文件.你的客户端需要这两个文件.你必须拷贝它们到客户端的工程文件夹.</p>
<p>&nbsp;&nbsp;除了.DLL和.lib文件,你的客户端还需要要导出的类,函数,实例和变量所在的头文件.要导出函数时要加"_declspec(dllexport)"声明.现在要导入了,就要加入"_declspec(dllimport)"声明.如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllimport)&nbsp;CMyClass&nbsp;myObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllimport)&nbsp;int&nbsp;x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllimport)&nbsp;int&nbsp;MyExportedFunction(int);</p>
<p>&nbsp;&nbsp;为了可读性,我们可以这样写:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;DLLIMPORT&nbsp;_declspec(dllimport)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DLLIMPORT&nbsp;CMyClass&nbsp;myObject;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DLLIMPORT&nbsp;int&nbsp;x;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DLLIMPORT&nbsp;int&nbsp;MyExportedFunction(int);</p>
<p>&nbsp;&nbsp;现在你声明了你的实例,变量和函数,可以用了.:)<br />
&nbsp;&nbsp;要导出整个类,你必须将整个.h头文件拷过来..DLL和客户端要有唯一的关于此导出类的头文件.记住,类的声明要加上:&nbsp;AFX_EXT_CLASS&nbsp;宏.<br />
&nbsp;&nbsp;一
旦你建立了客户端,你已经准备给客户用了,你应该给他们你的Release可执行文件和Release的.DLL.不用给用户.lib文件..DLL可以
放在客户程序的目录,或者系统目录.还有上面提到的,你要提供正确的MFC代码库的.DLL.这个.DLL是你的机器装Visual&nbsp;C++时候用的.</p>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1185352.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>MFC .DLL指南(二)</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185356.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185356.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185356.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185356.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185356.html</trackback:ping><description><![CDATA[<p>我们上节讨论的结果是.DLLs对于任何的程序员都是非常实用的工具.然而,使用他们却有很多限制,任何人在作的时候都要意识到这点.</p>
<p>&nbsp;&nbsp;MFC&nbsp;Issues<br />
&nbsp;&nbsp;在上一节已经提到了这个,但是很有再一次提的价值.MFC扩展的.DLL只能在和客户端的程序用相同的MFC和正确的MFC的代码库的情况下才好使.正规的.DLL也是如此.</p>
<p>&nbsp;&nbsp;Compiler&nbsp;Incompatibility&nbsp;Issues<br />
&nbsp;&nbsp;一个很重要的问题就是在以C++为基础的.DLLs,当它们建立在某一个编译器上,而调用它们的客户端却建立在另一个编译器上,通常情况下,再多的努力,它也不会工作.:(<br />
&nbsp;&nbsp;ANSI协会制定了C和C++的语言的标准.也就是说,它指定了C和C++的函数和数据类型必须由一个编译器来支持.但是它并没有提供一个完整的基于二进制级的关于如何用函数和数据类型的实现.结果,编译器厂商就根据自己的方式来自由的实现其语言功能.<br />
&nbsp;&nbsp;很
多的C/C++程序员知道不同的编译器操作的数据类型是不同的.一个编译器为int型变量分配2bytes,但另一个也许会分配4bytes.一个会用
4bytes的double,另一个可能用8bytes的.在函数实现和操作符重载方面就有更大的差别了.不同的编译器的差别比你想的还要多,所以,这些
不同使你的.DLL不能运行于某些的程序上.<br />
&nbsp;&nbsp;编译器的不兼容问题可以通过插入pragmas和其他的重编译说明到你的代码来解决,但是很难,
而且不易读.但是用到不兼容的编译器确实是不可避避免的.解决编译器不兼容问题的最好的方法是让你的.DLL导出一个简单的接口类,让它指回你
的.DLL,我们将在下面讨论.</p>
<p>&nbsp;&nbsp;Recompiling<br />
&nbsp;&nbsp;让我们假设你建立了内含名为CMyClass的类的.DLL.当一个客户程序连到你的.DLL,.DLL创建这个类的实例并导出这个实例.假设你的导出实例为30字节.<br />
&nbsp;&nbsp;现
在假设你对CMyClass做了一些改动,加了一个int型变量,这样你的导出的CMyClass的实例就由原来的30字节变成了34字节,你将新
的.DLL给用户,让它替代原来的.现在,错误来了,客户程序期待一个30字节的实例,但是你的新的.DLL却送来了34字节的实例,客户程序将抛出异
常.<br />
&nbsp;&nbsp;客户程序并不需要改变代码,所有要做的就是导入一个CMyClass类的实例.在代码的某处,加上这行:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_declspec(dllimport)&nbsp;CMyClass&nbsp;myObject;</p>
<p>&nbsp;&nbsp;客户程序的代码不需任何改变,只需要重编译客户程序来解决此问题,重编译后,客户程序将等待34字节的实例.<br />
&nbsp;&nbsp;这是很严重的问题,不重新编译客户端而只在改变.DLL后将此.DLL重置是我们的目标.然而,你的.DLL要导出整个类或一个类的实例,那么此目标是不可能实现的.你必须重编译客户端.如果你没有客户端的源代码,你将使用不了新的.DLL.</p>
<p>&nbsp;&nbsp;Solutions<br />
&nbsp;&nbsp;如果对上面的问题有一个很好的解决,那么我们不会用COM了.这里有一些建议:<br />
&nbsp;&nbsp;尽可能的用MFC的扩展的.DLLs.虽然这样限制了你的客户程序的类型,但是解决了编译器不兼容的问题.<br />
&nbsp;&nbsp;如果你的.DLL导出类或者类的实例,你不得不在修改了.DLL后重新编译你的客户端.为了避免这样,你必须做到分解你要导出的类,实现导出类的一个接口.最好的方法是,创建一个作为第一个类的接口的类,这样你改变了导出类的话,接口类不变,客户程序无需重新编译.<br />
&nbsp;&nbsp;这
里有一个例子.假设你要导出CMyClass类.CMyClass有两个公有函数,int&nbsp;FunctionA(int)和
int&nbsp;FunctionB(int).替代导出CMyClass,我将创建一个导出接口CMyInterface.CMyInterface将含有一个
指向CMyClass的实例.这里给出它的头文件:<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;AFX_EXT_CLASS&nbsp;CMyInterface<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class&nbsp;CMyClass;&nbsp;//forward&nbsp;declaration&nbsp;of&nbsp;CMyClass<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyClass&nbsp;*m_pMyClass;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyInterface(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~CMyInterface(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;FunctionA(int);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;FunctionB(int);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};</p>
<p>&nbsp;&nbsp;这份头文件将用在.DLL和客户端程序.注意,前面的声明意味着没有CMyClass的备份也可以编译.<br />
&nbsp;&nbsp;在.DLL内部,这样实现CMyInterface:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyInterface::CMyInterface(&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pMyClass&nbsp;=&nbsp;new&nbsp;CMyClass;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~CMyInterface::~CMyInterface(&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pMyClass;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyInterface::FunctionA(&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_pMyClass-&gt;FunctionA(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CMyInterface::FunctionB(&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;m_pMyClass-&gt;FunctionB(&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;因
此,CMyClass的每一个函数,CMyInterface将提供相应的函数.客户程序将和客户程序没有联系.如果它想调用
CMyClass::FunctionA,只需调用CMyInterface::FunctionA.接口类会用指针调用CMyClass.用这种布局你
可以改变CMyClass了----不用担心CMyClass的大小变了.CMyInterface的接口的大小不变.即使你给CMyClass加了一个
私有变量,CMyInterface的大小也不会变.要是你加了公有成员,就在CMyInterface里边直接加上对应新变量
的"getter"&nbsp;和&nbsp;"setter"&nbsp;函数,不用担心,加入新的函数,CMyInterface接口类的大小不会改变.<br />
&nbsp;&nbsp;建立一个单独的
接口可以避免编译器不兼容,客户端重编译的问题.只要接口类不变,就不需重编译.但仍然有两个小问题,一:对于每一个CMyClass的公有的成员变量,
你必须在CMyInterface里创建实际的对应的函数或变量.这个例子中只有两个函数,所以很简单.如果CMyClass有成千上万的函数和变量,这
将变得很困难,而且易错.二:你将增大进程的开销.客户程序不再直接访问CMyClass,替代的通过访问CMyInterface来访问
CMyClass.如果一个函数要被调用成千次,那此进程将会耗用很长时间.</p>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1185356.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>[转]VC下发布的Release版程序的异常捕捉 </title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185349.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:29:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185349.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185349.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185349.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185349.html</trackback:ping><description><![CDATA[摘要: VC下发布的Release版程序的异常捕捉新一篇:VC知识库文章 - 仅通过崩溃地址找出源代码的出错行function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(&nbsp;&nbsp;<a href='http://www.cnblogs.com/xxrl/archive/2008/05/06/1185349.html'>阅读全文</a><img src ="http://www.cnblogs.com/xxrl/aggbug/1185349.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>[转]调试Release版本应用程序，不知道转自哪里</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185341.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:27:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185341.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185341.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185341.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185341.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185341.html</trackback:ping><description><![CDATA[摘要: 调试Release版本应用程序引言如果在您的开发过程中遇到了常见的错误，或许您的Release版本不能正常运行而Debug版本运行无误，那么我推荐您阅读本文：因为并非如您想象的那样，Release版本可以保证您的应用程序可以象Debug版本一样运行。如果您在开发阶段完成之后或者在开发进行一段时间之内从来没有进行过Release版本测试，然而当您测试的时候却发现问题，那么请看我们的调试规则1:规则1&nbsp;&nbsp;<a href='http://www.cnblogs.com/xxrl/archive/2008/05/06/1185341.html'>阅读全文</a><img src ="http://www.cnblogs.com/xxrl/aggbug/1185341.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>[转]VC调试篇-不知道转自何处</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185338.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:26:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185338.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185338.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185338.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185338.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185338.html</trackback:ping><description><![CDATA[摘要: shanshanVC调试篇难怪很多前辈说调试是一个程序员最基本的技能，其重要性甚至超过学习一门语言。不会调试的程序员就意味着他即使会一门语言，却不能编制出任何好的软件。 我以前接触的程序大多是有比较成形的思路和方法，调试起来出的问题都比较小，最近这个是我自己慢慢摸索调试，接触了很多新的调试方法，并查了很多前辈的总结，受益匪浅，总结以前的和新的收获如下：VC调试篇设置为了调试一个程序，首先必须使程序&nbsp;&nbsp;<a href='http://www.cnblogs.com/xxrl/archive/2008/05/06/1185338.html'>阅读全文</a><img src ="http://www.cnblogs.com/xxrl/aggbug/1185338.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>对“仅通过崩溃地址找出源代码的出错行”一文的补充与改进，转自vckbase，记录一下</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185337.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:24:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185337.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185337.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185337.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185337.html</trackback:ping><description><![CDATA[<p align="center"><strong>对&#8220;仅通过崩溃地址找出源代码的出错行&#8221;一文的补充与改进</strong><br />
<br />
作者：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#120;&#113;&#99;&#52;&#64;&#115;&#111;&#104;&#117;&#46;&#99;&#111;&#109;">上海伟功通信 roc</a></p>
<p><a href="http://www.vckbase.com/code/downcode.asp?id=2691">下载源代码</a><br />
<br />
读了老罗的&#8220;<a target="_blank" href="http://www.vckbase.com/document/viewdoc/?id=908">仅通过崩溃地址找出源代码的出错行</a>&#8221;(下称"罗文")一文后，感觉该文还是可以学到不少东西的。不过文中尚存在有些说法不妥，以及有些操作太繁琐的地方
。为此，本人在学习了此文后，在多次实验实践基础上，把该文中的一些内容进行补充与改进，希望对大家调试程序，尤其是release版本的程序有帮助
。欢迎各位朋友批评指正。<br />
<br />
<br />
<strong>一、该方法适用的范围</strong><br />
在windows程序中造成程序崩溃的原因很多，而文中所述的方法仅适用与:由一条语句当即引起的程序崩溃。如原文中举的除数为零的崩溃例子。而笔者在实际工作中碰到更多的情况是:指针指向一非法地址
，然后对指针的内容进行了，读或写的操作。例如：<br />
</p>
<pre>void Crash1()<br />
{<br />
char * p =(char*)100;<br />
*p=100;<br />
}<br />
</pre>
这些原因造成的崩溃，无论是debug版本，还是release版本的程序，使用该方法都可找到造成崩溃的函数或子程序中的语句行，具体方法的下面还会补充说明。
另外，实践中另一种常见的造成程序崩溃的原因:函数或子程序中局部变量数组越界付值，造成函数或子程序返回地址遭覆盖，从而造成函数或子程序返回时崩溃。例如:<br />
<pre>#include <string.h><br />
void Crash2();<br />
int main(int argc,char* argv[])<br />
{<br />
Crash2();<br />
return 0;<br />
}<br />
<br />
void Crash2()<br />
{<br />
char p[1];<br />
strcpy(p,"0123456789");<br />
}<br />
</string.h></pre>
在vc中编译运行此程序的release版本，会跳出如下的出错提示框。
<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg1.jpg" border="0" width="434" height="139"  alt="" /><br />
图一 上面例子运行结果<br />
<br />
这里显示的崩溃地址为:0x34333231。这种由前面语句造成的崩溃根源，在后续程序中方才显现出来的情况，显然用该文所述的方法就无能为力了。不过
在此例中多少还有些蛛丝马迹可寻找到崩溃的原因:函数Crash2中的局部数组p只有一个字节大小
，显然拷贝"0123456789"这个字符串会把超出长度的字符串拷贝到数组p的后面，即*(p+1)=''1''，*(p+2)=''2''，*
(p+3)=''3''，*(p+4)=4。。。。。。而字符''1''的ASC码的值为0x31，''2''为0x32，''3''为
0x33，''4''为0x34。。。。。，由于intel的cpu中int型数据是低字节保存在低地址中
，所以保存字符串''1234''的内存，显示为一个4字节的int型数时就是0x34333231。显然拷贝"0123456789"这个字符串
时，"1234"这几个字符把函数Crash2的返回地址给覆盖
，从而造成程序崩溃。对于类似的这种造成程序崩溃的错误朋友们还有其他方法排错的话，欢迎一起交流讨论。<br />
<br />
<br />
<strong>二、设置编译产生map文件的方法</strong><br />
该文中产生map文件的方法是手工添加编译参数来产生map文件。其实在vc6的IDE中有产生map文件的配置选项的。操作如下:先点击菜单"Project"-&gt;"Settings。。。"，弹出的属性页中选中"Link"页
，确保在"category"中选中"General"，最后选中"Generate mapfile"的可选项。若要在在map文件中显示Line numbers的信息的话
，还需在project options 中加入/mapinfo:lines 。Line numbers信息对于"罗文"所用的方法来定位出错源代码行很重要
，但笔者后面会介绍更加好的方法来定位出错代码行，那种方法不需要Line numbers信息。
<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg3.JPG" border="0" width="677" height="446"  alt="" /><br />
图二 设置产生MAP文件
<br />
<br />
<br />
<strong>三、定位崩溃语句位置的方法</strong><br />
"罗文"所述的定位方法中，找到产生崩溃的函数位置的方法是正确的，即在map文件列出的每个函数的起始地址中，最近的且不大于崩溃地址的地址即为包含崩溃语句的函数的地址
。但之后的再进一步的定位出错语句行的方法不是最妥当，因为那种方法前提是，假设基地址的值是 0x00400000 ，以及一般的 PE 文件的代码段都是从 0x1000偏移开始的
。虽然这种情况很普遍，但在vc中还是可以基地址设置为其他数，比如设置为0x00500000，这时仍旧套用<br />
<pre> 崩溃行偏移 = 崩溃地址 - 0x00400000 - 0x1000 </pre>
的公式显然无法找到崩溃行偏移。 其实上述公式若改为<br />
<pre>崩溃行偏移 = 崩溃地址 - 崩溃函数绝对地址 + 函数相对偏移</pre>
即可通用了。仍以"罗文"中的例子为例:"罗文"中提到的在其崩溃程序的对应map文件中，崩溃函数的编译结果为<br />
<pre>0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo。obj </pre>
对与上述结果，在使用我的公式时
，"崩溃函数绝对地址"指00401020， 函数相对偏移指 00000020，
当崩溃地址= 0x0040104a时， 则 崩溃行偏移 = 崩溃地址 - 崩溃函数起始地址+  函数相对偏移 = 0x0040104a - 0x00401020 + 0x00000020= 0x4a，结果与"罗文"计算结果相同
。但这个公式更通用。<br />
<br />
<br />
<strong>四、更好的定位崩溃语句位置的方法。</strong><br />
其实除了依靠map文件中的Line numbers信息最终定位出错语句行外，在vc6中我们还可以通过编译程序产生的对应的汇编语句，二进制码，以及对应c/c++语句为一体的"cod"文件来定位出错语句行
。先介绍一下产生这种包含了三种信息的"cod"文件的设置方法:先点击菜单"Project"-&gt;"Settings。。。"，弹出的属性页中选中"C/C++"页
，然后在"Category"中选则"Listing Files"，再在"Listing file type"的组合框中选择"Assembly，Machine code， and source"。接下去再通过一个具体的例子来说明这种方法的具体操作。
<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg4.JPG" border="0" width="677" height="446"  alt="" /><br />
图三 设置产生"cod"文件
<br />
<br />
准备步骤1)产生崩溃的程序如下:<br />
<pre>01 //****************************************************************<br />
02 //文件名称：crash。cpp<br />
03 //作用:    演示通过崩溃地址找出源代码的出错行新方法<br />
04 //作者：   伟功通信 roc<br />
05 //日期：   2005-5-16<br />
06//****************************************************************<br />
07 void Crash1();<br />
08 int main(int argc,char* argv[])<br />
09 {<br />
10	Crash1();<br />
11	return 0;<br />
12 }<br />
13<br />
14 void Crash1()<br />
15 {<br />
16  char * p =(char*)100;<br />
17  *p=100;<br />
18 }<br />
</pre>
准备步骤2)按本文所述设置产生map文件(不需要产生Line numbers信息)。<br />
准备步骤3)按本文所述设置产生cod文件。<br />
准备步骤4)编译。这里以debug版本为例(若是release版本需要将编译选项改为不进行任何优化的选项，否则上述代码会因为优化时看作废代码而不被编译，从而看不到崩溃的结果)，编译后产生一个"exe"文件
，一个"map"文件，一个"cod"文件。
<br />
运行此程序，产生如下如下崩溃提示:
<br />
<br />
<img src="http://www.vckbase.com/document/journal/vckbase42/images/crashimg2.JPG" border="0" width="434" height="139"  alt="" /><br />
图四 上面例子运行结果
<br />
<br />
排错步骤1)定位崩溃函数。可以查询map文件获得。我的机器编译产生的map文件的部分如下:<br />
<pre> Crash<br />
<br />
Timestamp is 42881a01 (Mon May 16 11:56:49 2005)<br />
<br />
Preferred load address is 00400000<br />
<br />
Start Length Name Class<br />
0001:00000000 0000ddf1H .text CODE<br />
0001:0000ddf1 0001000fH .textbss CODE<br />
0002:00000000 00001346H .rdata DATA<br />
0002:00001346 00000000H .edata DATA<br />
0003:00000000 00000104H .CRT$XCA DATA<br />
0003:00000104 00000104H .CRT$XCZ DATA<br />
0003:00000208 00000104H .CRT$XIA DATA<br />
0003:0000030c 00000109H .CRT$XIC DATA<br />
0003:00000418 00000104H .CRT$XIZ DATA<br />
0003:0000051c 00000104H .CRT$XPA DATA<br />
0003:00000620 00000104H .CRT$XPX DATA<br />
0003:00000724 00000104H .CRT$XPZ DATA<br />
0003:00000828 00000104H .CRT$XTA DATA<br />
0003:0000092c 00000104H .CRT$XTZ DATA<br />
0003:00000a30 00000b93H .data DATA<br />
0003:000015c4 00001974H .bss DATA<br />
0004:00000000 00000014H .idata$2 DATA<br />
0004:00000014 00000014H .idata$3 DATA<br />
0004:00000028 00000110H .idata$4 DATA<br />
0004:00000138 00000110H .idata$5 DATA<br />
0004:00000248 000004afH .idata$6 DATA<br />
<br />
Address Publics by Value Rva+Base Lib:Object<br />
<br />
0001:00000020 _main 00401020 f Crash.obj<br />
0001:00000060 ?Crash1@@YAXXZ 00401060 f Crash.obj<br />
0001:000000a0 __chkesp 004010a0 f LIBCD:chkesp.obj<br />
0001:000000e0 _mainCRTStartup 004010e0 f LIBCD:crt0.obj<br />
0001:00000210 __amsg_exit 00401210 f LIBCD:crt0.obj<br />
0001:00000270 __CrtDbgBreak 00401270 f LIBCD:dbgrpt.obj<br />
...<br />
</pre>
对于崩溃地址0x00401082而言，小于此地址中最接近的地址(Rva+Base中的地址)为00401060，其对应的函数名为?Crash1@@YAXXZ，由于所有以问号开头的函数名称都是 C++ 修饰的名称
，"@@YAXXZ"则为区别重载函数而加的后缀，所以?Crash1@@YAXXZ就是我们的源程序中，Crash1() 这个函数。<br />
排错步骤2)定位出错行。打开编译生成的"cod"文件，我机器上生成的文件内容如下:<br />
<pre>	TITLE	E:\Crash\Crash。cpp<br />
.386P<br />
include listing.inc<br />
if @Version gt 510<br />
.model FLAT<br />
else<br />
_TEXT	SEGMENT PARA USE32 PUBLIC ''CODE''<br />
_TEXT	ENDS<br />
_DATA	SEGMENT DWORD USE32 PUBLIC ''DATA''<br />
_DATA	ENDS<br />
CONST	SEGMENT DWORD USE32 PUBLIC ''CONST''<br />
CONST	ENDS<br />
_BSS	SEGMENT DWORD USE32 PUBLIC ''BSS''<br />
_BSS	ENDS<br />
$$SYMBOLS	SEGMENT BYTE USE32 ''DEBSYM''<br />
$$SYMBOLS	ENDS<br />
$$TYPES	SEGMENT BYTE USE32 ''DEBTYP''<br />
$$TYPES	ENDS<br />
_TLS	SEGMENT DWORD USE32 PUBLIC ''TLS''<br />
_TLS	ENDS<br />
;	COMDAT _main<br />
_TEXT	SEGMENT PARA USE32 PUBLIC ''CODE''<br />
_TEXT	ENDS<br />
;	COMDAT ?Crash1@@YAXXZ<br />
_TEXT	SEGMENT PARA USE32 PUBLIC ''CODE''<br />
_TEXT	ENDS<br />
FLAT	GROUP _DATA， CONST, _BSS<br />
ASSUME	CS: FLAT, DS: FLAT, SS: FLAT<br />
endif<br />
PUBLIC	?Crash1@@YAXXZ					; Crash1<br />
PUBLIC	_main<br />
EXTRN	__chkesp:NEAR<br />
;	COMDAT _main<br />
_TEXT	SEGMENT<br />
_main	PROC NEAR					; COMDAT<br />
<br />
; 9    : {<br />
<br />
00000	55		 push	 ebp<br />
00001	8b ec		 mov	 ebp， esp<br />
00003	83 ec 40	 sub	 esp, 64			; 00000040H<br />
00006	53		 push	 ebx<br />
00007	56		 push	 esi<br />
00008	57		 push	 edi<br />
00009	8d 7d c0	 lea	 edi, DWORD PTR [ebp-64]<br />
0000c	b9 10 00 00 00	 mov	 ecx， 16			; 00000010H<br />
00011	b8 cc cc cc cc	 mov	 eax， -858993460		; ccccccccH<br />
00016	f3 ab		 rep stosd<br />
<br />
; 10   : 	Crash1();<br />
<br />
00018	e8 00 00 00 00	 call	 ?Crash1@@YAXXZ		; Crash1<br />
<br />
; 11   : 	return 0;<br />
<br />
0001d	33 c0		 xor	 eax， eax<br />
<br />
; 12   : }<br />
<br />
0001f	5f		 pop	 edi<br />
00020	5e		 pop	 esi<br />
00021	5b		 pop	 ebx<br />
00022	83 c4 40	 add	 esp, 64			; 00000040H<br />
00025	3b ec		 cmp	 ebp, esp<br />
00027	e8 00 00 00 00	 call	 __chkesp<br />
0002c	8b e5		 mov	 esp, ebp<br />
0002e	5d		 pop	 ebp<br />
0002f	c3		 ret	 0<br />
_main	ENDP<br />
_TEXT	ENDS<br />
;	COMDAT ?Crash1@@YAXXZ<br />
_TEXT	SEGMENT<br />
_p$ = -4<br />
?Crash1@@YAXXZ PROC NEAR				; Crash1, COMDAT<br />
<br />
; 15   : {<br />
<br />
00000	55		 push	 ebp<br />
00001	8b ec		 mov	 ebp, esp<br />
00003	83 ec 44	 sub	 esp, 68			; 00000044H<br />
00006	53		 push	 ebx<br />
00007	56		 push	 esi<br />
00008	57		 push	 edi<br />
00009	8d 7d bc	 lea	 edi, DWORD PTR [ebp-68]<br />
0000c	b9 11 00 00 00	 mov	 ecx, 17			; 00000011H<br />
00011	b8 cc cc cc cc	 mov	 eax, -858993460		; ccccccccH<br />
00016	f3 ab		 rep stosd<br />
<br />
; 16   :  char * p =(char*)100;<br />
<br />
00018	c7 45 fc 64 00<br />
00 00		 mov	 DWORD PTR _p$[ebp], 100	; 00000064H<br />
<br />
; 17   :  *p=100;<br />
<br />
0001f	8b 45 fc	 mov	 eax, DWORD PTR _p$[ebp]<br />
00022	c6 00 64	 mov	 BYTE PTR [eax], 100	; 00000064H<br />
<br />
; 18   : }<br />
<br />
00025	5f		 pop	 edi<br />
00026	5e		 pop	 esi<br />
00027	5b		 pop	 ebx<br />
00028	8b e5		 mov	 esp, ebp<br />
0002a	5d		 pop	 ebp<br />
0002b	c3		 ret	 0<br />
?Crash1@@YAXXZ ENDP					; Crash1<br />
_TEXT	ENDS<br />
END<br />
</pre>
其中<br />
<pre>?Crash1@@YAXXZ PROC NEAR				; Crash1, COMDAT</pre>
为Crash1汇编代码的起始行。产生崩溃的代码便在其后的某个位置。接下去的一行为:
<br />
<pre>; 15   : {</pre>
冒号后的"{"表示源文件中的语句，冒号前的"15"表示该语句在源文件中的行数。
这之后显示该语句汇编后的偏移地址，二进制码，汇编代码。如
<br />
<pre>00000	55		 push	 ebp</pre>
其中"0000"表示相对于函数开始地址后的偏移，"55"为编译后的机器代码，" push	 ebp"为汇编代码。从"cod"文件中我们可以看出，一条(c/c++)语句通常需要编译成数条汇编语句
。此外有些汇编语句太长则会分两行显示如:
<br />
<pre>00018	c7 45 fc 64 00<br />
00 00		 mov	 DWORD PTR _p$[ebp], 100	; 00000064H</pre>
其
中"0018"表示相对偏移，在debug版本中，这个数据为相对于函数起始地址的偏移(此时每个函数第一条语句相对偏移为0000)；release版
本中为相对于代码段第一条语句的偏移(即代码段第一条语句相对偏移为0000，而以后的每个函数第一条语句相对偏移就不为0000了)。"c7 45
fc 64 00 00 00 "为编译后的机器代码 ，"mov DWORD PTR _p$[ebp]， 100"为汇编代码，
汇编语言中";"后的内容为注释，所以";00000064H"，是个注释这里用来说明100转换成16进制时为"00000064H"。<br />
接下去，我们开始来定位产生崩溃的语句。<br />
第一步，计算崩溃地址相对于崩溃函数的偏移，在本例中已经知道了崩溃语句的地址(0x00401082)，和对应函数的起始地址(0x00401060)，所以崩溃地址相对函数起始地址的偏移就很容易计算了:
<br />
<pre>  崩溃偏移地址 = 崩溃语句地址 - 崩溃函数的起始地址 = 0x00401082 - 0x00401060 = 0x22。</pre>
第二步，计算出错的汇编语句在cod文件中的相对偏移。我们可以看到函数Crash1()在cod文件中的相对偏移地址为0000，则
<br />
<pre>崩溃语句在cod文件中的相对偏移 =  崩溃函数在cod文件中相对偏移 + 崩溃偏移地址 = 0x0000 + 0x22 = 0x22</pre>
第三步，我们看Crash1函数偏移0x22除的代码是什么?结果如下
<br />
<pre> 00022	c6 00 64	 mov	 BYTE PTR [eax], 100	; 00000064H</pre>
这句汇编语句表示将100这个数保存到寄存器eax所指的内存单元中去，保存空间大小为1个字节(byte)。程序正是执行这条命令时产生了崩溃，显然这里eax中的为一个非法地址
，所以程序崩溃了!<br />
第四步，再查看该汇编语句在其前面几行的其对应的源代码，结果如下:
<br />
<pre>; 17   :  *p=100;</pre>
其中17表示该语句位于源文件中第17行，而&#8220;*p=100;&#8221;这正是源文件中产生崩溃的语句。<br />
至此我们仅从崩溃地址就查找出了造成崩溃的源代码语句和该语句所在源文件中的确切位置，甚至查找到了造成崩溃的编译后的确切汇编代码!<br />
怎么样，是不是感觉更爽啊?<br />
<br />
<br />
<strong>五、小节</strong><br />
<br />
1、新方法同样要注意可以适用的范围，即程序由一条语句当即引起的崩溃。另外我不知道除了VC6外，是否还有其他的编译器能够产生类似的"cod"文件。<br />
2、我们可以通过比较 新方法产生的debug和releae版本的"cod"文件，查找那些仅release版本(或debug版本)有另一个版本没有的bug(或其他性状)。例如"罗文"中所举的那个用例
，只要打开release版本的"cod"文件，就明白了为啥debug版本会产生崩溃而release版本却没有:原来release版本中产生崩溃的语句其实根本都没有编译
。同样本例中的release版本要看到崩溃的效果，需要将编译选项改为为不优化的配置。
<img src ="http://www.cnblogs.com/xxrl/aggbug/1185337.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>仅通过崩溃地址找出源代码的出错行，转自老罗，记录一下</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185331.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:23:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185331.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185331.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185331.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185331.html</trackback:ping><description><![CDATA[<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tbody>
        <tr>
            <td width="40" height="74"><br />
            </td>
            <td valign="top" width="*" height="74">
            <form name="form2" method="post" action="/SYS/script/find.asp">
                <table border="0" cellpadding="0" cellspacing="0" width="100%">
                    <tbody>
                        <tr>
                            <td><span id="docinfo">[ <font color="#009900">转载文档</font> 本文适合中级读者 已阅读21313次 ]</span></td>
                            <td align="right">
                            <input name="keyword" size="10" maxlength="20" class="rect" type="text" />
                            <select name="gclsid" class="rect">
                            <option value="100" selected="selected">文档</option>
                            <option value="200">代码</option>
                            <option value="400">工具</option>
                            </select>
                            <input name="imageField" src="http://www.vckbase.com/document/image/go.gif" align="absmiddle" border="0" type="image" width="21" height="15" />
                            </td>
                        </tr>
                    </tbody>
                </table>
            </form>
            <!-- HEADER --><strong>仅通过崩溃地址找出源代码的出错行</strong><br />
            作者：老罗<br />
            <br />
            提交者：eastvc 发布日期：2003-10-23 9:16:11<br />
            原文出处：<a href="http://www.luocong.com/articles/show_article.asp?Article_ID=29" target="_blank">http://www.luocong.com/articles/show_article.asp?Article_ID=29</a><br />
            <br />
            <br />
            <!-- DETAILS -->作为程序员，我们平时最担心见到的事情是什么？是内存泄漏？是界面不好看？&#8230;&#8230;错啦！我相信我的看法是不会有人反对的——那就是，程序发生了崩溃！
            <p>&#8220;该程序执行了非法操作，即将关闭。请与你的软件供应商联系。&#8221;，呵呵，这句 M$
            的&#8220;名言&#8221;，恐怕就是程序员最担心见到的东西了。有的时候，自己的程序在自己的机器上运行得好好的，但是到了别人的机器上就崩溃了；有时自己在编写和测试
            的过程中就莫名其妙地遇到了非法操作，但是却无法确定到底是源代码中的哪行引起的&#8230;&#8230;是不是很痛苦呢？不要紧，本文可以帮助你走出这种困境，甚至你从此之
            后可以自豪地要求用户把崩溃地址告诉你，然后你就可以精确地定位到源代码中出错的那行了。（很神奇吧？呵呵。）</p>
            <p>首先我必须强调的是，本方法可以在目前市面上任意一款编译器上面使用。但是我只熟悉 M$ 的 VC 和 MASM ，因此后面的部分只介绍如何在这两个编译器中实现，请读者自行融会贯通，掌握在别的编译器上使用的方法。</p>
            <p>Well，废话说完了，让我们开始！ ：）</p>
            <p>首先必须生成程序的 MAP 文件。什么是 MAP 文件？简单地讲， MAP 文件是程序的全局符号、源文件和代码行号信息的唯一的文本表示方法，它可以在任何地方、任何时候使用，不需要有额外的程序进行支持。而且，这是唯一能找出程序崩溃的地方的救星。</p>
            <p>好吧，既然 MAP 文件如此神奇，那么我们应该如何生成它呢？在 VC 中，我们可以按下 Alt+F7 ，打开&#8220;Project Settings&#8221;选项页，选择
            C/C++ 选项卡，并在最下面的 Project Options 里面输入：/Zd ，然后要选择 Link 选项卡，在最下面的 Project Options
            里面输入： /mapinfo:lines 和 /map:PROJECT_NAME.map 。最后按下 F7 来编译生成 EXE 可执行文件和 MAP 文件。</p>
            <p>在 MASM 中，我们要设置编译和连接参数，我通常是这样做的：</p>
            <p>rc %1.rc<br />
            ml /c /coff /Zd %1.asm<br />
            link /subsystem:windows /mapinfo:exports /mapinfo:lines /map:%1.map %1.obj %1.res
            </p>
            <p>把它保存成 makem.bat ，就可以在命令行输入 makem filename 来编译生成 EXE 可执行文件和 MAP 文件了。</p>
            <p>在此我先解释一下加入的参数的含义：</p>
            <p>/Zd 表示在编译的时候生成行信息<br />
            /map[:filename] 表示生成 MAP 文件的路径和文件名<br />
            /mapinfo:lines 表示生成 MAP 文件时，加入行信息<br />
            /mapinfo:exports 表示生成 MAP 文件时，加入 exported functions （如果生成的是 DLL 文件，这个选项就要加上）
            </p>
            <p>OK，通过上面的步骤，我们已经得到了 MAP 文件，那么我们该如何利用它呢？</p>
            <p>让我们从简单的实例入手，请打开你的 VC ，新建这样一个文件：</p>
            <p>01 //****************************************************************<br />
            02 //程序名称：演示如何通过崩溃地址找出源代码的出错行<br />
            03 //作者：罗聪<br />
            04 //日期：2003-2-7<br />
            05 //出处：http://www.luocong.com（老罗的缤纷天地）<br />
            06 //本程序会产生&#8220;除0错误&#8221;，以至于会弹出&#8220;非法操作&#8221;对话框。<br />
            07 //&#8220;除0错误&#8221;只会在 Debug 版本下产生，本程序为了演示而尽量简化。<br />
            08 //注意事项：如欲转载，请保持本程序的完整，并注明：<br />
            09 //转载自&#8220;老罗的缤纷天地&#8221;（http://www.luocong.com）<br />
            10 //****************************************************************<br />
            11 <br />
            12 void Crash(void)<br />
            13 {<br />
            14 int i = 1;<br />
            15 int j = 0;<br />
            16 i /= j;<br />
            17 }<br />
            18 <br />
            19 void main(void)<br />
            20 {<br />
            21 Crash();<br />
            22 } </p>
            <p>很显然本程序有&#8220;除0错误&#8221;，在 Debug 方式下编译的话，运行时肯定会产生&#8220;非法操作&#8221;。好，让我们运行它，果然，&#8220;非法操作&#8221;对话框出现了，这时我们点击&#8220;详细信息&#8221;按钮，记录下产生崩溃的地址——在我的机器上是
            0x0040104a 。</p>
            <p>再看看它的 MAP 文件：（由于文件内容太长，中间没用的部分我进行了省略）</p>
            <p>CrashDemo</p>
            <p>Timestamp is 3e430a76 (Fri Feb 07 09:23:02 2003)</p>
            <p>Preferred load address is 00400000</p>
            <p>Start Length Name Class<br />
            0001:00000000 0000de04H .text CODE<br />
            0001:0000de04 0001000cH .textbss CODE<br />
            0002:00000000 00001346H .rdata DATA<br />
            0002:00001346 00000000H .edata DATA<br />
            0003:00000000 00000104H .CRT$XCA DATA<br />
            0003:00000104 00000104H .CRT$XCZ DATA<br />
            0003:00000208 00000104H .CRT$XIA DATA<br />
            0003:0000030c 00000109H .CRT$XIC DATA<br />
            0003:00000418 00000104H .CRT$XIZ DATA<br />
            0003:0000051c 00000104H .CRT$XPA DATA<br />
            0003:00000620 00000104H .CRT$XPX DATA<br />
            0003:00000724 00000104H .CRT$XPZ DATA<br />
            0003:00000828 00000104H .CRT$XTA DATA<br />
            0003:0000092c 00000104H .CRT$XTZ DATA<br />
            0003:00000a30 00000b93H .data DATA<br />
            0003:000015c4 00001974H .bss DATA<br />
            0004:00000000 00000014H .idata$2 DATA<br />
            0004:00000014 00000014H .idata$3 DATA<br />
            0004:00000028 00000110H .idata$4 DATA<br />
            0004:00000138 00000110H .idata$5 DATA<br />
            0004:00000248 000004afH .idata$6 DATA</p>
            <p> Address Publics by Value Rva+Base Lib:Object</p>
            <p>0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo.obj<br />
            0001:00000070 _main 00401070 f CrashDemo.obj<br />
            0004:00000000 __IMPORT_DESCRIPTOR_KERNEL32 00424000 kernel32:KERNEL32.dll<br />
            0004:00000014 __NULL_IMPORT_DESCRIPTOR 00424014 kernel32:KERNEL32.dll<br />
            0004:00000138 __imp__GetCommandLineA@0 00424138 kernel32:KERNEL32.dll<br />
            0004:0000013c __imp__GetVersion@0 0042413c kernel32:KERNEL32.dll<br />
            0004:00000140 __imp__ExitProcess@4 00424140 kernel32:KERNEL32.dll<br />
            0004:00000144 __imp__DebugBreak@0 00424144 kernel32:KERNEL32.dll<br />
            0004:00000148 __imp__GetStdHandle@4 00424148 kernel32:KERNEL32.dll<br />
            0004:0000014c __imp__WriteFile@20 0042414c kernel32:KERNEL32.dll<br />
            0004:00000150 __imp__InterlockedDecrement@4 00424150 kernel32:KERNEL32.dll<br />
            0004:00000154 __imp__OutputDebugStringA@4 00424154 kernel32:KERNEL32.dll<br />
            0004:00000158 __imp__GetProcAddress@8 00424158 kernel32:KERNEL32.dll<br />
            0004:0000015c __imp__LoadLibraryA@4 0042415c kernel32:KERNEL32.dll<br />
            0004:00000160 __imp__InterlockedIncrement@4 00424160 kernel32:KERNEL32.dll<br />
            0004:00000164 __imp__GetModuleFileNameA@12 00424164 kernel32:KERNEL32.dll<br />
            0004:00000168 __imp__TerminateProcess@8 00424168 kernel32:KERNEL32.dll<br />
            0004:0000016c __imp__GetCurrentProcess@0 0042416c kernel32:KERNEL32.dll<br />
            0004:00000170 __imp__UnhandledExceptionFilter@4 00424170 kernel32:KERNEL32.dll<br />
            0004:00000174 __imp__FreeEnvironmentStringsA@4 00424174 kernel32:KERNEL32.dll<br />
            0004:00000178 __imp__FreeEnvironmentStringsW@4 00424178 kernel32:KERNEL32.dll<br />
            0004:0000017c __imp__WideCharToMultiByte@32 0042417c kernel32:KERNEL32.dll<br />
            0004:00000180 __imp__GetEnvironmentStrings@0 00424180 kernel32:KERNEL32.dll<br />
            0004:00000184 __imp__GetEnvironmentStringsW@0 00424184 kernel32:KERNEL32.dll<br />
            0004:00000188 __imp__SetHandleCount@4 00424188 kernel32:KERNEL32.dll<br />
            0004:0000018c __imp__GetFileType@4 0042418c kernel32:KERNEL32.dll<br />
            0004:00000190 __imp__GetStartupInfoA@4 00424190 kernel32:KERNEL32.dll<br />
            0004:00000194 __imp__HeapDestroy@4 00424194 kernel32:KERNEL32.dll<br />
            0004:00000198 __imp__HeapCreate@12 00424198 kernel32:KERNEL32.dll<br />
            0004:0000019c __imp__HeapFree@12 0042419c kernel32:KERNEL32.dll<br />
            0004:000001a0 __imp__VirtualFree@12 004241a0 kernel32:KERNEL32.dll<br />
            0004:000001a4 __imp__RtlUnwind@16 004241a4 kernel32:KERNEL32.dll<br />
            0004:000001a8 __imp__GetLastError@0 004241a8 kernel32:KERNEL32.dll<br />
            0004:000001ac __imp__SetConsoleCtrlHandler@8 004241ac kernel32:KERNEL32.dll<br />
            0004:000001b0 __imp__IsBadWritePtr@8 004241b0 kernel32:KERNEL32.dll<br />
            0004:000001b4 __imp__IsBadReadPtr@8 004241b4 kernel32:KERNEL32.dll<br />
            0004:000001b8 __imp__HeapValidate@12 004241b8 kernel32:KERNEL32.dll<br />
            0004:000001bc __imp__GetCPInfo@8 004241bc kernel32:KERNEL32.dll<br />
            0004:000001c0 __imp__GetACP@0 004241c0 kernel32:KERNEL32.dll<br />
            0004:000001c4 __imp__GetOEMCP@0 004241c4 kernel32:KERNEL32.dll<br />
            0004:000001c8 __imp__HeapAlloc@12 004241c8 kernel32:KERNEL32.dll<br />
            0004:000001cc __imp__VirtualAlloc@16 004241cc kernel32:KERNEL32.dll<br />
            0004:000001d0 __imp__HeapReAlloc@16 004241d0 kernel32:KERNEL32.dll<br />
            0004:000001d4 __imp__MultiByteToWideChar@24 004241d4 kernel32:KERNEL32.dll<br />
            0004:000001d8 __imp__LCMapStringA@24 004241d8 kernel32:KERNEL32.dll<br />
            0004:000001dc __imp__LCMapStringW@24 004241dc kernel32:KERNEL32.dll<br />
            0004:000001e0 __imp__GetStringTypeA@20 004241e0 kernel32:KERNEL32.dll<br />
            0004:000001e4 __imp__GetStringTypeW@16 004241e4 kernel32:KERNEL32.dll<br />
            0004:000001e8 __imp__SetFilePointer@16 004241e8 kernel32:KERNEL32.dll<br />
            0004:000001ec __imp__SetStdHandle@8 004241ec kernel32:KERNEL32.dll<br />
            0004:000001f0 __imp__FlushFileBuffers@4 004241f0 kernel32:KERNEL32.dll<br />
            0004:000001f4 __imp__CloseHandle@4 004241f4 kernel32:KERNEL32.dll<br />
            0004:000001f8 \177KERNEL32_NULL_THUNK_DATA 004241f8 kernel32:KERNEL32.dll</p>
            <p>entry point at 0001:000000f0</p>
            <p><br />
            Line numbers for .\Debug\CrashDemo.obj(d:\msdev\myprojects\crashdemo\crashdemo.cpp)
            segment .text</p>
            <p> 13 0001:00000020 14 0001:00000038 15 0001:0000003f 16 0001:00000046<br />
            17 0001:00000050 20 0001:00000070 21 0001:00000088 22 0001:0000008d </p>
            <p>如果仔细浏览 Rva+Base 这栏，你会发现第一个比崩溃地址 0x0040104a 大的函数地址是 0x00401070 ，所以在 0x00401070
            这个地址之前的那个入口就是产生崩溃的函数，也就是这行：</p>
            <p>0001:00000020 ?Crash@@YAXXZ 00401020 f CrashDemo.obj </p>
            <p>因此，发生崩溃的函数就是 ?Crash@@YAXXZ ，所有以问号开头的函数名称都是 C++ 修饰的名称。在我们的源程序中，也就是 Crash() 这个子函数。</p>
            <p>OK，现在我们轻而易举地便知道了发生崩溃的函数名称，你是不是很兴奋呢？呵呵，先别忙，接下来，更厉害的招数要出场了。</p>
            <p>请注意 MAP 文件的最后部分——代码行信息（Line numbers information），它是以这样的形式显示的：</p>
            <p>13 0001:00000020 </p>
            <p>第一个数字代表在源代码中的代码行号，第二个数是该代码行在所属的代码段中的偏移量。</p>
            <p>如果要查找代码行号，需要使用下面的公式做一些十六进制的减法运算：</p>
            <p>崩溃行偏移 = 崩溃地址（Crash Address） - 基地址（ImageBase Address） - 0x1000 </p>
            <p>为什么要这样做呢？细心的朋友可能会留意到 Rva+Base 这栏了，我们得到的崩溃地址都是由 偏移地址（Rva）+ 基地址（Base） 得来的，所以在计算行号的时候要把基地址减去，一般情况下，基地址的值是
            0x00400000 。另外，由于一般的 PE 文件的代码段都是从 0x1000 偏移开始的，所以也必须减去 0x1000 。</p>
            <p>好了，明白了这点，我们就可以来进行小学减法计算了：</p>
            <p>崩溃行偏移 = 0x0040104a - 0x00400000 - 0x1000 = 0x4a </p>
            <p>如果浏览 MAP 文件的代码行信息，会看到不超过计算结果，但却最接近的数是 CrashDemo.cpp 文件中的：</p>
            <p>16 0001:00000046 </p>
            <p>也就是在源代码中的第 16 行，让我们来看看源代码:</p>
            <p>16 i /= j; </p>
            <p>哈！！！果然就是第 16 行啊！</p>
            <p>兴奋吗？我也一样！ ：）</p>
            <p>方法已经介绍完了，从今以后，我们就可以精确地定位到源代码中的崩溃行，而且只要编译器可以生成 MAP 文件（包括
            VC、MASM、VB、BCB、Delphi&#8230;&#8230;），本方法都是适用的。我们时常抱怨 M$ 的产品如何如何差，但其实 M$
            还是有意无意间提供了很多有价值的信息给我们的，只是我们往往不懂得怎么利用而已&#8230;&#8230;相信这样一来，你就可以更为从容地面对&#8220;非法操作&#8221;提示了。你甚至可
            以要求用户提供崩溃的地址，然后就可以坐在家中舒舒服服地找到出错的那行，并进行修正。</p>
            <p>是不是很爽呢？ ：） <br />
            </p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1185331.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>[转]Release版程序调试排错技巧</title><link>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185319.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 06 May 2008 08:20:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185319.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1185319.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/05/06/1185319.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1185319.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1185319.html</trackback:ping><description><![CDATA[<h2 class="diaryTitle">也不知道谁写的，反正有用，保存一下 <br />
</h2>
<h2 class="diaryTitle">Release版程序调试排错技巧- -</h2>
<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;
</p>
<p><font size="2">&nbsp;&nbsp;&nbsp; 在软件产品的测试过程中，以及发布之后，程序可能会由于一般保护错（GPF）而崩溃。即程序中访问了禁止访问的内存。这时，程序一般情况下无法继续运行，只能结束。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
</font><font size="2">&nbsp;&nbsp;&nbsp; 通常，我们遇到这个问题时只能大致地从程序运行（上下文）情况来粗略推断错误，但实际上有更好的解决办法......<br />
<br />
</font><br />
</p>
<div align="center">Release版程序调试技巧</div>
<br />
<br />
<br />
<font size="2">环境及工具：<br />
&nbsp; &nbsp; windows 9x/2000/xp，VC 6.0（SP6）<br />
&nbsp; &nbsp; Win32Dasm 8.93<br />
&nbsp; &nbsp; CrashFinder<br />
<br />
&nbsp;&nbsp;&nbsp; 在软件产品的测试过程中，以及发布之后，程序可能会由于一般保护错（GPF）而崩溃。即程序中访问了禁止访问的内存。这时，程序一般情况下无法继续运行，只能结束。<br />
&nbsp; &nbsp; <br />
在安装了调试器（比如VC）的系统中，会弹出一个错误对话框，显示类似：<br />
&nbsp; &nbsp; </font><font size="2"><font color="#8b0000">&#8220;0x12345678&#8221;指令引用的&#8221;0x000000123&#8221;内存。<br />
&nbsp; &nbsp; 该内存不能为&#8221;written(read)&#8221;<br />
&nbsp; &nbsp; 终止单击确定，调试单击取消。</font><br />
&nbsp; 没有调试器的系统中一般会出现一个Dr. watson窗口，内容类似。<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; 通常，我们遇到这个问题时只能大致地从程序运行（上下文）情况来粗略推断错误，但实际上有更好的解决办法。<br />
<br />
&nbsp; &nbsp; 在开发过程中，编译release版本的程序（包括EXE、DLL、OCX等二进制程序）时，要建立相关的mapfile，即映像文件。方法如下（VC）：<br />
（1） &nbsp; &nbsp; 选择release版本；<br />
（2） &nbsp; &nbsp; Project settings =&gt; C/C++ =&gt; Debug Info，选<br />
&nbsp; &nbsp; &nbsp; &nbsp; <strong><font color="#ff0000">&#8220;Line Number Only&#8221;；</font></strong><br />
（3） &nbsp; &nbsp; Project settings =&gt; link =&gt; 选中 &#8220;<font color="#ff0000"><strong>Generate mapfile</strong></font>&#8221;；<br />
（4） &nbsp; &nbsp; Project settings =&gt; link =&gt; Project Option中，输入 ：<br />
&nbsp; &nbsp; &nbsp; &nbsp; <font color="#dc143c"><strong>/mapinfo:lines</strong></font><br />
<br />
这样，编译后就会生成一个*.map的文本文件，其中包含了release版本程序的相关信息。<br />
<br />
当程序出现GPF时，记下指令地址，然后可以在map文件中的Rva+Base 段查找相关的信息。<br />
<br />
&nbsp; &nbsp; 比如：H1接口程序，出错指令为0x0040d7a0，在map文件中，可发现：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0001:0000c730 ?RefreshDevList@@YGIPAX@Z 0040d730 f &nbsp; FFServer.obj<br />
&nbsp; &nbsp; <br />
其中 0040d730是小于0040d7a0的最大地址，则可初步断定是在RefreshDevList函数中出的问题。下一步是定位出错代码在源程序中的行数，mapfile中包含了相关信息。定位方法是先计算偏移量，公式为：<br />
</font><font size="2"><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; (crash address) － (preferred load address) － 0x1000<br />
<br />
其中(preferred load address)在mapfile首部可以找到。然后，在mapfile中的相关源程序代码行信息段中搜索即可。<br />
<br />
在没有mapfile，比如编译时未添加相关选项的情况下，可以用反汇编工具，如Win32Dasm将出错的程序反汇编，找到相关指令并分析。<br />
<br />
有时，出错指令地址并不在程序的mapfile中，比如：0x77fcc665。<br />
这
一般是在出错程序调用的系统DLL中，比如msvcrt.dll、ntdll.dll等。可以用一个小工具CrashFinder来查找。
0x77fcc665查找的结果是RtlSizeHeap +
000007EA，ntdll.dll。同时，还可以启动调试器（如VC），查看call
stack等信息，找到出错指令的上下文。尽量正确能在mapfile中定位。<br />
<br />
在《Debugging Applications》一书中有详细的说明。<br />
<br />
总之，希望开发者和测试者能注意以下几点：<br />
<br />
（1） &nbsp; &nbsp; 发行版（release）的程序，包括DLL、OCX，一定要输出map file；<br />
（2） &nbsp; &nbsp; map file与相关的程序的版本对应关系一定要认真记录，避免混淆；<br />
<font color="#c0c0c0">（3） &nbsp; &nbsp; release版程序出现GPF时不要轻易结束，要详细记录下当时的信息，最简单的方法就是进行一下屏幕拷贝。</font><br />
（4） &nbsp; &nbsp; 在 NT/2000/XP 下，可以通过查看系统日志来获取程序崩溃信息。</font>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1185319.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>老公是用来欺负，老婆是用来疼的！（猪公猪婆篇）</title><link>http://www.cnblogs.com/xxrl/archive/2008/04/23/1166942.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Wed, 23 Apr 2008 02:44:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2008/04/23/1166942.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/1166942.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2008/04/23/1166942.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/1166942.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/1166942.html</trackback:ping><description><![CDATA[<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///F:%5CUsers%5CADMINI%7E1%5CAppData%5CLocal%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
</w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" latentstylecount="156">
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:12.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:宋体;
mso-font-kerning:1.0pt;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";
mso-ansi-language:#0400;
mso-fareast-language:#0400;
mso-bidi-language:#0400;}
</style>
<![endif]-->
<p class="MsoNormal" style="text-indent: 82.5pt;"><span style="font-size: 15pt; font-family: 宋体;">老公是用来欺负，老婆是用来疼的！</span><span lang="EN-US"><br />
</span><span style="font-family: 宋体;">关于讲理</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：你不讲理。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：和你我从来就没讲过理，家就不是讲理的地方。再说你是男的，还比我大</span><span lang="EN-US">2</span><span style="font-family: 宋体;">岁呢，你就得让着我。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于钱</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：以后我挣的钱，按比例给你吧，我挣的多时留得也多一点，这样我较会有积极性。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：好。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那我给你百分之多少？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：百分之一百二。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于主意</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：咱们出去玩吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：好，你说去哪就去哪。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我要有主意还和你说！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：我出的主意你从来都不同意呀。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我不同意的那叫什么主意啊，那叫敷衍！你得不停的有主意，直到我满意为止。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于中心</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我在我们家一直是中心，在你们家也得以我为中心。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那我在我们家也一直是中心。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：可我这中心比你那中心重要。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：为什么？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：因为我是千金，你只是个小子。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于心情</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我一干活心情就不好了，会降低咱们的婚姻质量的。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：我干活心情也会不好啊。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：不行，你得心里承受能力比我强。因为你拳头比我大，心脏也比我大！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230;&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪婆：这衣服好看吗？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：好看。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：你就敷衍我，想让我赶快买完了赶快回家，</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪婆：那衣服好看吗？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：不好看。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：你就舍不得给我买！</span><span lang="EN-US">
<br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于拿东西</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：这个袋子你也拿着吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：我都拿着四个袋子了，你什么都不拿，好意思吗？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：那我还挽着你呢！你有</span><span lang="EN-US">100</span><span style="font-family: 宋体;">多斤呢，我拿的东西比你拿的东西重多了。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于吃东西</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：这个话梅我吃了一半，挺好吃的，剩下的给你吃吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：我不爱吃话梅。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：不行，你就爱吃！你是不是嫌弃我吃过的！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：这鱼挺好吃的，来。</span><span lang="EN-US">
<br />
</span><span style="font-family: 宋体;">　　猪婆：你得脏筷子碰过，谁吃！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那你吃过一半我还吃呢，我不嫌弃你，你怎么嫌弃我？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：那就对了。我嫌弃你说明我比你干净。我比你干净你凭什么嫌弃我？！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于喝水</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：老公，我要喝水！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：我给你倒去。哎，这水杯不就在你手边嘛，没看见？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：看见了，我就是想让你递给我。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于打电话</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：你为什么不给我打电话？！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：倒打一耙！今天不是说好你给我打电话的嘛。结果我等了一天，还是我打给你的。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我是说过，可我又改主意了。张爱玲说：女人有改主意的权利。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那你改主意没跟我说呀！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我说了，我心里说的，谁让你和我的心灵不相通的。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于洗碗</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：一会你洗碗？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：好。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那怎么还不动啊？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我头疼。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：懒死了，不让你洗碗你也不头疼。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：真的！一想到洗碗我就头疼。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于散步</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：咱们一直散步到那条马路吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：到那儿太远了，一会儿该走不回来了。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：没事，你背我回来。</span><span lang="EN-US">
<br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于干家务</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：咱们把家务分分工吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：好。首先，脏活累活得男人干吧。如擦地、刷马桶、擦桌子</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪公：这对。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：男主外，女主内。和外人打交道的得你干吧，买菜</span><span lang="EN-US">/</span><span style="font-family: 宋体;">交水费</span><span lang="EN-US">/</span><span style="font-family: 宋体;">取报纸和牛奶。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：这</span><span lang="EN-US">&#8230;&#8230;</span><span style="font-family: 宋体;">行！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：你是学理工的，我是学文科的，带电的东西得你干吧，像洗衣机</span><span lang="EN-US">/</span><span style="font-family: 宋体;">电冰箱</span><span lang="EN-US">/</span><span style="font-family: 宋体;">电饭锅</span><span lang="EN-US">/</span><span style="font-family: 宋体;">电熨斗</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪公：行，行，那你干什么？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：别着急啊，厨房里油烟那么大，可毁皮肤了，做饭也得你干吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：你就告诉我你干什么吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我也有很多要干的呀。我可以陪着你，监督你，赞美你，安慰你</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于爱情</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">你爱我吗？</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">噢！</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">噢是什么意思？</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">爱。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">爱谁？</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">你。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">不行，你说全了。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">好。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">你快说呀！今天不说完，别想睡觉。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">我爱你。</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪婆：</span><span lang="EN-US">&#8220;</span><span style="font-family: 宋体;">这可是你自愿说的哦！我可没有逼你！</span><span lang="EN-US">&#8221; <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于异性朋友</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我可以有男朋友，你不能干涉我。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：行，我也交个女朋友。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：不行！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：凭什么你行我不行呀。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：我交男朋友，你做不到的人家能做到，我就不会老挑你的毛病了，有利于家庭幸福。你交女朋友，我心眼儿小，吃醋和你吵叫，不利于家庭安定。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：那我也心眼儿小。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：一个男人，和女人一样心眼儿小，亏你好意思说！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于婚外恋</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：现在电视里老演婚外恋，你说，你会有婚外恋吗？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：不会。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：为什么？</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：有你一个我就够后悔的了，决不能再要第二个！！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　然后</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于睡觉（一）</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：你那么小人，怎么占那么大地儿！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：那当然，我得翻身，还得伸懒腰呢！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于睡觉（二）</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：咱们盖那个双人被吧。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：别！那到第二天早上就全裹你身上了。我什么也盖不着。还是自己盖自己的吧，心里踏实。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：哼，你就是自己盖，到明天早上照样也得被我裹走！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230; <br />
</span><span style="font-family: 宋体;">关于起床</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：起床了，起床了，你不说今天要早起开会嘛。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：别吵我，我再睡一会。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公：快起来吧，会迟到了。</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪婆：你别碰我！我还要睡啦！！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　</span><span lang="EN-US">&#8230;&#8230; <br />
</span><span style="font-family: 宋体;">　　猪婆：呀！都迟到了！你怎么不叫我呢？！</span><span lang="EN-US"> <br />
</span><span style="font-family: 宋体;">　　猪公</span><span lang="EN-US">: &#8230;&#8230;</span></p>
<img src ="http://www.cnblogs.com/xxrl/aggbug/1166942.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41821/" target="_blank">[新闻]死敌VMware变身微软认证计划新成员</a>]]></description></item><item><title>网站汇总</title><link>http://www.cnblogs.com/xxrl/archive/2007/03/20/681259.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Tue, 20 Mar 2007 07:27:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2007/03/20/681259.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/681259.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2007/03/20/681259.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/681259.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/681259.html</trackback:ping><description><![CDATA[<h1 class=block_title><a id=viewpost1_TitleUrl href="http://www.cnblogs.com/me-sa/articles/680544.html">http://www.codeproject.com</a></h1>
<div class=post>
<div class=postcontent>
<hr>
</hr><br>http://www.codeproject.com<br>http://www.c-sharpcorner.com<br>http://windowsforms.net/Default.aspx?tabindex=3&amp;tabid=40<br>http://www.syncfusion.com/FAQ/WinForms/<br>
<hr>
</hr><br>http://www.dapha.net/down/show.asp?classid=2<br>
<hr>
</hr><br>常用的：<br>http://www.csharphelp.com<br>http://www.csharp-corner.com<br>http://www.gotdotnet.com<br>http://www.aspxcn.net<br>http://www.csharptoday.com<br>http://www.asptoday.com<br>http://www.dotnet247.com<br>http://www.xmlwebservices.cc/index_Samples.htm<br>http://www.syncfusion.com/FAQ/WinForms/FAQ_c44c.asp#Top<br>http://www.aspxapp.com<br>http://210.22.94.211/<br>http://www.dnzone.com/ShowDetail.asp?NewsId=48<br>http://www.aspcool.com<br>http://www.driverdevelop.com<br>http://www.china-askpro.com<br>http://www.yzcs.net<br>http://www.4046.com/nnsrc<br>http://www.aspxcn.com/dotnetdown/default.aspx?classid=2&amp;subclass=30<br>ftp://asp@211.154.60.72/book/by ahjyjlfq/asp.net编程精彩百例.rar<br>www.wenhui.org<br>http://www.china-code.net/list.asp?id=3656<br>http://www.uncj.net<br>http://www.codeproject.com/aspnet/datagriddemo.asp?target=datagrid%7Cdr<br>
<hr>
</hr><a href="http://www.uncj.net/">http://www.uncj.net</a> 这个就够了，好好看看、<br>
<hr>
</hr><a href="http://windowsforms.net/">http://windowsforms.net</a><br>
<hr>
</hr><br>http://www.dotnetjunkies.com/Tutorial/ShowContent.aspx?cg=65DC168F-B2AD-408B-8AA0-AD90DD739317&amp;ForumID=4258#rating<br>http://www.aspxcn.com/dotnetdown/default.aspx?classid=1&amp;subclass=6<br>http://www.uncj.net<br>http://www.syncfusion.com<br>http://www.codestudy.net/<br>http://www.51dotnet.com<br>csource.yeah.net<br>http://www.china-pub.com<br>http://lzhm.net<br>http://www.aspalliance.com<br>http://www.cshrp.net<br>http://www.stardeveloper.com<br>http://www.codeproject.com/<br>http://www.ondotnet.com<br>http://www.15seconds.com<br>http://chs.gotdotnet.com/quickstart/aspplus/<br>http://www.microsoft.com/china/msdn/catalog/windows/<br>
<hr>
</hr><a href="http://sourceforge.net/">http://sourceforge.net/</a><br>
<hr>
</hr><br>http://www.codeproject.com<br>http://www.c-sharpcorner.com<br>http://windowsforms.net/Default.aspx?tabindex=3&amp;tabid=40<br>http://www.syncfusion.com/FAQ/WinForms/<br>http://www.51dotnet.com<br>太多了 自己找一下 会发现到更好的<br>
<hr>
</hr><br>既然这东西是外国人比较强，所以外国网站更新的比较快，你就硬着头皮看吧，不是很难的，又不是文学。www.codeproject.com比较好。分类明确，难以适中。适合各个人群<br>
<hr>
</hr><a href="http://www.pda2008.net/bbs2001/list.asp?boardid=36">http://www.pda2008.net/bbs2001/list.asp?boardid=36</a><br>http://www.palmheart.net/index.php?name=PNphpBB2&amp;file=viewforum&amp;f=29<br>http://digi.pchome.net/bbs5.htm<br>http://www.echoice.com.cn/bbs/index.asp?luntan=12<br>
<hr>
</hr>http://jztele.com/~coldice/book/net/<br>里面有很多有用的<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">c#</strong>书,书中自然有很多的例子了. </div>
</div>
<img src ="http://www.cnblogs.com/xxrl/aggbug/681259.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41819/" target="_blank">[新闻]英特尔雅虎开发网络计算机频道</a>]]></description></item><item><title>近日探得用C++将二进制数据存储到XML文件的方法，因在研究时，未得到网上其他同仁的帮助(网上搜索了半天没有相关资料，只有DOTNET的），在这里不敢独享，给别的同仁在搜索时能够搜索到相关资料，也算是绵薄之力！ ) </title><link>http://www.cnblogs.com/xxrl/archive/2005/12/09/294138.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Fri, 09 Dec 2005 14:17:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2005/12/09/294138.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/294138.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2005/12/09/294138.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/294138.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/294138.html</trackback:ping><description><![CDATA[<DIV class=postText>
<P>C++</P>
<P>二进制数据</P>
<P>XML文件</P>
<P>&nbsp;</P>
<P><A href="http://www.laibm.com/XMLProject.rar">http://www.laibm.com/XMLProject.rar</A> </P>
<P>如果想要，却不能下载了，就给我email吧。</P>
<P>此功能需要MSXML4支持！去微软网站下载即可<BR><BR>地址就不说了 找找就找到了&nbsp;<BR></P></DIV><img src ="http://www.cnblogs.com/xxrl/aggbug/294138.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41818/" target="_blank">[新闻]Windows Live视频邮件9月9日开始测试</a>]]></description></item><item><title>近日发现vs2005安装的一个问题</title><link>http://www.cnblogs.com/xxrl/archive/2005/12/01/288512.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Thu, 01 Dec 2005 05:10:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2005/12/01/288512.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/288512.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2005/12/01/288512.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/288512.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/288512.html</trackback:ping><description><![CDATA[<P>大家可以看看自己的vs2005镜像文件里面，在wcu里面的setup.ini，是不是能找到beta2的字样，我的是如下：</P>
<P><BR>[Setup]<BR>Ver=8.0<BR>Name=Visual Studio 2005<BR>ProdName=Microsoft Visual Studio 2005 Team Suite - ENU<BR>RegKey=VisualStudio</P>
<P>/////////////////////////////////////////看下面&nbsp; 居然是beta2 ，可我安装完了是RTM版本啊&nbsp; 和网上说的一样啊 我狂晕<BR>BannerName=&lt;font size=10pt&gt;Microsoft&amp;reg;&lt;/font&gt;&lt;br&gt;&lt;font size=18pt&gt;Visual Studio&amp;reg; 2005 Beta 2 Setup&lt;/font&gt;</P>
<P>[Baseline]<BR>Dir=.\wcu<BR>FileName=setup.exe</P>
<P>[Client]<BR>Dir=.\setup<BR>FileName=setup.exe<BR>LANGCODE=ENU</P>
<P>[Servicing]<BR>FileName=vsupdate.exe<BR>Param=/mode=client /locale=1033 /vsui=1</P>
<P>[Server]<BR>Dir=.<BR>FileNameApp=RemoteComponents.hta<BR>FileName=RemoteComponents.htm</P>
<P>[PrevProductIds]<BR>{A8904F30-34E7-494D-8D62-F480CBD9EA0D}<BR>。。。。。。。。。。。。<BR>{908661A2-ABA7-4343-A3B3-AD72A3920A6C}</P>
<P>[Documentation]<BR>DIR=..\MSDN<BR>Version=2003FEB&nbsp;&nbsp; -----------------------------&gt;看这里</P><img src ="http://www.cnblogs.com/xxrl/aggbug/288512.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title>近日发现vs2005安装的一个问题</title><link>http://www.cnblogs.com/xxrl/archive/2005/12/01/288511.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Thu, 01 Dec 2005 05:10:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2005/12/01/288511.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/288511.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2005/12/01/288511.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/288511.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/288511.html</trackback:ping><description><![CDATA[<P>大家可以看看自己的vs2005镜像文件里面，在wcu里面的setup.ini，是不是能找到beta2的字样，我的是如下：</P>
<P><BR>[Setup]<BR>Ver=8.0<BR>Name=Visual Studio 2005<BR>ProdName=Microsoft Visual Studio 2005 Team Suite - ENU<BR>RegKey=VisualStudio</P>
<P>/////////////////////////////////////////看下面&nbsp; 居然是beta2 ，可我安装完了是RTM版本啊&nbsp; 和网上说的一样啊 我狂晕<BR>BannerName=&lt;font size=10pt&gt;Microsoft&amp;reg;&lt;/font&gt;&lt;br&gt;&lt;font size=18pt&gt;Visual Studio&amp;reg; 2005 Beta 2 Setup&lt;/font&gt;</P>
<P>[Baseline]<BR>Dir=.\wcu<BR>FileName=setup.exe</P>
<P>[Client]<BR>Dir=.\setup<BR>FileName=setup.exe<BR>LANGCODE=ENU</P>
<P>[Servicing]<BR>FileName=vsupdate.exe<BR>Param=/mode=client /locale=1033 /vsui=1</P>
<P>[Server]<BR>Dir=.<BR>FileNameApp=RemoteComponents.hta<BR>FileName=RemoteComponents.htm</P>
<P>[PrevProductIds]<BR>{A8904F30-34E7-494D-8D62-F480CBD9EA0D}<BR>。。。。。。。。。。。。<BR>{908661A2-ABA7-4343-A3B3-AD72A3920A6C}</P>
<P>[Documentation]<BR>DIR=..\MSDN<BR>Version=2003FEB&nbsp;&nbsp; -----------------------------&gt;看这里</P><img src ="http://www.cnblogs.com/xxrl/aggbug/288511.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title>VC中处理C1010错误的两种方法</title><link>http://www.cnblogs.com/xxrl/archive/2005/11/20/280809.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Sun, 20 Nov 2005 10:17:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2005/11/20/280809.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/280809.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2005/11/20/280809.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/280809.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/280809.html</trackback:ping><description><![CDATA[<P><SPAN>近日在程序中包含一压缩算法的头文件和实现文件，编译出现下面的错误</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US>c:\documents and settings\administrator\my documents\updata\lz77.cpp(491) : fatal error C1010: unexpected end of file while looking for precompiled header directive</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN>经查</SPAN><SPAN lang=EN-US>MSDN</SPAN><SPAN>，乃编译头文件的设置错误问题，可</SPAN><SPAN lang=EN-US>vc</SPAN><SPAN>自己不设置，非要我们设置，烦人，在研究了</SPAN><SPAN lang=EN-US>/YX /Y</SPAN><SPAN>一系列</SPAN><SPAN lang=EN-US>msdn</SPAN><SPAN>，并在</SPAN><SPAN lang=EN-US>MSDN</SPAN><SPAN>中的</SPAN><SPAN lang=EN-US>vc2003</SPAN><SPAN>的帮助下（这个帮助里面的操作，</SPAN><SPAN lang=EN-US>vc6</SPAN><SPAN>里面没有对应的界面，烦人），更改了</SPAN><SPAN lang=EN-US>Project Settings</SPAN><SPAN>，解决问题，现分享经验：</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN>图中</SPAN></P>
<P><SPAN>添加的文件有两个，一个是头文件，可一个是实现文件</SPAN></P>
<P><SPAN>在实现文件中设置即可，如下图操作所示：</SPAN></P>
<P></P>
<P></P>
<P><SPAN lang=EN-US>&nbsp;<IMG height=400 src="http://img170.photo.163.com/csdn.xxrl/20317254/499208391.jpg" width=600 border=0></SPAN></P>
<P><SPAN lang=EN-US><IMG height=400 src="http://img170.photo.163.com/csdn.xxrl/20317254/499209235.jpg" width=600 border=0></SPAN></P>
<P><SPAN lang=EN-US><A href="http://img170.photo.163.com/csdn.xxrl/20317254/499209824.jpg"><IMG height=400 src="http://img170.photo.163.com/csdn.xxrl/20317254/499209824.jpg" width=600 border=0></A></SPAN></P>
<P><SPAN>另外一种直接在实现文件头部，添加</SPAN><SPAN lang=EN-US>&#8221;#include StdAfx.h<STDAFX.H>&#8221;,</SPAN><SPAN>即可编译。</SPAN></P><img src ="http://www.cnblogs.com/xxrl/aggbug/280809.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41816/" target="_blank">[新闻]Pogo浏览器</a>]]></description></item><item><title>关于获得MFC窗口其它类指针的方法(CSDN)</title><link>http://www.cnblogs.com/xxrl/archive/2005/05/12/153875.html</link><dc:creator>孔曰成仁,孟曰取义</dc:creator><author>孔曰成仁,孟曰取义</author><pubDate>Thu, 12 May 2005 04:24:00 GMT</pubDate><guid>http://www.cnblogs.com/xxrl/archive/2005/05/12/153875.html</guid><wfw:comment>http://www.cnblogs.com/xxrl/comments/153875.html</wfw:comment><comments>http://www.cnblogs.com/xxrl/archive/2005/05/12/153875.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/xxrl/comments/commentRss/153875.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xxrl/services/trackbacks/153875.html</trackback:ping><description><![CDATA[<p>访问应用程序的其它类</p>
<p>获得CWinApp:
<br/>&#160;-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp
<br/>&#160;-在其它类中只能用AfxGetApp()
</p>
<p>获得CMainFrame:
<br/>&#160;-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd
<br/>&#160;-在CChildFrame中可用GetParentFrame()
<br/>&#160;-在其它类中用AfxGetMainWnd()
</p>
<p>获得CChildFrame:
<br/>&#160;-在CView中用GetParentFrame()
<br/>&#160;-在CMainFrame中用MDIGetActive()或GetActiveFrame()
<br/>&#160;-在其它类中用AfxGetMainWnd()-&gt;MDIGetActive()或AfxGetMainWnd()-&gt;GetActiveFrame()
</p>
<p>获得CDocument:
<br/>&#160;-在CView中用GetDocument()
<br/>&#160;-在CChildFrame中用GetActiveView()-&gt;GetDocument()
<br/>&#160;-在CMainFrame中用
<br/>&#160;&#160;-if SDI:GetActiveView()-&gt;GetDocument()
<br/>&#160;&#160;-if MDI:MDIGetActive()-&gt;GetActiveView()-&gt;GetDocument()
<br/>&#160;-在其它类中
<br/>&#160;&#160;-if SDI:AfxGetMainWnd()-&gt;GetActiveView()-&gt;GetDocument()
<br/>&#160;&#160;-if MDI:AfxGetMainWnd()-&gt;MDIGetActive()-&gt;GetActiveView()-&gt;GetDocument()
</p>
<p>获得CView:
<br/>&#160;-在CDocument中 POSITION pos = GetFirstViewPosition();GetNextView(pos)
<br/>&#160;-在CChildFrame中 GetActiveView()
<br/>&#160;-在CMainFrame中
<br/>&#160;&#160;-if SDI:GetActiveView()
<br/>&#160;&#160;-if MDI:MDIGetActive()-&gt;GetActiveView()
<br/>&#160;-在其它类中
<br/>&#160;&#160;-if SDI:AfxGetMainWnd()-&gt;GetActiveView()
<br/>&#160;&#160;-if MDI:AfxGetMainWnd()-&gt;MDIGetActive()-&gt;GetActiveView()
</p>
<p>
<br/>不过要注意在doc中要取得view的指针C*View要注意类C*View声明的问题,
<br/>因为默认情况下,mfc在*View.h中已经包含了*Doc.h,如果在*Doc.h中包含
<br/>*View.h,就会引起嵌套包含问题,这样要在*Doc.h中加入 class C*View; 
<br/>而在*Doc.cpp中加入 #include &quot;*View.h&quot;
</p>
<p>//////////////////////////////////////////////////////////////////
<br/>其实完全可以在CYourApp中添加各种视或文档的指针，在那些视或文档初
<br/>始化的时候将指针传给CYourApp中的对应变量，这样以后不管在哪用上面
<br/>指针只需(CYourApp*)AfxGetApp()取其属性变量即可，明了而且清楚更是
<br/>方便我一直专门操作的说：）
</p>
<p>//////////////////////////////////////////////////////////////////
<br/>我先抛块砖，有玉的砸过来！
<br/>在何时何地，你都可以通过以下方法精确的得到任何一个对象（Application，DocTemplate,Document，View,Frame）
<br/>1。通过AfxGetApp()得到当前的App对象；
<br/>2。通过AfxGetMainWnd（）得到主窗口；
<br/>3。通过CMDIFrameWnd::GetActiveFrame得到当前活动窗口；
<br/>4。通过GetNextWindow()遍例所有的子窗口；（如果要得到你想要的子窗口，可以通过特定的成员变量来标志）；
<br/>5。通过CWinApp::GetFirstDocTemplatePostion()以及CWinApp::GetNextDocTemplate()的组合应用来遍历所有的DocTemplate对象，并且用CDocTemplate::GetDocString()来判断当前得到的文档莫板对象是哪个。
<br/>6。通过CDocTemplate::GetFirstDocPosition()以及CDocTemplate的GetNextDoc（）组合来遍历所有的该模板的文档对象，并用CDocument::GetDocTemplate()来得到文档模板，用CDocment::GetTitle() 或者GetPathName()来判断当前的文档是哪个。
<br/>7。通过CDocuemt的GetFirstViewPositon()以及GetNextView()来遍历视图对象，一般通过访问View的成员变量来区别各个视图；通过CView::GetDocument()来得到文档对象；
<br/>8。Frame-&gt;View： 通过GetActiveView方法；
<br/>9。Frame-&gt;Doc：通过GetActiveDocument();
<br/>10。View-&gt;Frame：GetParentFrame();
<br/>11。View-&gt;Doc:GetDocuemt()//前面已经说了。
<br/>12。Doc-&gt;View:前面说了；
<br/>13。Doc-&gt;Frame:不知道有没有很直接的方法。
<br/>MFC应用程序中指针的使用
</p>
<p>1) 在View中获得Doc指针
<br/>2) 在App中获得MainFrame指针
<br/>3) 在View中获得MainFrame指针
<br/>4) 获得View（已建立）指针
<br/>5) 获得当前文档指针
<br/>6) 获得状态栏与工具栏指针
<br/>7) 获得状态栏与工具栏变量
<br/>8) 在Mainframe获得菜单指针
<br/>9) 在任何类中获得应用程序类
<br/>10) 从文档类取得视图类的指针(1)
<br/>11) 在App中获得文档模板指针
<br/>12) 从文档模板获得文档类指针
<br/>13) 在文档类中获得文档模板指针
<br/>14) 从文档类取得视图类的指针(2)
<br/>15) 从一个视图类取得另一视图类的指针
</p>
<p>VC中编程对于刚刚开始学习的同学，最大的障碍和问题就是消息机制和指针获取与
<br/>操作。其实这些内容基本上是每本VC学习工具书上必讲的内容，而且通过MSDN很多
<br/>问题都能解决。下面文字主要是个人在编程中指针使用的一些体会，说的不当的地
<br/>方请指正。一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard(exe)框架，
<br/>无论是多文档还是单文档，都存在指针获取和操作问题。下面这节内容主要是一般
<br/>的框架，然后再讲多线程中的指针使用。使用到的类需要包含响应的头文件。首先
<br/>一般获得本类(视，文档，对话框都支持)实例指针this，用this的目的，主要可以通
<br/>过类中的函数向其他类或者函数中发指针，以便于在非本类中操作和使用本类中的
<br/>功能。
</p>
<p>&#160;1） 在View中获得Doc指针 CYouSDIDoc *pDoc=GetDocument();一个视只能有一个文
<br/>档。
<br/>&#160;2) 在App中获得MainFrame指针
<br/>CWinApp 中的 m_pMainWnd变量就是MainFrame的指针
<br/>也可以： CMainFrame *pMain =(CMainFrame *)AfxGetMainWnd();
<br/>&#160;3) 在View中获得MainFrame指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-&gt;m_pMainWnd;
<br/>&#160;4) 获得View（已建立）指针 CMainFrame *pMain=(CmaimFrame *)AfxGetApp()-&gt;m_pMainWnd;
<br/>CyouView *pView=(CyouView *)pMain-&gt;GetActiveView();
<br/>&#160;5) 获得当前文档指针 CDocument * pCurrentDoc =(CFrameWnd *)m_pMainWnd-&gt;GetActiveDocument();
<br/>&#160;6) 获得状态栏与工具栏指针 CStatusBar * pStatusBar＝(CStatusBar *)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_STATUS_BAR);
<br/>CToolBar * pToolBar=(CtoolBar *)AfxGetMainWnd()-&gt;GetDescendantWindow(AFX_IDW_TOOLBAR);
</p>
<p>&#160;7) 如果框架中加入工具栏和状态栏变量还可以这样 
<br/>(CMainFrame *)GetParent()-&gt;m_wndToolBar;
<br/>(CMainFrame *)GetParent()-&gt;m_wndStatusBar;
</p>
<p>&#160;8) 在Mainframe获得菜单指针 CMenu *pMenu=m_pMainWnd-&gt;GetMenu();
<br/>&#160;9) 在任何类中获得应用程序类
<br/>用MFC全局函数AfxGetApp()获得。
</p>
<p>&#160;10) 从文档类取得视图类的指针
<br/>我是从<a href="http://download.cqcnc.com/soft/program/article/vc/vc405.html">http://download.cqcnc.com/soft/program/article/vc/vc405.html</a>学到的，
<br/>从文档获得视图类指针目的一般为了控制同一文档的多个视图的定位问题，我的体会
<br/>特别是文字处理CEditView当产生多个视图类时，这个功能是非常需要的。 
<br/>CDocument类提供了两个函数用于视图类的定位：
<br/>GetFirstViewPosition()和GetNextView() 
<br/>virtual POSITION GetFirstViewPosition() const;
<br/>virtual CView* GetNextView(POSITION&amp; rPosition) const;
</p>
<p>注意：GetNextView()括号中的参数用的是引用方式，因此执行后值可能改变。
<br/>GetFirstViewPosition()用于返回第一个视图位置（返回的并非视图类指针，而是一
<br/>个POSITION类型值），GetNextView()有两个功能：返回下一个视图类的指针以及用
<br/>引用调用的方式来改变传入的POSITION类型参数的值。很明显，在Test程序中，只有
<br/>一个视图类，因此只需将这两个函数调用一次即可得到CTestView的指针如下（需定
<br/>义一个POSITION结构变量来辅助操作）： 
<br/>CTestView* pTestView;
<br/>POSITION pos=GetFirstViewPosition();
<br/>pTestView=GetNextView(pos);
</p>
<p>这样，便可到了CTestView类的指针pTestView.执行完几句后，变量pos=NULL,因为没
<br/>有下一个视图类，自然也没有下一个视图类的POSITION.但是这几条语句太简单，不
<br/>具有太强的通用性和安全特征；当象前面说的那样，当要在多个视图为中返回某个指
<br/>定类的指针时，我们需要遍历所有视图类，直到找到指定类为止。判断一个类指针指
<br/>向的是否某个类的实例时，可用IsKindOf()成员函数时行检查，如：
<br/>&#160;pView-&gt;IsKindOf(RUNTIME_CLASS(CTestView));
<br/>即可检查pView所指是否是CTestView类。
</p>
<p>有了以上基础，我们已经可以从文档类取得任何类的指针。为了方便，我们将其作
<br/>为一个文档类的成员函数，它有一个参数，表示要获得哪个类的指针。实现如下： 
<br/>CView* CTestDoc::GetView(CRuntimeClass* pClass)
<br/>{
<br/>&#160;CView* pView;
<br/>&#160;POSITION pos=GetFirstViewPosition();
</p>
<p>&#160;while(pos!=NULL){
<br/>&#160;&#160;pView=GetNextView(pos);
<br/>&#160;&#160;if(!pView-&gt;IsKindOf(pClass))
<br/>&#160;&#160;break;
<br/>&#160;}
</p>
<p>&#160;if(!pView-&gt;IsKindOf(pClass)){
<br/>&#160;&#160;AfxMessageBox(&quot;Connt Locate the View.\r\n <a href="http://www.VCKBASE.com">http://www.VCKBASE.com</a>&quot;);
<br/>&#160;&#160;return NULL;
<br/>&#160;}
</p>
<p>&#160;return pView;
<br/>}
</p>
<p>其中用了两次视图类的成员函数IsKindOf()来判断，是因为退出while循环有三种
<br/>可能：
</p>
<p>1.pos为NULL，即已经不存在下一个视图类供操作；
<br/>2.pView已符合要求。
</p>
<p>1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图
<br/>的位置同时返回当前视图指针，因此pos是pView的下一个视图类的POSITION,完全
<br/>有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一
<br/>个视图类时就如引。因此需采用两次判断。
<br/>使用该函数应遵循如下格式（以取得CTestView指针为例）：
<br/>CTestView* pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));
<br/>RUNTIME_CLASS是一个宏，可以简单地理解它的作用：将类的名字转化为
<br/>CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的，因为从同一个
<br/>基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要，但能避免一
<br/>些可能出现的麻烦。
</p>
<p>3.从一个视图类取得另一视图类的指针 综合1和2，很容易得出视图类之间互相获得
<br/>指针的方法：就是用文档类作中转，先用1的方法得到文档类的指针，再用2的方法，
<br/>以文档类的视图定位函数取得另一个视图类。同样，可以实现成一个函数：
<br/>（假设要从CTestAView中取得指向其它视图类的指针）
<br/>CView* CTestAView::GetView(CRuntimeClass* pClass)
<br/>{
<br/>&#160;CTestDoc* pDoc=(CTestDoc*)GetDocument();
<br/>&#160;CView* pView;
<br/>&#160;POSITION pos=pDoc-&gt;GetFirstViewPosition();
<br/>&#160;while(pos!=NULL){
<br/>&#160;&#160;pView=pDoc-&gt;GetNextView(pos);
<br/>&#160;&#160;if(!pView-&gt;IsKindOf(pClass))
<br/>&#160;&#160;break;
<br/>&#160;}
<br/>&#160;if(!pView-&gt;IsKindOf(pClass)){
<br/>&#160;&#160;AfxMessageBox(&quot;Connt Locate the View.&quot;);
<br/>&#160;&#160;return NULL;
<br/>&#160;}
</p>
<p>&#160;return pView;
<br/>}
<br/>这个函数和2中的GetView()相比，一是多了第一句以取得文档类指针，二是在
<br/>GetFirstViewPosition()和GetNextView()前加上了文档类指针，以表示它们是文档
<br/>类成员函数。有了此函数；当要从CTestAView中取得CTestBView的指针时，只需如
<br/>下：CTestBView* pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView));
<br/>11）对于单文档中也可以加入多个文档模板，但是一般的开发就使用MDI方式开发
<br/>多文档模板，其方法与上述视图的获取方法很接近，这里稍做解释，如果不清楚，
<br/>请查阅MSDN，（以下四个内容（11、12、13、14）来源：
<br/><a href="http://sanjianxia.myrice.com/vc/vc45.htm">http://sanjianxia.myrice.com/vc/vc45.htm</a>）
</p>
<p>可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板
<br/>的位置；利用该值来调用CWinApp::GetNextDocTemplate函数，获得第一个
<br/>CDocTemplate对象指针。 POSITION GetFirstDocTemplate( ) const; 
<br/>CDocTemplate *GetNextDocTemplate( POSITION &amp; pos ) const;
</p>
<p>第二个函