﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-You Are Not Prepared!!-随笔分类-精进持戒</title><link>http://www.cppblog.com/NWAO/category/18886.html</link><description>It won't kill you to make you stronger!</description><language>zh-cn</language><lastBuildDate>Sat, 12 Dec 2015 11:04:02 GMT</lastBuildDate><pubDate>Sat, 12 Dec 2015 11:04:02 GMT</pubDate><ttl>60</ttl><item><title>PRD算法中的C计算方法</title><link>http://www.cppblog.com/NWAO/archive/2015/12/11/212458.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Fri, 11 Dec 2015 07:11:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2015/12/11/212458.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/212458.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2015/12/11/212458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/212458.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/212458.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/NWAO/archive/2015/12/11/212458.html'>阅读全文</a><img src ="http://www.cppblog.com/NWAO/aggbug/212458.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2015-12-11 15:11 <a href="http://www.cppblog.com/NWAO/archive/2015/12/11/212458.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用lua判断点在多边形内部</title><link>http://www.cppblog.com/NWAO/archive/2015/09/19/211870.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Sat, 19 Sep 2015 04:01:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2015/09/19/211870.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/211870.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2015/09/19/211870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/211870.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/211870.html</trackback:ping><description><![CDATA[&nbsp;<div style="padding: 4px 5px 4px 4px; border: 1px solid #cccccc; border-image: none; width: 98%; font-size: 13px; word-break: break-all; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #000000; ">--</span><span style="color: #000000; ">获取多边形外围矩形<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">function&nbsp;GetPolyOutRect(p,&nbsp;poly)<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;l_max_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].X;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;l_max_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">].Y;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;l_min_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;l_max_x;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;l_min_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;l_min_y;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;#poly&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;l_max_x&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;poly[i].x&nbsp;then<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_max_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[i].x;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;l_max_y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;poly[i].y&nbsp;then<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_max_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[i].y;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;l_min_x&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;poly[i].y&nbsp;then<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_min_x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[i].y;<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;l_min_y&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;poly[i].y&nbsp;then<br /></span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_min_y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;poly[i].y;<br /></span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;{l_min_x,l_max_x,l_min_y,l_max_y};<br /></span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">end<br /></span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">--</span><span style="color: #000000; ">点是否在多边形外围矩形中<br /></span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">function&nbsp;IsPtInPolyRect(p,&nbsp;poly)<br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;rect&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetPolyOutRect(p,&nbsp;poly);<br /></span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;p.x&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;rect[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;or&nbsp;p.x&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;rect[</span><span style="color: #000000; ">2</span><span style="color: #000000; ">]&nbsp;or&nbsp;p.y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;rect[</span><span style="color: #000000; ">3</span><span style="color: #000000; ">]&nbsp;or&nbsp;p.y&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;rect[</span><span style="color: #000000; ">4</span><span style="color: #000000; ">]&nbsp;then<br /></span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">end<br /></span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">--</span><span style="color: #000000; ">判断点在多边形内true&nbsp;or&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">,点正好在多边形边上时返回值不定<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">function&nbsp;IsPtInPoly(p,&nbsp;poly)<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;IsPtInPolyRect(p,&nbsp;poly)&nbsp;then<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;l_odd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;local&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;#poly;<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;#poly&nbsp;</span><span style="color: #0000FF; ">do</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((poly[i].y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;p.y&nbsp;and&nbsp;poly[j].y&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;p.y)&nbsp;or&nbsp;poly[j].y&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;p.y&nbsp;and&nbsp;poly[i].y&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;p.y))&nbsp;and&nbsp;(poly[i].x&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;p.x&nbsp;and&nbsp;poly[j].x&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;p.x)&nbsp;then<br /></span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;poly[i].x&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(p.y&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;poly[i].y)</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(poly[j].x&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;poly[i].x)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(poly[j].y&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;poly[i].y)&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;p.x&nbsp;then<br /></span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;l_odd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;not&nbsp;l_odd;<br /></span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;end<br /></span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;l_odd;<br /></span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">end<br /></span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">local&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2.5</span><span style="color: #000000; ">};<br /></span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">local&nbsp;poly&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{{x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">},{x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">,&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">},{x&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">,&nbsp;y&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">}}<br /></span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">local&nbsp;result&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;IsPtInPoly(p,&nbsp;poly);<br /></span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; ">print(result);<br /></span><span style="color: #008080; ">55</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">--</span><span style="color: #000000; ">由于无法从代码中直接复制，纯手敲代码，若有疏漏，请留言。<br /></span><span style="color: #008080; ">56</span>&nbsp;--代码参考了网上众多前辈的教程，不一一列出，感谢前辈<span style="color: #000000; "><br /></span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #000000; "><br /></span><span style="color: #008080; ">59</span>&nbsp;<span style="color: #000000; "></span></div><strong></strong><em></em><u></u><sub></sub><sup></sup><strike></strike><img src ="http://www.cppblog.com/NWAO/aggbug/211870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2015-09-19 12:01 <a href="http://www.cppblog.com/NWAO/archive/2015/09/19/211870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在每一行下面都插入一行类似内容</title><link>http://www.cppblog.com/NWAO/archive/2014/12/17/209212.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Wed, 17 Dec 2014 10:09:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2014/12/17/209212.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/209212.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2014/12/17/209212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/209212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/209212.html</trackback:ping><description><![CDATA[情景： 左侧为原有txt内容 &nbsp;右侧为要改为的格式<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;Name_01=xxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_01=xxx<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_01=1<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;Name_02=yyy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_02=yyy<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_02=1<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;Name_03=ffd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_03=ffd<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_03=2<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;Name_04=ssd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_04=ssd<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_04=2<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" />.<br /><span style="color: #008080; ">10</span>&nbsp;Name_97=qqq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_97=qqq<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_97=49<br /><span style="color: #008080; ">12</span>&nbsp;Name_98=eew&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_98=eew<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_98=49&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;Name_99=zzz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name_99=zzz<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type_99=50</div>
<br />
步骤：<br />
首先我们给每一行下面插入同样的内容， vim &nbsp;xx,yyg/^/norm oType_01=1 &nbsp; &nbsp; &nbsp;&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;解释：xx,yy 指定范围 &nbsp;执行g命令，用^匹配每一行， norm的作用 是把后面的内容当作普通模式下的按键 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;oType_01=1&nbsp;就会在下面新加一并写入Type_01=1<br />
然后将新插入的行作相应修改 &nbsp;xx,yys#Type_\zs\d\+\ze#\=(line(".")+1)/2# &nbsp;(这条命令可以参考<a href="http://www.cppblog.com/NWAO/archive/2014/08/26/208141.html">这篇文章</a>理解)<img src ="http://www.cppblog.com/NWAO/aggbug/209212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2014-12-17 18:09 <a href="http://www.cppblog.com/NWAO/archive/2014/12/17/209212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器  远程桌面限制IP  与 VPN 结合的安全策略</title><link>http://www.cppblog.com/NWAO/archive/2014/09/23/208386.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 23 Sep 2014 09:04:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2014/09/23/208386.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/208386.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2014/09/23/208386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/208386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/208386.html</trackback:ping><description><![CDATA[前几天搞了搞VPN，也搞了搞远程桌面限制IP。 现在需要结合起来使用，提高服务器安全性。 最终结果将是 所有服务器 仅允许 内网IP进行远程桌面， 服务器组内专有一台VPN服务器可供连接，管理人员从公司连接好VPN后，如同直接访问内网服务器那样访问业务服务器。<br /><br />一。限制远程桌面IP<br /><ul><li>&nbsp; &nbsp; &nbsp; 打开管理工具--&gt;本地安全策略--&gt;IP本地安全策略--&gt;右键--&gt;管理IP筛选器列表和筛选器操作, &nbsp;</li></ul>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; a 创建两个 IP筛选器 &nbsp; [allow] 从 192.168.1.0/24 到 我的IP地址 端口3389<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[deny] 从 任何IP 到 我的IP 端口3389<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b 创建两个筛选器操作 [allow] 许可<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[deny] 禁止<br /><ul><li>&nbsp; &nbsp; &nbsp; 有了上面这两个筛选器 和 对应的操作 我们就可以创建安全策略了. &nbsp;IP本地安全策略--&gt;右键--&gt;创建IP安全策略</li></ul>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;a 首先允许我们自己的内网IP &nbsp;点击添加 选中 名字为[allow]的IP筛选器, &nbsp;再选择 [allow]的筛选器操作, 由于这里的操作我选了&#8220;许可&#8221;,后面的验证方式不必选择。<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b 然后禁止其它所有人的IP &nbsp; &nbsp; 点击添加 选中 名字为[deny]的IP筛选器, &nbsp;再选择 [deny]的筛选器操作<br /><ul><li>现在我们禁止了所有的IP 进行远程桌面连接, 同时 又允许了自己的内网IP进行远程桌面。即只有内网IP可以进行远程桌面操作.</li></ul>&nbsp; &nbsp; &nbsp; 具体的图可以参考<a href="http://wenku.baidu.com/link?url=UTd4nA2uvNGe-16EgErFSV0rLDfpWSXTBxNJPzeqnFHGwfRwZCstmpXNcRRSUJIkbZbICfy9fSYDBXNpwnD1ArkpA5UCaB7ay598NqHtX6u" title="百度文库">百度文库</a>。<br />二。 建立VPN服务器(Window2008)<br /><ul><li>&nbsp; &nbsp; &nbsp; 打开管理工具--&gt;服务器管理器--&gt;角色--&gt;右键--&gt;添加角色--&gt;网络策略和访问服务,&nbsp;</li></ul>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 安装好后，右键进行自定义配置，选择VPN NAT LAN路由启动服务.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 完成后修改其属性--&gt;安全--&gt;验证方式仅留下MS-CHAP V2, &nbsp;取消IPV6相关设置，并且指定好IP地址池，192.168.99.100-192.168.99.110.<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 在路由和远程访问--&gt;IPv4--&gt;NAT右键--&gt;新增接口--&gt;选择外网网卡--&gt;公用接口连接到Internet(不选择 在此接口上启用NAT,因为我们这里不打算使用VPN服务器的网络资源上网,而使用客户机自己的网络资源,见第三步第3条)<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;在路由和远程访问--&gt;IPv4--&gt;NAT右键--&gt;新增接口--&gt;选择内网网卡--&gt;公用接口连接到Internet,并且勾上 在此接口上启用NAT,以便客户机可以通过VPN服务器的内网访问其它服务器.(这个网卡的设置是试验出来的,内网的不选 在此接口上启用NAT,则不能访问其它服务器,转发原理不太明白)<br /><ul><li>&nbsp; &nbsp; &nbsp; 建立一个专用的VPN帐户，指定其属性--&gt;拨入 为允许拨入.</li></ul>&nbsp; &nbsp; &nbsp; 具体的图可以参考<a href="http://skytech.blog.51cto.com/2955395/626640" title="ske_tech的文章">ske_tech的文章</a><br />三。 客户端建立VPN连接<br /><ul><li>&nbsp; &nbsp; &nbsp; 控制面板--&gt;网络和 Internet--&gt;网络和共享中心 建立VPN连接 填入VPN服务器地址，以及刚才添加的VPN帐户，跳过验证阶段。</li><li>&nbsp; &nbsp; &nbsp; 然后修改，VPN连接属性--&gt;安全--&gt;仅允许MS-CHAP V2验证,&nbsp;VPN连接属性--&gt;网络--&gt;同样去掉IPV6</li><li>&nbsp; &nbsp; &nbsp; 修改VPN连接属性--&gt;网络--&gt;IP V4属性--&gt;高级--&gt;取消"在远程网络上使用默认网关"(使得连上VPN后可以用本机访问互联网)</li><li>&nbsp; &nbsp; &nbsp; 添加一路由信息,以管理员身份打开命令行窗口, 执行 route add 192.168.1.0/24 192.168.99.100</li></ul><br />四。 连接VPN测试<br />&nbsp; &nbsp; &nbsp; &nbsp;设置好以后,&nbsp;打开远程桌面,&nbsp;不连接VPN, 直接使用服务器外网IP连接不上, 直接连服务器内网IP也连不上.<br />&nbsp; &nbsp; &nbsp; &nbsp;连接VPN, 连接远程服务器的内网IP 192.168.1.3,可以连接上. 实现了我们根据VPN IP限制服务器远程桌面的目标.<br /><br />五。 存在问题<br /><ul><li>&nbsp; &nbsp; &nbsp; &nbsp;在限制远程连接IP时,若筛选器操作不选择"许可",而使用"协商安全",并且也指定好 身份验证方法 为 预共享字符串, 则在允许列表中的机器还是不能连接该服务器. 原因不明</li></ul><ul><li>在路由和远程访问--&gt;IPv4--&gt;NAT右键--&gt;新增接口 下的NAT设置依然不太明白原理</li><li>在客户端建立好VPN连接后,添加的路由在VPN断开后会失效,再次连接上需要再添加. 使用route add -p也不行. 原因不明<br /><br />由于时间比较仓促, 不足之处还望指正.如需转载请注明出处.<a href="http://www.cppblog.com/NWAO/admin/EditPosts.aspx?postid=208350">http://www.cppblog.com/NWAO/admin/EditPosts.aspx?postid=208350</a></li></ul><img src ="http://www.cppblog.com/NWAO/aggbug/208386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2014-09-23 17:04 <a href="http://www.cppblog.com/NWAO/archive/2014/09/23/208386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 连接 windows vpn 服务器 记录</title><link>http://www.cppblog.com/NWAO/archive/2014/09/23/208350.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 23 Sep 2014 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2014/09/23/208350.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/208350.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2014/09/23/208350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/208350.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/208350.html</trackback:ping><description><![CDATA[需求是：从公司的电脑能VPN 到 远程电脑(该机器是云服务器，外网ip123.123.123.123 和内网IP10.10.10.10 ,只有一块网卡ps:在ipconfig里只能看到内网ip，很奇怪)，并且要能访问到远程电脑所在内网的其它电脑<br /><br />昨天搞的是 windows连&nbsp; linux服务器，今天领导要求反过来连，于是折腾了一天又。<br />1. 建立windows vpn server<br />在windows上新建好 VPN服务&nbsp; 图不弄了<a title="参考这个" href="http://skytech.blog.51cto.com/2955395/626640">参考这个</a><br /><br />需要注意的是我对 路由和远程访问 --&gt;属性 --&gt;安全 --&gt;身份认证方法 作了修改 只留下 mschap v2<br />vpn 网段我使用了192.168.1.x<br />2. 配置Linux<br />linux上需要先&nbsp; yum install pptp-setup<br /><br />随后修改配置文件 vi&nbsp; /etc/ppp/options.pptp 中 <br />require-mschap-v2&nbsp; <br />require-mppe&nbsp; <font color="#000000" face="Verdana"><br />mppe required,stateless<br /><br />建立连接 pptpsetup --create myvvpn --username vpntest --password 123456 --encrypt --start<br />(不设置好身份认证方法这里会报错。)<br />现在ping 192.168.1.x可以通了，但想ping 远程内网10.10.10.X还不行。需要加一些route<br />route add -net 10.10.10.0/24 netmask 255.255.255.0 dev ppp0<br />现在就可以了</font><img src ="http://www.cppblog.com/NWAO/aggbug/208350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2014-09-23 14:47 <a href="http://www.cppblog.com/NWAO/archive/2014/09/23/208350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux vpn服务器架设流程 记录</title><link>http://www.cppblog.com/NWAO/archive/2014/09/16/208333.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 16 Sep 2014 12:39:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2014/09/16/208333.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/208333.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2014/09/16/208333.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/208333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/208333.html</trackback:ping><description><![CDATA[<div>&nbsp;公司使用了某某云服务器，只有一个双网卡机器的可以远程上去，再连接其它几台。每次要改点东西连接服务器都是个头疼的事，于是想到用VPN解决这个问题。方法是把双网卡的机器搞成linux，再架上vpn，通过它直接访问那几台服务器。<br />环境是: CentOS 6.5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网络&nbsp;&nbsp; 双网卡123.23.23.23&nbsp;(外) 10.16.16.16(内) 地址都是示例地址。<br />经过一下午baidu终于搞成了。现在记录如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.首先检查MPPE模块加载与否<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">modprobe&nbsp;ppp</span><span style="color: #000000">-</span><span style="color: #000000">compress</span><span style="color: #000000">-</span><span style="color: #000000">18</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;echo&nbsp;MPPE&nbsp;IS&nbsp;OK</span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果内核上有该模块就会输出MPPE is ok<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.安装软件<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装ppp 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">yum&nbsp;install&nbsp;ppp</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装iptables 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">yum&nbsp;install&nbsp;iptables<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">iptables&nbsp;start&nbsp;chkconfig&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">level&nbsp;</span><span style="color: #000000">35</span><span style="color: #000000">&nbsp;iptables&nbsp;on</span></div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装pptp 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">wget&nbsp;http:</span><span style="color: #008000">//</span><span style="color: #008000">poptop.sourceforge.net/yum/stable/packages/pptpd-1.4.0-1.el6.x86_64.rpm</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />rpm&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">ivh&nbsp;pptpd</span><span style="color: #000000">-</span><span style="color: #000000">1.4</span><span style="color: #000000">.</span><span style="color: #000000">0</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">.el6.x86_64.rpm</span></div>&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.&nbsp;更改PPP PPTP的配置文件<br />ppp<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">vi&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">ppp</span><span style="color: #000000">/</span><span style="color: #000000">options.pptpd<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />修改<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />ms</span><span style="color: #000000">-</span><span style="color: #000000">dns&nbsp;</span><span style="color: #000000">8.8</span><span style="color: #000000">.</span><span style="color: #000000">8.8</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />ms</span><span style="color: #000000">-</span><span style="color: #000000">dns&nbsp;</span><span style="color: #000000">8.8</span><span style="color: #000000">.</span><span style="color: #000000">4.4 </span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />debug</span></div><br />&nbsp;pptpd 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000"> vi /etc/pptpd.conf<br /></span><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /> 修改<br /><span style="color: #000000"><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />&nbsp;localip 123.23.23.23<br />&nbsp;&nbsp;&nbsp;remoteip 192.168.0.201-210</span></div><br />增加VPN帐号 
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">vi </span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">ppp</span><span style="color: #000000">/</span><span style="color: #000000">chap</span><span style="color: #000000">-</span><span style="color: #000000">secrets<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />增加一行<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />vpntest pptpd </span><span style="color: #000000">123456</span><span style="color: #000000"> </span><span style="color: #000000">192.168</span><span style="color: #000000">.</span><span style="color: #000000">0.209</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br />&nbsp;&nbsp;&nbsp;&nbsp; 5.&nbsp;打开内核的转发功能<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000"> vi </span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">sysctl.conf<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /> 修改<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /> net.ipv4.ip_forward</span><span style="color: #000000">=</span><span style="color: #000000">1</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /> 然后<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /> sysctl </span><span style="color: #000000">-</span><span style="color: #000000">p</span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6打开pptpd服务<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">pptpd start chkconfig </span><span style="color: #000000">--</span><span style="color: #000000">level </span><span style="color: #000000">35</span><span style="color: #000000"> pptpd on</span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7配置iptables<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000"> iptables </span><span style="color: #000000">-</span><span style="color: #000000">A INPUT </span><span style="color: #000000">-</span><span style="color: #000000">p gre </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A INPUT </span><span style="color: #000000">-</span><span style="color: #000000">p tcp </span><span style="color: #000000">-</span><span style="color: #000000">m tcp </span><span style="color: #000000">--</span><span style="color: #000000">dport </span><span style="color: #000000">1723</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A INPUT </span><span style="color: #000000">-</span><span style="color: #000000">m state </span><span style="color: #000000">--</span><span style="color: #000000">state RELATED,ESTABLISHED </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A FORWARD </span><span style="color: #000000">-</span><span style="color: #000000">s </span><span style="color: #000000">192.168</span><span style="color: #000000">.</span><span style="color: #000000">0.0</span><span style="color: #000000">/</span><span style="color: #000000">24</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">o eth0 </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A FORWARD </span><span style="color: #000000">-</span><span style="color: #000000">d </span><span style="color: #000000">192.168</span><span style="color: #000000">.</span><span style="color: #000000">0.0</span><span style="color: #000000">/</span><span style="color: #000000">24</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">i eth1 </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">t nat </span><span style="color: #000000">-</span><span style="color: #000000">A POSTROUTING </span><span style="color: #000000">-</span><span style="color: #000000">s </span><span style="color: #000000">192.168</span><span style="color: #000000">.</span><span style="color: #000000">0.0</span><span style="color: #000000">/</span><span style="color: #000000">24</span><span style="color: #000000"> </span><span style="color: #000000">-</span><span style="color: #000000">o eth0 </span><span style="color: #000000">-</span><span style="color: #000000">j MASQUERADE<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A INPUT </span><span style="color: #000000">-</span><span style="color: #000000">p icmp </span><span style="color: #000000">-</span><span style="color: #000000">m icmp </span><span style="color: #000000">--</span><span style="color: #000000">icmp</span><span style="color: #000000">-</span><span style="color: #000000">type any </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A INPUT </span><span style="color: #000000">-</span><span style="color: #000000">m state </span><span style="color: #000000">--</span><span style="color: #000000">state RELATED,ESTABLISHED </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />iptables </span><span style="color: #000000">-</span><span style="color: #000000">A OUTPUT </span><span style="color: #000000">-</span><span style="color: #000000">m state </span><span style="color: #000000">--</span><span style="color: #000000">state NEW,RELATED,ESTABLISHED </span><span style="color: #000000">-</span><span style="color: #000000">j ACCEPT<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #000000">/</span><span style="color: #000000">etc</span><span style="color: #000000">/</span><span style="color: #000000">init.d</span><span style="color: #000000">/</span><span style="color: #000000">iptables save<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />service iptables restart<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8重启下pptpd<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">service pptpd restart<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span></div><br />&nbsp;&nbsp;&nbsp;&nbsp;9 从win7建立vpn连接测试<br />创建一个VPN连接&nbsp;填入设置的IP&nbsp;&nbsp;123.23.23.23 用户名 vpntest&nbsp;密码123456 连接 成功后最好把VPN连接 中属性\连接下的ipv6去掉。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />参考&nbsp;&nbsp;&nbsp;<a title="这篇文章" href="http://www.cnblogs.com/sixiweb/archive/2012/11/20/2778732.html">这篇文章</a><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div><img src ="http://www.cppblog.com/NWAO/aggbug/208333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2014-09-16 20:39 <a href="http://www.cppblog.com/NWAO/archive/2014/09/16/208333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用VIM批量更改数字的两个办法</title><link>http://www.cppblog.com/NWAO/archive/2014/08/26/208141.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 26 Aug 2014 09:16:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2014/08/26/208141.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/208141.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2014/08/26/208141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/208141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/208141.html</trackback:ping><description><![CDATA[<div>最近遇到一个问题，有一个表以前的sql备份文件，想把它再导回该表中，但ID一列与当前表中已有数据有冲突。<br />只要把ID的数字改一下就可以直接导了，但有2000多行数据，一行行改会显得很蠢，想到用VIM的替换命令s完成这一任务。<br />&nbsp;&nbsp;&nbsp; 每行数据均为 INSERT INTO `TABLEX` VALUES ('300', 'XXXXX'<br />...etc),VALUES中的第一个数即为ID.<br />&nbsp;&nbsp;&nbsp; 经过一番搜索+探索，得到以下命令解决问题:<br />第一个<br />&nbsp;&nbsp;&nbsp; %s/\(VALUES ('\)\d\+\('\)/\=submatch(1).(line("."))+50).submatch(2)/<br />解释：%s %代表替换命令s在全文执行, 替换命令格式是 s/匹配串/替换串/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\(VALUES ('\)\d\+\('\)/ 是匹配串，匹配每一行中的VALUES ('数字' 这一段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\=submatch(1).(line("."))+50).submatch(2)/ 替换串 <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \=是使用后面的函数的意思<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; submatch 匹配前面用 \( \)包含的部分如\(VALUES ('\)将VALUES ('作为submatch(1)的匹配对象。submatch(2)则匹配 数字后面的'<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多个函数式使用.将结果连接起来<br /><br />第二个,这个是后来才看到了，这个更简洁些。<br />&nbsp;&nbsp;&nbsp; %s/VALUES ('\zs\d\+\ze/\=line(".")+50/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %s 同上<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /VALUES ('\zs\d\+\ze/ 匹配串，\zs代表的是替换操作开始处，\ze代表的是替换操作结束处，这样后面的替换也只针对这一段进行替换。<br />&nbsp;&nbsp;&nbsp;&nbsp; /\=line(".")+50/ 替换串，由于前面指定了替换段，这里的替换内容直接指定合适的数值即可<br /><br />PS: 上述s命令的匹配串都使用到了正则表达式，这里不作介绍。<br />本人使用的环境是win7 x64 + GVim7.4。<br />对Vim本人也是初学乍练，谬误之处望大家指正。</div><img src ="http://www.cppblog.com/NWAO/aggbug/208141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2014-08-26 17:16 <a href="http://www.cppblog.com/NWAO/archive/2014/08/26/208141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++对象模型</title><link>http://www.cppblog.com/NWAO/archive/2013/10/30/203596.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Wed, 30 Oct 2013 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2013/10/30/203596.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/203596.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2013/10/30/203596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/203596.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/203596.html</trackback:ping><description><![CDATA[1<br />2<br />3<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.1 Data Member绑定<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; 编译器以对类声明中函数内出现的变量的决议在类声明结束后进行，而类内函数参数列表则在第一次出现时被决议，所以请把nested type声明放在类声明起始处。<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.2 Data Member布局<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; C++规范要求各access section内变量在内存中与声明顺序一致，而各access section顺序未限制，当前都是将access sections连在一起<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.3 Data Member存取<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当使用指针存取成员时，若在其继承结构中有一个virtual base class，且存取的是该virtual base class时，会和使用类对象直接存取有重大差别。由于无法在编译时确定指针具体指向何种类型，无法确定变量offset，需要在执行期先从对象中获取virtual base class的地址，然后找到成员。<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.4 继承<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当虚继承出现时，Class将被分割为 不变局部 和 共享局部 两部分。一般先安排不变局部，然后再安排共享局部。<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 主要有三种实现策略：<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; cfront原始模型 于每个derived class object内安插指针，指向virtual base class. 但有两个缺点&nbsp; a虚基类越多插入指针越多，空间负载变大&nbsp; b继承串链增长时间接存取次数会不断增加<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 由鉴于此: 1). 一些编译器拷贝nested virtual base class指针，以空间换时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2). MS作法，加入virtual base class table，每个对象内插入vbptr指针 <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 3). 在vftbl中放置 virtual base class 的offset <br />&nbsp;&nbsp;&nbsp;&nbsp; 3.5 对象成员的效率<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.6 指向数据成员指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int MyClass::*p = &amp;MyClass::m_x;&nbsp;&nbsp;&nbsp;&nbsp; p返回值在不同编译器有不同情况，一般为1, 5, 9..etc 1, 5, 9 的情况可以区分出&#8220;没有指向任何member成员的指针(0)&#8221;和&#8220;指向第一个member成员的指针(1)&#8221;,实际使用指针时应将p-1&nbsp;&nbsp;&nbsp; ;VC中为0, 4, 8..etc&nbsp; 对于"没有指向任何member成员的指针"VC把它赋值为0xffffffff以此区分前述情况.<br /><br />4<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.1 Member的各种调用方式<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1) nonstatic member functions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 与 nonmember function有相同效率,使用name mangling等手段转换为接受this指针为参数的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2) virtual member functions<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ptr-&gt;Myfun(); 会转换为 (*ptr-&gt;vptr[x])(ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3) static member function<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 没有this指针与nonmember function有相同<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.2 virtual member functions<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class object上需要有class类型信息(字符串或数字)和vptr以及额外的虚函数表 ptr-&gt;Myfun(); 会转换为 (*ptr-&gt;vptr[x])(ptr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多重继承时第一个base class直接可以使用指向对象开始处的this，其第二个及后继base class需要调整this指针来支持虚函数，有三种情况:a)通过pBase2 调用子类函数delete pBase2;(要调用Derived::~Derived)&nbsp;&nbsp; b)通过pDerived调用Base2的虚函数 pDerived-&gt;Base2VirtualFunc(); c)虚函数返回值有变化Derived* Derived::clone(); pBase1 = new Derived; pBase2 = pBase1-&gt;clone();&nbsp; 调整this指针的有种trunk技术，编译器内部各自使用了不同方法来解决调整this指针的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虚继承，尽量不要在虚基类中声明nonstatic data members。<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.3 函数效能<br />&nbsp;&nbsp;&nbsp;&nbsp; 4.4 指向成员函数的指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 取nonstatic nonvirtual成员函数之地址，得到是内存地址,类型double (MyClass::*pmf)()，取static成员函数之地址得到内存地址，类型double (*pmf)();取virtual成员函数地址得到vtbl中的顺序号。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用指向成员函数的指针时在没有virtual函数，多重继承，虚基类的情况下和普通函数指针有同样的效率。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pmf可能是内存地址也可能是vtbl顺序号，为此开始cfront使用了如下手段支持virtual函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&nbsp; (int)pmf &amp; ~127)&nbsp; ?&nbsp; (*pmf)(ptr)&nbsp; : (* ptr-&gt;vtble[(int)pmf]) (ptr);//最多128个虚函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 多重继承下使用了一个结构体来实现&nbsp; <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; struct __mptr { <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; int delta; //this指针的offset值，(使用多重继承下第一个基类指针时若)vptr在对象开始时则不需要此字段<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index;//vtbl index; <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; union{ <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ptrtofunc faddr;//函数地址 <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; int v_offset;//虚基类或多重继承中的第二基类的vptr位置<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; };<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; };&nbsp; <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 指向成员函数指针的效能<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.5 inline functions<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译器会根据自己的机制来决定定函数是否可以成为inline functions。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inline函数会在被调用的那一点上扩展，它会涉及到参数求值和临时对象的管理。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1)形参&nbsp;&nbsp;&nbsp; 若是常量表达式则直接绑定到参数上，若是有副作用的表达式，则需要引入临时对象以避免重复求值。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inline min(int i , int j){return i&lt;j?i:j;} <br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; int x =&nbsp; min(foo(), foo2());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt; x= ( t1= foo(),t2=foo2(),t1 &lt;t2?t1:t2;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)局部变量<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若inline中若有局部变量，多次扩展后要维护的局部变量会很多。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用inline函数时，若调用次数太多，会使程序体积变大，但它可以有效存取nonpublic数据，相比宏对类封装性提供了较好支持。<img src ="http://www.cppblog.com/NWAO/aggbug/203596.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2013-10-30 16:31 <a href="http://www.cppblog.com/NWAO/archive/2013/10/30/203596.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4cxx 在VS2008下报内存泄露</title><link>http://www.cppblog.com/NWAO/archive/2013/10/29/203972.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 29 Oct 2013 08:31:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2013/10/29/203972.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/203972.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2013/10/29/203972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/203972.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/203972.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前几下下载了log4cxx准备学习其使用，编译好log4cxx的DLL ，新建MFC工程使用，日志正常生成，OK，退出程序时VC显示有很多的内存泄露。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顿时觉得心一凉，这开源软件质量不至于这么差吧。。。随后查了查，查到有人说是误报。<br />于是：&nbsp;&nbsp; 1)加上visual leak detector (vld), vld并未提示有内存泄露，看来很有可能是误报了。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2)按下面第一篇文章的方法，跟了一下_CrtDumpMemoryLeaks，&nbsp; _DllMainCRTStartup上下断点，调试可发现log4cxx先于mfc90加载了，然后释放时先释放的mfc90，它在检查已分配内存链表时，把log4cxx中的还没释放的内存误报了。<br />详见下面这篇文章。<br /><div><span></span><a href="http://blog.sina.com.cn/s/blog_68357baf0100ujxx.html"><span>http://blog.sina.com.cn/s/blog_68357baf0100ujxx.html</span><span style="color: red;"></span></a><span style="color: red;"><br /></span><span>另外</span><span>两个</span><span>文章</span><span style="color: red;"><br /></span></div><div><a href="http://blog.csdn.net/clever101/article/details/7926541">http://blog.csdn.net/clever101/article/details/7926541</a></div><div><a href="http://www.vis-sim.com/3dsceneBB/viewtopic.php?t=1027">http://www.vis-sim.com/3dsceneBB/viewtopic.php?t=1027</a><br /><br /><br />解决办法:&nbsp;&nbsp; 证明为误报后就简单了，可以直接把log4cxx编译为release使用即可。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 若还是觉得不爽，非要用debug的log4cxx，在stdafx.h中加入#pragma comment(lib, "log4cxx.lib") 在工程属性中的link-&gt;Input-&gt;Additional Dependencies中删掉log4cxx.lib项， 则可使mfc90加载释放顺序正常，从而VC不再误报内存泄露。<br /><br /><br />PS:自己也写弄了个小程序演示此种mfc使用win32 dll的情况，发现一个有意思的事情，定义的string内字符数要不小于16才会显示误报情况，原因不明，望高手指点。<div>演示程序地址<a href="http://download.csdn.net/detail/nwao7890/6477591">http://download.csdn.net/detail/nwao7890/6477591</a></div></div><img src ="http://www.cppblog.com/NWAO/aggbug/203972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2013-10-29 16:31 <a href="http://www.cppblog.com/NWAO/archive/2013/10/29/203972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数组名里的问题</title><link>http://www.cppblog.com/NWAO/archive/2013/03/22/198717.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Fri, 22 Mar 2013 05:48:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2013/03/22/198717.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/198717.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2013/03/22/198717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/198717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/198717.html</trackback:ping><description><![CDATA[int ary[10] ; ary即是这个数组的数组名，同时也是个指针常量值为ary[0]的地址,它的类型取决于数组元素的类型，可以使用ary这个指针来直接访问数组元素。<br />&nbsp;&nbsp; &nbsp; 例如在访问 a[8]时，ary指向ary[0], 将ary向后移8个位置就到了ary[8]，*(ary+8)即可(呃，虽然是叫ary[8]可它是ary的第9个元素，千万不能搞混)<br /><br /><br />&nbsp;&nbsp; 而如果是short ary[10]的情况呢？ary[8]的地址怎么算？ 答案依然是*(ary+8)理由同上。<br /><br />&nbsp;&nbsp; PS:指针加1所移动的距离会根据指针的类型来决定。<img src ="http://www.cppblog.com/NWAO/aggbug/198717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2013-03-22 13:48 <a href="http://www.cppblog.com/NWAO/archive/2013/03/22/198717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>由strcpy想到的一个小问题</title><link>http://www.cppblog.com/NWAO/archive/2013/03/22/198708.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Fri, 22 Mar 2013 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2013/03/22/198708.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/198708.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2013/03/22/198708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/198708.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/198708.html</trackback:ping><description><![CDATA[关于这个strcpy，经历过笔试的人都知道---实在是太频繁了。<br /><br />以前都是直接写网上的标准答案，昨天忽然想起来这个函数却又忘了网上怎么写的，只好自己动手写了写，还真发现点问题。<br /><br />代码及问题如下<br /><br />char* strcpy(char* dst, const char* src)<br />{<br />&nbsp;&nbsp; &nbsp;&nbsp; if( !dst || !src)<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; return null;<br />&nbsp;&nbsp; &nbsp;&nbsp; char* p = dst;<br />&nbsp;&nbsp; &nbsp;&nbsp; while( *p++ = *src++)<span style="color: red;"> // 问题就在这儿，</span><br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ;<br />&nbsp;&nbsp; &nbsp;&nbsp; return dst;<br />}<br /><br />网上一般都是写的 while((*p++ = *src++) != '\0') ，以前抄习惯了，也没注意可还可以再简化为上面的写法。<span style="color: red;">直接利用等号表达式的返回值来进行条件判断(到字符串末尾时'\0'被复制之后等号表达式的返回值也为\0即0也就是false来跳出循环)。</span><img src ="http://www.cppblog.com/NWAO/aggbug/198708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2013-03-22 09:37 <a href="http://www.cppblog.com/NWAO/archive/2013/03/22/198708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>"A problem has been encountered while loading the setup components. Canceling setup"解决办法</title><link>http://www.cppblog.com/NWAO/archive/2012/11/08/194880.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Thu, 08 Nov 2012 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2012/11/08/194880.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/194880.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2012/11/08/194880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/194880.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/194880.html</trackback:ping><description><![CDATA[<div><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; color: #4b4b4b; ">安装好了VS2008打了SP1, <br />后来在工作中需要看一些web方面的代码，准备更新下VS把原来没装的C#和WEB些都装上。<br />找出安装光盘的镜像来，谁知&#8220;A problem has been encountered while loading the setup components. Canceling setup&#8221;总是冒出来，无法更新了还。无奈上网找办法，有说用什么clean up工具包的，有说卸载补丁的。<br /><br />最终找到</span><span style="font-family: Verdana,Geneva,Arial,Helvetica,sans-serif; font-size: 13px; line-height: 19px; color: red;">完美解决办法&#8220;控制面板--&gt;vs2008--&gt;卸载/更新"就好了</span><span style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; color: #4b4b4b; ">，选择好需要的组件，继续你的安装吧</span></div><img src ="http://www.cppblog.com/NWAO/aggbug/194880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2012-11-08 15:45 <a href="http://www.cppblog.com/NWAO/archive/2012/11/08/194880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>逻辑非与按位取反</title><link>http://www.cppblog.com/NWAO/archive/2012/08/22/187964.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Wed, 22 Aug 2012 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2012/08/22/187964.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/187964.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2012/08/22/187964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/187964.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/187964.html</trackback:ping><description><![CDATA[&nbsp; ！为逻辑非，其结果为bool型，要么为0，要么为1.&nbsp; 如 ！0x20 ---&gt; ! true ---&gt; false (0);<br />&nbsp; ~为按位取反，二进制位按位取反。如~0x20 ---&gt;~ 0010 0000 ---&gt; 11011111;<br /><br />以前不求甚解，未分清楚二者。罪过。<img src ="http://www.cppblog.com/NWAO/aggbug/187964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2012-08-22 15:46 <a href="http://www.cppblog.com/NWAO/archive/2012/08/22/187964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vs2008断点无效与 调试启动慢</title><link>http://www.cppblog.com/NWAO/archive/2012/03/20/168382.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 20 Mar 2012 04:50:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2012/03/20/168382.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/168382.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2012/03/20/168382.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/168382.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/168382.html</trackback:ping><description><![CDATA[最近工作中调试时经常有些 下好的断点 断不下来的情况，看看吧，断点也在，就是调到那里直接就过去了，必须重新删掉再下断点才有效。<br />而且每次调试时启动都要等很长时间才会启动。<br /><br />上网查找到很多办法，但经试验只有一种解决了问题&nbsp; &#8221;<span style="color: red;">删除所有断点</span>&#8220;。 之后断点正常了，启动也不用等了。<br /><br />分析，可能是VS的断点记录与文件本身有关，每次打开VS会自动从Team Foundation Server上更新代码，并且重新编译之后，都可能导致断点与代码被VS认为不匹配而失效。而调试启动时估计VS会去别处寻找它认为对的代码文件或是PDB文件。总之应该是VS的BUG。<img src ="http://www.cppblog.com/NWAO/aggbug/168382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2012-03-20 12:50 <a href="http://www.cppblog.com/NWAO/archive/2012/03/20/168382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mfcs90ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)</title><link>http://www.cppblog.com/NWAO/archive/2012/03/08/167403.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Thu, 08 Mar 2012 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2012/03/08/167403.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/167403.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2012/03/08/167403.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/167403.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/167403.html</trackback:ping><description><![CDATA[問題：這兩天在編譯公司軟件的一個舊版本的代碼。有一個工程在link時一直報告mfcs90ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)，編譯不過<br />解決：排除工程設置等原因後，上網查找lnk2005資料，找到了解決辦法。<br />Step1 : Open project property---&gt;Configuration property---&gt;link--&gt;Genral--&gt;show Process 選為 VERBOSE:LIB，然後Build會看到如下內容：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">1</span>&nbsp;<span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">Linking<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">Searching&nbsp;libraries<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Searching&nbsp;C:\Program&nbsp;Files\Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000; ">9.0</span><span style="color: #000000; ">\VC\lib\MSVCRTD.lib:<br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;Searching&nbsp;C:\Program&nbsp;Files\Microsoft&nbsp;Visual&nbsp;Studio&nbsp;</span><span style="color: #000000; ">9.0</span><span style="color: #000000; ">\VC\atlmfc\lib\mfcs90ud.lib:<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; "></span><span style="color: #000000; ">1</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">mfcs90ud.lib(dllmodul.obj)&nbsp;:&nbsp;error&nbsp;LNK2005:&nbsp;_DllMain@</span><span style="color: #000000; ">12</span><span style="color: #000000; ">&nbsp;already&nbsp;defined&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;MSVCRTD.lib(dllmain.obj)</span></div>&nbsp; &nbsp;&nbsp; 據說是msvcrt和mfcs90u鏈接順序不對導致的，但為什麼順序會不正確，未能找到原因，解決辦法為為其強制指定順序，<br />Step2: project property---&gt;Configuration property---&gt;link--&gt;Additional Dependies&nbsp; = mfcs90ud.lib MSVCRTD.lib (DLL名字Debug版帶最後的D，Release版不帶，下同）<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;Ignore Specific Library = MSVCRTD.lib mfcs90ud.lib<br />&nbsp;&nbsp;&nbsp;&nbsp; 再編譯即OK<br />參考http://support.microsoft.com/kb/148652<img src ="http://www.cppblog.com/NWAO/aggbug/167403.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2012-03-08 15:33 <a href="http://www.cppblog.com/NWAO/archive/2012/03/08/167403.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜X输入法引起的一个BUG不能正常复现</title><link>http://www.cppblog.com/NWAO/archive/2012/02/20/166041.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Mon, 20 Feb 2012 01:55:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2012/02/20/166041.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/166041.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2012/02/20/166041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/166041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/166041.html</trackback:ping><description><![CDATA[问题：<br />
      <p>公司的软件有一个类似滚动条的自制控件，关于此控件上的小滑块定义的点击和拖动是有不同的响应函数(通过在OnLButtonDown,OnLButtonUp, OnMouseMove中对标识鼠标动作的变量进行赋值和比较来定义最终的鼠标行为)
但是在测试中发现了一个BUG,鼠标点击后的反应与设定不一致，未实现预定动作。</p>
      <p>拿到BUG后，先要进行问题复现，问题来了：在我自己的机器上调试时与提交BUG表现一致，另一位同事的机器上也一致，但第三位的机器上无论怎么试都未出现BUG所描述的情况。</p>
<br />
解决<br />
      <p>将代码拿到第三台机器上调试，发现无论鼠标怎么点击，总是判断为拖动动作，后来换了鼠标、保持鼠标不动等办法也是拖动。好像是系统自动会把点击动作转换为一个点击和一个0位移的移动一样。</p>
      <p>然后我觉得可能是系统设定的问题。将鼠标设定调成默认，问题依旧。然后又停止了机器上一些其它软件、服务问题依旧。直到有一次忽然得到了BUG描述中的现象，才发现是关闭了搜X输入法的原因。后来再试发现只要开着它，总会判断为拖动，关闭该输入法后表现就正常了。</p>
<br />
教训<br />
      <p>开始BUG不能复现总想的是鼠标设定、软件冲突的问题，实在没想到是小小的输入法引起的。估计是输入法内部为了实现云这个，云那个而在鼠标上搞什么鬼了吧。</p>
      <p>幸亏我自己不用该输入法。</p>
      <p>一个简单的小问题费了这么多话，表述能力不好，以后还需要更加努力。</p><img src ="http://www.cppblog.com/NWAO/aggbug/166041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2012-02-20 09:55 <a href="http://www.cppblog.com/NWAO/archive/2012/02/20/166041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入]Resource.h文件的宏定義</title><link>http://www.cppblog.com/NWAO/archive/2010/12/13/143749.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Mon, 13 Dec 2010 05:44:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2010/12/13/143749.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/143749.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2010/12/13/143749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/143749.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/143749.html</trackback:ping><description><![CDATA[<br />今天打開Resource.h文件看了下，里面亂亂的，好多宏定義是一個數，也不敢隨便改，尤其是以前由于手動改過這個文件，現在新生成的控件ID與以前的總是重復。<br /><br />為此特意找到了其中宏定義的含義，知道了這些，控件ID就可以隨便改啦。<br /><br />_APS_NEXT_RESOURCE_VALUE is the next symbol value that will be used for a dialog resource, menu resource, and so on. The valid range for resource symbol values is 1 to 0x6FFF.<br />下一個對話框或菜單等資源的ID,1----0x6FFF<br />
<p><strong>_APS_NEXT_COMMAND_VALUE</strong> is the next symbol value that will be used for a command identification. The valid range for command symbol values is 0x8000 to 0xDFFF. </p>
<p>下一個命令的ID，0x8000---0xDFFF</p>
<p><strong>_APS_NEXT_CONTROL_VALUE</strong> is the next symbol value that will be used for a dialog control. The valid range for dialog control symbol values is 8 to 0xDFFF.</p>
<p>下一個對話框控件的ID，8---0xDFFF</p>
<p><strong>_APS_NEXT_SYMED_VALUE</strong> is the next symbol value that will be issued when you manually assign a symbol value using the New command in the Symbol Browser.</p>
<p>在符號瀏覽器中使用新增命令里的預置ID</p>
文章来源:<a href="http://blog.csdn.net/nwao7890/archive/2010/12/13/6073100.aspx">http://blog.csdn.net/nwao7890/archive/2010/12/13/6073100.aspx</a><img src ="http://www.cppblog.com/NWAO/aggbug/143749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2010-12-13 13:44 <a href="http://www.cppblog.com/NWAO/archive/2010/12/13/143749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>清空VS的Recent Projects和Recent Files</title><link>http://www.cppblog.com/NWAO/archive/2010/07/20/120885.html</link><dc:creator>NWAO</dc:creator><author>NWAO</author><pubDate>Tue, 20 Jul 2010 08:19:00 GMT</pubDate><guid>http://www.cppblog.com/NWAO/archive/2010/07/20/120885.html</guid><wfw:comment>http://www.cppblog.com/NWAO/comments/120885.html</wfw:comment><comments>http://www.cppblog.com/NWAO/archive/2010/07/20/120885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/NWAO/comments/commentRss/120885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/NWAO/services/trackbacks/120885.html</trackback:ping><description><![CDATA[VS6.0<br />HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Projects<br />HKEY_CURRENT_USER\Software\Microsoft\DevStudio\6.0\Recent File List<br /><br />VS8.0<br />HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\ProjectMRUList<br />HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\8.0\FileMRUList<br /><br />清空以上内容，再打开VS即可<br /><img src ="http://www.cppblog.com/NWAO/aggbug/120885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/NWAO/" target="_blank">NWAO</a> 2010-07-20 16:19 <a href="http://www.cppblog.com/NWAO/archive/2010/07/20/120885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>