﻿<?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++博客-Error-随笔分类-从零开始写棋牌游戏平台</title><link>http://www.cppblog.com/error/category/20617.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 17 Jul 2017 15:51:28 GMT</lastBuildDate><pubDate>Mon, 17 Jul 2017 15:51:28 GMT</pubDate><ttl>60</ttl><item><title> cocos-js定时器简单了解</title><link>http://www.cppblog.com/Error/archive/2017/07/12/215091.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 12 Jul 2017 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/07/12/215091.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/215091.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/07/12/215091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/215091.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/215091.html</trackback:ping><description><![CDATA[<div>定时器使用：（cocos貌似没有提供详细参数文档，参数数量不一样的时候每个参数表达的含义不一样，使用如果问题，请自行读代码，否则真不知道每个参数的含义是什么）</div><div>------------------------------------------------------------------------------</div><div><span style="white-space:pre">	</span>1.注册定时器</div><div><span style="white-space:pre">	</span>//C++: js_CCScheduler_schedule</div><div><span style="white-space:pre">	</span>cc.director._scheduler.schedule(this, this.onTimerTest.bind(this), 1, cc.REPEAT_FOREVER, 0, false, "keyCountDownTime");</div><div><span style="white-space:pre">	</span>2.定时器回调原型</div><div><span style="white-space:pre">	</span>onTimerTest : function (interval) {</div><div><span style="white-space:pre">	</span>3.取消定时器</div><div><span style="white-space:pre">	</span>cc.director._scheduler.unschedule("keyCountDownTime", this);</div><div>------------------------------------------------------------------------------</div><div><span style="white-space:pre">	</span>cc.director._scheduler.schedule(this, this.onTimerTest.bind(this), 1);</div><div><span style="white-space:pre">	</span>cc.director._scheduler.unschedule(this, this.onTimerTest.bind(this));</div><div>------------------------------------------------------------------------------</div><div><span style="white-space:pre">	</span>直接调用node注册，可以省略第一个target参数</div><div>------------------------------------------------------------------------------</div><div><span style="white-space:pre">	</span>暂时没有发现能直接使用free函数做定时器</div><img src ="http://www.cppblog.com/Error/aggbug/215091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-07-12 15:20 <a href="http://www.cppblog.com/Error/archive/2017/07/12/215091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jenkins Windows bash编译错误判定</title><link>http://www.cppblog.com/Error/archive/2017/06/26/215029.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 26 Jun 2017 06:49:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/06/26/215029.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/215029.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/06/26/215029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/215029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/215029.html</trackback:ping><description><![CDATA[exit 0 &nbsp; #被识别为编译成功<br />exit 1 &nbsp; #呗识别为编译失败<br /><br /><br />比15年刚刚接触的时候稍微好用点了，至少svn中文路径，cmake支持，android打包什么的都有了，有必要再深入看一点资料了<br />另外为了用起来方便命令行还需要多了解点：<span style="word-wrap: normal; word-break: normal; line-height: 18px; color: #323e32; font-family: Verdana, 宋体, sans-serif; font-size: 12px; text-indent: 21px; background-color: #9caec1;">java -jar jenkins-cli.jar -s</span>&nbsp;<a href="http://22.11.140.38:9080/jenkins/" style="text-decoration: none; color: #318b92; font-family: Verdana, 宋体, sans-serif; font-size: 12px; text-indent: 21px; background-color: #9caec1;"><span style="word-wrap: normal; word-break: normal; line-height: 18px;">http://22.11.140.38:9080/jenkins/</span></a>&nbsp;<span style="word-wrap: normal; word-break: normal; line-height: 18px; color: #323e32; font-family: Verdana, 宋体, sans-serif; font-size: 12px; text-indent: 21px; background-color: #9caec1;">&nbsp;<wbr>help</span><img src ="http://www.cppblog.com/Error/aggbug/215029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-06-26 14:49 <a href="http://www.cppblog.com/Error/archive/2017/06/26/215029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于UI的几种设计模式，开个题，他日记起来了再细化：</title><link>http://www.cppblog.com/Error/archive/2017/06/01/214965.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 01 Jun 2017 09:34:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/06/01/214965.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214965.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/06/01/214965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214965.html</trackback:ping><description><![CDATA[<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 />--><br /><span style="color: #0000FF; ">namespace</span>&nbsp;DesignPattern<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;分离M和V的代码</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;MV<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Model<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;View<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;切断V对M的直接访问，对M操作的代码由C集中完成，M只需要做好更新到V的操作</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;MVC<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Model<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;View<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Controller<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;切断M-V的耦合，变化的代码集中到P，做到M和V完全隔离</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;MVP<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Model<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;在MVP模式里，View只应该有简单的Set/Get的方法，用户用户输入和设置界面显示的内容，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;除此就不应该有更多的内容，绝不容许直接直接访问Model</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;View<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Presenter&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;有了绑定以后实现，其实和MVP好像没什么太大区别，功能几种到VM上</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;MVVM<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Model<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;View<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ViewModel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br /><br />}</div><img src ="http://www.cppblog.com/Error/aggbug/214965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-06-01 17:34 <a href="http://www.cppblog.com/Error/archive/2017/06/01/214965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>cocos接入bugly获取崩溃堆栈</title><link>http://www.cppblog.com/Error/archive/2017/04/17/214864.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 17 Apr 2017 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/04/17/214864.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214864.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/04/17/214864.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214864.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214864.html</trackback:ping><description><![CDATA[<div>1.bugly sdk整个目录拷贝到cocos_sdk/external</div><div>2.在项目中将bugly_sdk/agent/android/*.jar;bugly_sdk/android/*.jar拷贝到项目libs目录.!!!记得要添加到java的Referenced Libraries否则是不生效的。</div><div>&nbsp; 当前需要加入进来的是两个jar包，一个sdk的一个插件的</div><div>3.在项目中将bugly_sdk/android/*.so拷贝到项目的jni/prebuilt</div><div>4.Android.mk文件调整：</div><div><span style="white-space:pre">	</span>#集成libBugly.so，添加在LOCAL_PATH := $(call my-dir)</div><div><span style="white-space:pre">	</span>LOCAL_MODULE := bugly_native_prebuilt</div><div><span style="white-space:pre">	</span>LOCAL_SRC_FILES := prebuilt/$(TARGET_ARCH_ABI)/libBugly.so</div><div><span style="white-space:pre">	</span>include $(PREBUILT_SHARED_LIBRARY)</div><div></div><div><span style="white-space:pre">	</span>#引用bugly/Android.mk定义的Module，在LOCAL_STATIC_LIBRARIES := xxx之后</div><div><span style="white-space:pre">	</span>LOCAL_STATIC_LIBRARIES += bugly_crashreport_cocos_static</div><div></div><div><span style="white-space:pre">	</span>#添加在末尾</div><div><span style="white-space:pre">	</span>$(call import-module, external/bugly)</div><div>5.编辑AndroidManifest.xml添加权限：</div><div><span style="white-space:pre">	</span>&lt;uses-permission android:name="android.permission.READ_PHONE_STATE" /&gt;</div><div><span style="white-space:pre">	</span>&lt;uses-permission android:name="android.permission.INTERNET" /&gt;</div><div><span style="white-space:pre">	</span>&lt;uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /&gt;</div><div><span style="white-space:pre">	</span>&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt;</div><div><span style="white-space:pre">	</span>&lt;uses-permission android:name="android.permission.READ_LOGS" /&gt;</div><div>6.初始化</div><div>在AppDelegate::applicationDidFinishLaunching()接口调用CrashReport::initCrashReport(addId, debug)</div><div>7.实际测试添加完成后大概半小时后生效</div><img src ="http://www.cppblog.com/Error/aggbug/214864.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-04-17 19:51 <a href="http://www.cppblog.com/Error/archive/2017/04/17/214864.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2017-04-16：cocos-js如何使用plist图片，web平台无法使用ccui</title><link>http://www.cppblog.com/Error/archive/2017/04/16/214857.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sun, 16 Apr 2017 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/04/16/214857.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214857.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/04/16/214857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214857.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214857.html</trackback:ping><description><![CDATA[<div>// plsit测试</div><div>cc.log("begin test plist");</div><div>cc.spriteFrameCache.addSpriteFrames("res/hall_entrance.plist");</div><div>//var imageView = new ccui.ImageView("#hall_enter_3.png"); &nbsp;错误用法，js里边需要通过ccui.Widget.PLIST_TEXTURE参数明确指定</div><div>var imageView = new ccui.ImageView("hall_enter_3.png", ccui.Widget.PLIST_TEXTURE);</div><div>this.addChild(imageView);<br /><br /><br /><br /><br />ccui使用：<br />在project.json中的modules属性修改为："modules" : ["cocos2d","extensions"],<br /></div><img src ="http://www.cppblog.com/Error/aggbug/214857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-04-16 23:54 <a href="http://www.cppblog.com/Error/archive/2017/04/16/214857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2017-04-11</title><link>http://www.cppblog.com/Error/archive/2017/04/11/214833.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 11 Apr 2017 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/04/11/214833.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214833.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/04/11/214833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214833.html</trackback:ping><description><![CDATA[<div>Q1：怎么输出日志</div><div>A1：cc.log();</div><div></div><div>Q2: 日志怎么格式化输出</div><div>A2：cc.log("%d-%s", 123321, 'abc'); 目测和C类似，估计和console.log也类似，应该基础的js书里边就有，改天专门研究</div><div></div><div>Q3：为什么获取到的Button、Sprite等控件的contentSize是(0, 0)</div><div>A3: 应为没有在resource.js中添加，添加以后就能成功获取到size，表现和native一样了。猜测可能是在图片加载的时候做了预处理。</div><div></div><img src ="http://www.cppblog.com/Error/aggbug/214833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-04-11 23:36 <a href="http://www.cppblog.com/Error/archive/2017/04/11/214833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单分析cocos2d::Sequence::create函数的可变参数实现，以及C++ 1X优化方式讨论</title><link>http://www.cppblog.com/Error/archive/2017/04/04/214807.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 04 Apr 2017 05:11:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/04/04/214807.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214807.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/04/04/214807.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214807.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214807.html</trackback:ping><description><![CDATA[<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: #008000; ">//</span><span style="color: #008000; ">&nbsp;ConsoleApplication2.cpp&nbsp;:&nbsp;定义控制台应用程序的入口点。<br /></span><span style="color: #008000; ">//<br /></span><br />#include&nbsp;"stdafx.h"<br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;cstdarg&gt;<br />#include&nbsp;&lt;vector&gt;<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;变参函数例子<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />中不包含类型信息，不包含数量信息。相对优雅的解决方式有两个：<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;1.类似printf的方式，通过fmt字符串解决<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;2.类似cocos::Sequence::create的方式，应为全部是动画指针，所以类型是约定好的统一类型，结束标记可以使用NULL标记</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;ParametListTest(<span style="color: #0000FF; ">int</span>&nbsp;nStart,&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;定义一个参数列表，用于接收解析"<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />"</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;va_list&nbsp;parametList;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;输出第一个参数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;nStart&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;nStart是&#8216;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&#8217;之前最后一个函数参数，用于内存定位，获取parametList</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;va_start(parametList,&nbsp;nStart);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />里边的具体参数个数是获取不到的<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;printf的处理和这里不一样：printf根据fmt字符串中的"%"标记来萃取参数类型、数量</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nTem&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;重parametList获取下一个类型为int的变量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;nTem&nbsp;=&nbsp;va_arg(parametList,&nbsp;<span style="color: #0000FF; ">int</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;-1作为结束标记</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(-1&nbsp;!=&nbsp;nTem)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;nTem&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nTem&nbsp;=&nbsp;va_arg(parametList,&nbsp;<span style="color: #0000FF; ">int</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;va_end(parametList);<br />}<br /><br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;模版参数最后一个递归(带重载的递归)</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">void</span>&nbsp;TParametListTest()<br />{<br />}<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;C++&nbsp;1x变参模版</span><span style="color: #008000; "><br /></span>template&lt;typename&nbsp;T,&nbsp;typename&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;Args&gt;<br /><span style="color: #0000FF; ">void</span>&nbsp;TParametListTest(T&nbsp;nStart,&nbsp;Args&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />&nbsp;args)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;nStart&nbsp;&lt;&lt;&nbsp;std::endl;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;可以直接展开多参数的定义<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;递归一次参数减少一个，最后会调用void重载</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;TParametListTest(args<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />);<br />}<br /><br /><br /><br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;假设需要实现的功能是输出，这个demo已经满足条件<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;假设需要实现的是类似cocos的时序动画功能，其实把std::cout换成成员变量，或者某个全局函数即可实现</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;ParametListTest(1,&nbsp;2,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;&lt;&lt;&nbsp;"----------------------------"&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;TParametListTest(1,&nbsp;2,&nbsp;3,&nbsp;3,&nbsp;3,&nbsp;3); &nbsp;// 采用1X可变模版参数语法实现的，可以抹掉末尾的结束标记<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /></div><img src ="http://www.cppblog.com/Error/aggbug/214807.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-04-04 13:11 <a href="http://www.cppblog.com/Error/archive/2017/04/04/214807.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于rand和mt19937随机算法的命中概率误差分析</title><link>http://www.cppblog.com/Error/archive/2017/01/22/214622.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sun, 22 Jan 2017 04:28:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2017/01/22/214622.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214622.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2017/01/22/214622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214622.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214622.html</trackback:ping><description><![CDATA[<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: #008000; ">//</span><span style="color: #008000; ">&nbsp;RandomTest.cpp&nbsp;:&nbsp;Defines&nbsp;the&nbsp;entry&nbsp;point&nbsp;for&nbsp;the&nbsp;console&nbsp;application.<br /></span><span style="color: #008000; ">//<br /></span><br />#include&nbsp;"stdafx.h"<br /><br />#include&nbsp;&lt;iostream&gt;<br />#include&nbsp;&lt;cmath&gt;<br />#include&nbsp;&lt;random&gt;<br />#include&nbsp;&lt;cstdint&gt;<br />#include&nbsp;&lt;ctime&gt;<br />#include&nbsp;&lt;algorithm&gt;<br />#include&nbsp;&lt;numeric&gt;<br />#include&nbsp;&lt;cassert&gt;<br />#include&nbsp;&lt;climits&gt;<br />#include&nbsp;&lt;thread&gt;<br /><br /><span style="color: #0000FF; ">#define</span>&nbsp;XASSERT(exp)&nbsp;assert(exp)<br /><span style="color: #0000FF; ">#define</span>&nbsp;XASSERT_MSG(exp,&nbsp;msg)&nbsp;assert(exp)<br /><span style="color: #0000FF; ">#define</span>&nbsp;X_DEFAULT_FLOAT_PRECISION&nbsp;(0.00000001)<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;@in:&nbsp;总次数、目标比例(千分比)、算法类型(1.c标准库rand;&nbsp;2.cpp11&nbsp;mt19937)<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;@out:&nbsp;实际命中次数、实际命中概率</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">bool</span>&nbsp;RandomHitTest(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&nbsp;nAlgorithmType,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate);<br /><span style="color: #0000FF; ">void</span>&nbsp;RandomHitTest_std_mt19937(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate);<br /><span style="color: #0000FF; ">void</span>&nbsp;RandomHitTest_std_rand(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;简化std::rand获取[nMin,&nbsp;nMax]区间的一个数字</span><span style="color: #008000; "><br /></span>uint32_t&nbsp;StdRandEx(uint32_t&nbsp;nMin,&nbsp;uint32_t&nbsp;nMax);<br /><br /><br /><span style="color: #0000FF; ">int</span>&nbsp;_tmain(<span style="color: #0000FF; ">int</span>&nbsp;argc,&nbsp;_TCHAR*&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">std::thread&nbsp;srandThread([](){&nbsp;std::this_thread::sleep_for(std::chrono::seconds(1));});<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">srandThread.detach();</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;std::tuple&lt;<span style="color: #0000FF; ">float</span>,&nbsp;<span style="color: #0000FF; ">float</span>&gt;&gt;&nbsp;vecResult;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt;&nbsp;1000;&nbsp;n++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;nTotalCount&nbsp;=&nbsp;100000;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;基数100000次</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">float</span>&nbsp;fHitRate&nbsp;=&nbsp;0.001f;&nbsp;1.f&nbsp;-&nbsp;fHitRate&nbsp;&gt;=&nbsp;0;&nbsp;fHitRate&nbsp;=&nbsp;fHitRate&nbsp;+&nbsp;0.101f)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRealHitCount&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fRealHitRate&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;std::rand测试</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomHitTest(nTotalCount,&nbsp;fHitRate,&nbsp;1,&nbsp;nRealHitCount,&nbsp;fRealHitRate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">std::cout&nbsp;&lt;&lt;&nbsp;"AlgorithmType="&nbsp;&lt;&lt;&nbsp;1&nbsp;&lt;&lt;&nbsp;",TotlaCount="&nbsp;&lt;&lt;&nbsp;nTotalCount&nbsp;&lt;&lt;&nbsp;",HitRate="&nbsp;&lt;&lt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;fHitRate&nbsp;&nbsp;&lt;&lt;&nbsp;",ReahHitRate="&nbsp;&lt;&lt;&nbsp;std::fixed&nbsp;&lt;&lt;&nbsp;fRealHitRate&nbsp;&lt;&lt;&nbsp;",RealHitCount="&nbsp;&lt;&lt;&nbsp;nRealHitCount&nbsp;&lt;&lt;&nbsp;std::endl;</span><span style="color: #008000; "><br /></span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRealHitCount1&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fRealHitRate1&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;cpp11&nbsp;mt19937</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomHitTest(nTotalCount,&nbsp;fHitRate,&nbsp;2,&nbsp;nRealHitCount1,&nbsp;fRealHitRate1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">std::cout&nbsp;&lt;&lt;&nbsp;"AlgorithmType="&nbsp;&lt;&lt;&nbsp;2&nbsp;&lt;&lt;&nbsp;",TotlaCount="&nbsp;&lt;&lt;&nbsp;nTotalCount&nbsp;&lt;&lt;&nbsp;",HitRate="&nbsp;&lt;&lt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;fHitRate&nbsp;&nbsp;&lt;&lt;&nbsp;",ReahHitRate="&nbsp;&lt;&lt;&nbsp;std::fixed&nbsp;&lt;&lt;&nbsp;fRealHitRate1&nbsp;&lt;&lt;&nbsp;",RealHitCount="&nbsp;&lt;&lt;&nbsp;nRealHitCount1&nbsp;&lt;&lt;&nbsp;std::endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">std::cout&nbsp;&lt;&lt;&nbsp;"---differ&nbsp;rate="&nbsp;&lt;&lt;&nbsp;std::fixed&nbsp;&lt;&lt;&nbsp;fRealHitRate1&nbsp;-&nbsp;fRealHitRate&nbsp;&lt;&lt;&nbsp;",&nbsp;differ&nbsp;count="&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt;&nbsp;nRealHitCount1&nbsp;-&nbsp;nRealHitCount&nbsp;&lt;&lt;&nbsp;std::endl;</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::tuple&lt;<span style="color: #0000FF; ">float</span>,&nbsp;<span style="color: #0000FF; ">float</span>&gt;&nbsp;tupleResult&nbsp;=&nbsp;std::make_tuple(fHitRate,&nbsp;std::fabsf(fRealHitRate1&nbsp;-&nbsp;fRealHitRate));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vecResult.push_back(tupleResult);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;std::sort(vecResult.begin(),&nbsp;vecResult.end(),&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[](std::tuple&lt;<span style="color: #0000FF; ">float</span>,&nbsp;<span style="color: #0000FF; ">float</span>&gt;&amp;&nbsp;tupLeft,&nbsp;std::tuple&lt;<span style="color: #0000FF; ">float</span>,&nbsp;<span style="color: #0000FF; ">float</span>&gt;&amp;&nbsp;tupRight)-&gt;<span style="color: #0000FF; ">bool</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">float&nbsp;fHitRateL&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">float&nbsp;fRealRateL&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">float&nbsp;fHitRateR&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">float&nbsp;fRealRateR&nbsp;=&nbsp;0;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;std::<span style="color: #0000FF; ">get</span>&lt;1&gt;(tupLeft)&nbsp;-&nbsp;std::<span style="color: #0000FF; ">get</span>&lt;1&gt;(tupRight)&nbsp;&gt;&nbsp;0;;<br />&nbsp;&nbsp;&nbsp;&nbsp;});<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;tupleFirst&nbsp;=&nbsp;vecResult[0];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br />}<br /><br /><br />uint32_t&nbsp;StdRandEx(uint32_t&nbsp;nMin,&nbsp;uint32_t&nbsp;nMax)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;XASSERT((nMin&nbsp;&gt;=&nbsp;0)&nbsp;&amp;&amp;&nbsp;(nMax&nbsp;&gt;=&nbsp;0)&nbsp;&amp;&amp;&nbsp;(nMin&nbsp;&lt;=&nbsp;nMax));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;nRandVal&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMin&nbsp;==&nbsp;nMax)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRandVal&nbsp;=&nbsp;nMax;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nMin&nbsp;&lt;&nbsp;nMax)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRandVal&nbsp;=&nbsp;rand()&nbsp;%&nbsp;(nMax&nbsp;-&nbsp;nMin&nbsp;+&nbsp;1)&nbsp;+&nbsp;nMin;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XASSERT_MSG(0,&nbsp;_T("参数异常"));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;nRandVal;<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;RandomHitTest_std_rand(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;nRealHitCount&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;fRealHitRate&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nTotalCount&nbsp;&lt;=&nbsp;0&nbsp;||&nbsp;fHitRate&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;计算浮点小数点个数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nWeCount&nbsp;=&nbsp;3;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;位数(三位数，千分比精度)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;XASSERT((fHitRate&nbsp;*&nbsp;std::pow(10,&nbsp;nWeCount))&nbsp;-&nbsp;std::numeric_limits&lt;uint64_t&gt;::max()&nbsp;&lt;=&nbsp;X_DEFAULT_FLOAT_PRECISION);&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;永不溢出</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int64_t&nbsp;nHitRateIntHelp&nbsp;=&nbsp;static_cast&lt;uint64_t&gt;(fHitRate&nbsp;*&nbsp;std::pow(10,&nbsp;nWeCount));&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;概率转整数辅助计算<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;根据位数决定随机数范围</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRandMin&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRandMax&nbsp;=&nbsp;std::pow(10,&nbsp;nWeCount);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;开始测试</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;nTestCount&nbsp;=&nbsp;nTotalCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nTestCount--&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;生成随机数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRandVal&nbsp;=&nbsp;StdRandEx(nRandMin,&nbsp;nRandMax);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;命中判定</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nRandVal&nbsp;&lt;&nbsp;nHitRateIntHelp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRealHitCount++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fRealHitRate&nbsp;=&nbsp;<span style="color: #0000FF; ">float</span>(nRealHitCount)/<span style="color: #0000FF; ">float</span>(nTotalCount);<br />}<br /><br /><span style="color: #0000FF; ">void</span>&nbsp;RandomHitTest_std_mt19937(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;nRealHitCount&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;fRealHitRate&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nTotalCount&nbsp;&lt;=&nbsp;0&nbsp;||&nbsp;fHitRate&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;计算浮点小数点个数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nWeCount&nbsp;=&nbsp;3;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;位数(三位数，千分比精度)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;XASSERT((fHitRate&nbsp;*&nbsp;std::pow(10,&nbsp;nWeCount))&nbsp;-&nbsp;std::numeric_limits&lt;uint64_t&gt;::max()&nbsp;&lt;=&nbsp;X_DEFAULT_FLOAT_PRECISION);&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;永不溢出</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int64_t&nbsp;nHitRateIntHelp&nbsp;=&nbsp;static_cast&lt;uint64_t&gt;(fHitRate&nbsp;*&nbsp;std::pow(10,&nbsp;nWeCount));&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;概率转整数辅助计算<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;根据位数决定随机数范围</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRandMin&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;int32_t&nbsp;nRandMax&nbsp;=&nbsp;std::pow(10,&nbsp;nWeCount);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置随机数生成器</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;std::random_device&nbsp;rd;<br />&nbsp;&nbsp;&nbsp;&nbsp;std::mt19937_64&nbsp;gen(rd());<br />&nbsp;&nbsp;&nbsp;&nbsp;std::uniform_int_distribution&lt;&gt;&nbsp;dis(nRandMin,&nbsp;nRandMax);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;重设种子应该使用这个api：::CryptGenRandom<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;linux也有相应的高精度随机数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;gen.seed(uint32_t(time(NULL)));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;开始命中测试</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;auto&nbsp;nTestCount&nbsp;=&nbsp;nTotalCount;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(nTestCount--&nbsp;&gt;&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;生成随机数</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32_t&nbsp;randVal&nbsp;=&nbsp;dis(gen);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(randVal&nbsp;&lt;&nbsp;nHitRateIntHelp)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nRealHitCount++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;fRealHitRate&nbsp;=&nbsp;<span style="color: #0000FF; ">float</span>(nRealHitCount)/<span style="color: #0000FF; ">float</span>(nTotalCount);<br />}<br /><br /><br /><span style="color: #0000FF; ">bool</span>&nbsp;RandomHitTest(int32_t&nbsp;nTotalCount,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;fHitRate,&nbsp;int32_t&nbsp;nAlgorithmType,&nbsp;int32_t&amp;&nbsp;nRealHitCount,&nbsp;<span style="color: #0000FF; ">float</span>&amp;&nbsp;fRealHitRate)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(nTotalCount&nbsp;&lt;=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bRet&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;(nAlgorithmType)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomHitTest_std_rand(nTotalCount,&nbsp;fHitRate,&nbsp;nRealHitCount,&nbsp;fRealHitRate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;2:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomHitTest_std_mt19937(nTotalCount,&nbsp;fHitRate,&nbsp;nRealHitCount,&nbsp;fRealHitRate);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bRet&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;<br />}<br /><br /></div><img src ="http://www.cppblog.com/Error/aggbug/214622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2017-01-22 12:28 <a href="http://www.cppblog.com/Error/archive/2017/01/22/214622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初探javascript 名字空间</title><link>http://www.cppblog.com/Error/archive/2016/12/21/214525.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 21 Dec 2016 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/21/214525.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214525.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/21/214525.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214525.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214525.html</trackback:ping><description><![CDATA[参考链接：http://www.cnblogs.com/dolphinX/p/3269145.html<br />最基础的玩法：<br /><br /><div>var Plaza = {};</div><div></div><div>Plaza.HelloWorldLayer = cc.Layer<br /><br />这样解决不了多个文件中需要使用同一个名字控件而且需要共享的情况。<br /><br /><br /><div>var Plaza = Plaza || {};</div><div></div><div>Plaza.HelloWorldLayer = cc.Layer<br />这样简单处理能搞定。<br /><br />另外还有如下比较高阶的函数玩法：<br /><br /><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; padding: 0px; list-style-type: none; list-style-image: none; font-size: 12px; font-family: &quot;Courier New&quot; !important;">(<span style="color: #0000ff; line-height: 1.5 !important;">function</span><span style="line-height: 1.5 !important;">(){                 <br /></span><span style="color: #0000ff; line-height: 1.5 !important;">&nbsp;&nbsp;&nbsp;var</span> _NS=<span style="color: #0000ff; line-height: 1.5 !important;">function</span><span style="line-height: 1.5 !important;">(){                                  }                 <br />&nbsp;&nbsp;&nbsp;_NS.prototype.alert</span>=<span style="color: #0000ff; line-height: 1.5 !important;">function</span><span style="line-height: 1.5 !important;">(){                     <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;console.log(</span>'test'<span style="line-height: 1.5 !important;">);                 <br />   }                 <br />   window.NS</span>=<span style="color: #0000ff; line-height: 1.5 !important;">new</span><span style="line-height: 1.5 !important;"> _NS();             <br />})();</span></pre></div></div><img src ="http://www.cppblog.com/Error/aggbug/214525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-21 10:15 <a href="http://www.cppblog.com/Error/archive/2016/12/21/214525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目cocos框架适配设置</title><link>http://www.cppblog.com/Error/archive/2016/12/19/214523.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 19 Dec 2016 10:07:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/19/214523.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214523.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/19/214523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214523.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214523.html</trackback:ping><description><![CDATA[<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 />-->bSceneCutsomResolution决定适配策略ResolutionPolicy::EXACT_FIT会用缩放拉伸的方式适配<br /><span style="color: #0000FF; "><br />void</span>&nbsp;CAutoScreen::SetSceneResolute(<span style="color: #0000FF; ">float</span>&nbsp;w,&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;h,&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;bSceneCutsomResolution)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CAutoScreen::sceneCutsomResolution=bSceneCutsomResolution;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(bSceneCutsomResolution)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cocos2d::Size&nbsp;ls&nbsp;=&nbsp;Size(w,&nbsp;h);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;fs&nbsp;=&nbsp;Director::getInstance()-&gt;getOpenGLView()-&gt;getFrameSize();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;sx&nbsp;=&nbsp;ls.width/fs.width;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;sy&nbsp;=&nbsp;ls.height/fs.height;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sceneResolute&nbsp;=&nbsp;ls;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">定义&nbsp;scale&nbsp;变量</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resoluteBool&nbsp;=&nbsp;sx&gt;sy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">float</span>&nbsp;scale&nbsp;=&nbsp;resoluteBool?sx:sy;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSceneSize(resoluteBool?ls.width:fs.width*scale,&nbsp;resoluteBool?fs.height*scale:ls.height);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetSceneScale(resoluteBool?fs.height*scale/ls.height&nbsp;:&nbsp;fs.width*scale/ls.width);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Director::getInstance()-&gt;getOpenGLView()-&gt;setDesignResolutionSize(GetSceneWidth(),&nbsp;GetSceneHeight(),&nbsp;ResolutionPolicy::SHOW_ALL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sceneScale&nbsp;=&nbsp;0.0f;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sceneSize&nbsp;=&nbsp;Size(w,&nbsp;h);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sceneResolute&nbsp;=&nbsp;Size(w,&nbsp;h);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Director::getInstance()-&gt;getOpenGLView()-&gt;setDesignResolutionSize(w,&nbsp;h,&nbsp;ResolutionPolicy::EXACT_FIT);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;Director::getInstance()-&gt;setContentScaleFactor(1.0f);<br />}</div><img src ="http://www.cppblog.com/Error/aggbug/214523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-19 18:07 <a href="http://www.cppblog.com/Error/archive/2016/12/19/214523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目bug：2016-15-15 扎金花总结算bug：缺少数据、数据不准确</title><link>http://www.cppblog.com/Error/archive/2016/12/15/214496.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 15 Dec 2016 13:40:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/15/214496.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214496.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/15/214496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214496.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214496.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/error/QQ图片20161215213040.png" width="870" height="584" alt="" /><br /><br /><br /><br />数据插入忘记使用使用数据操作符<br /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/error/QQ截图20161215213731.png" width="857" height="314" alt="" /><br /><br /><br /><br />本以为直接在游戏结束的位置收集结束消息，结果结算是分散在各种定时器处理代码中的<br /><img src ="http://www.cppblog.com/Error/aggbug/214496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-15 21:40 <a href="http://www.cppblog.com/Error/archive/2016/12/15/214496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目bug案例：2016-12-15 SetParamObject引起的内存写溢出</title><link>http://www.cppblog.com/Error/archive/2016/12/15/214494.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 15 Dec 2016 11:18:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/15/214494.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214494.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/15/214494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214494.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214494.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/error/QQ截图20161215190847.png" width="978" height="678" alt="" /><br /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/error/QQ截图20161215190914.png" width="561" height="228" alt="" /><br /><br /><br />风险来一下几点：<br />1.每次保存一个Node节点裸指针的时候，要意识到这是一个风险操作，如果不够重视很容易应为常规的节点操作引起Node析构倒置野节点。<br />2.在设计API的时候尽量保证&#8220;语义&#8221;正确性，风格要&#8220;随大流&#8221;。Set和Get尽量不做额外动作、尽量保持一致性。如有特殊处理，除非毫无副作用，否则尽量把信息携带到接口名中。<br />3.非性能优先的模块中，所有的接口一定要做入口参数检测，出口数据检测<br />4.在操作数组时一定要认识到，这是一个&#8220;高风险&#8221;操作，务必检测访问是否肯能越界。<br />5.每次++操作，都需要考虑++操作后会引起什么副作用，++是否是有范围的，知否需要控制反馈，什么时候需要--回来<img src ="http://www.cppblog.com/Error/aggbug/214494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-15 19:18 <a href="http://www.cppblog.com/Error/archive/2016/12/15/214494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目bug：2016-15-15 四人牛牛无人叫庄引起游戏开始时庄家ID无效倒置程序异常</title><link>http://www.cppblog.com/Error/archive/2016/12/15/214490.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 15 Dec 2016 03:14:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/15/214490.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214490.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/15/214490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214490.html</trackback:ping><description><![CDATA[叫庄逻辑：游戏开始-&gt;玩家叫装-&gt;设置庄家-&gt;发牌比牌<br />bug：玩家叫庄阶段，无人叫庄的时候，后续逻辑会失控。<br />原因：游戏逻辑要求必须有庄家，但是没有人叫庄。内存中的庄家将是初始化的无效值。<br />解决方法：在玩家叫庄阶段结束后，如果没有任何人叫庄必须要有一个默认庄家，否则游戏无法继续进行下去<br /><br /><img src ="http://www.cppblog.com/Error/aggbug/214490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-15 11:14 <a href="http://www.cppblog.com/Error/archive/2016/12/15/214490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目bug：2016-15-15 sqlserver linkedserver引起查询超时</title><link>http://www.cppblog.com/Error/archive/2016/12/15/214488.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 15 Dec 2016 02:36:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/15/214488.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214488.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/15/214488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214488.html</trackback:ping><description><![CDATA[sqlserver linkedserver技术介绍：<br />参考链接：<br /><div>https://msdn.microsoft.com/zh-cn/library/ms190479.aspx<br /><div>http://www.cnblogs.com/xinghuayang/p/LinkedServer_BulkInsert_PassDataTableAsParameter_BugHandlingProcess.html<br /><div>http://www.cnblogs.com/zcttxs/p/3445629.html<br />简单来说，linkedserver用于分布式查询，让一台机器可以远程访问其他机器的存储过程和数据。<br /></div>项目中出现几个存储过程查询异常，但是codeview并没有发现异常。但是去掉分布式链接前缀以后性能提升很多。<br />使用sp_linkedservers查询链接节点信息如下：<br /><img src="http://www.cppblog.com/images/cppblog_com/error/20161215103305.png" width="881" height="142" alt="" /><br />本地地址是Local初步分析也是没有问题的，遂简单处理去掉了所有link访问代码。<br /><br />后续分析可能是sqlserver内部使用gethosetbyname获取local对应的ip地址引起故障。（这个操作可能会涉及到dns服务器参与）<br />参考链接：http://blog.csdn.net/shijun_zhang/article/details/6577426<br /></div></div><img src ="http://www.cppblog.com/Error/aggbug/214488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-15 10:36 <a href="http://www.cppblog.com/Error/archive/2016/12/15/214488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>项目bug案例：2016-12-04 memcopy引起内存写溢出</title><link>http://www.cppblog.com/Error/archive/2016/12/14/214484.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 14 Dec 2016 12:16:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/12/14/214484.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214484.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/12/14/214484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214484.html</trackback:ping><description><![CDATA[<img src="http://www.cppblog.com/images/cppblog_com/error/2.png" width="485" height="91" alt="" /><br /><img src="http://www.cppblog.com/images/cppblog_com/error/1.png" width="861" height="628" alt="" /><br /><br /><br /><br /><img src="http://www.cppblog.com/images/cppblog_com/error/3.png" width="515" height="264" alt="" /><img src ="http://www.cppblog.com/Error/aggbug/214484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-12-14 20:16 <a href="http://www.cppblog.com/Error/archive/2016/12/14/214484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>websocket初探（cocos）</title><link>http://www.cppblog.com/Error/archive/2016/10/30/214368.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sun, 30 Oct 2016 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2016/10/30/214368.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/214368.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2016/10/30/214368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/214368.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/214368.html</trackback:ping><description><![CDATA[1.cocos本身在cpp框架中是提供了ws的<br />2.cocosjs版本在web上必然也是提供了ws的<br />3.网络操作想跑起来，ws只是一个基础，有了连接以后需要解决数据序列化的问题<br />4.如果选择二进制协议，首先ByteBuffer跑不掉，然后优先考虑使用protobuf。最终一套开一块<a data-click="{
			'F':'77A717EA',
			'F1':'9D73F1E4',
			'F2':'4CA6DD6B',
			'F3':'54E5343F',
			'T':'1477839741',
						'y':'1DE7EE7E'
			 
									}" href="https://www.baidu.com/link?url=eD2WUn1ocOq3VEHt9xLCW1EnHh3YaUMcbjAADPiIm_CNnnjbvpEVz2iSlumwTH1w&amp;wd=&amp;eqid=eb96a00b000183010000000658160b7c" target="_blank" style="font-family: arial; font-size: medium; line-height: 24.64px;">dcode<span style="color: #cc0000;">IO</span></a><span style="color: #333333; font-family: arial; font-size: medium; line-height: 24.64px; background-color: #ffffff;">库可以搞定，后期有空了可以试试pb3自带的js，不过看起来只能在node环境下用。&nbsp;<br />5.服务器在github上有大神手撸的cpp解码websocket协议相关代码，不过个人觉得肯定有缺陷的，使用成熟一点的库会更好，这里首选websocketpp。将来万一还是不行，就直接换java php c# go之类的提供的ws标准库的语言。不在这些通用标准的细节上折腾，尽量使用工业化、成熟的组件。<br /><br /><br /><br />整理一下思路：<br />服务器应该有一个ws网关，用来监听ws端口，接受客户端发起的ws链接，并保持心跳。ws网关不直接处理ws网络数据，而是转发给内网实际的模块去。<br /></span><div></div><img src ="http://www.cppblog.com/Error/aggbug/214368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2016-10-30 23:16 <a href="http://www.cppblog.com/Error/archive/2016/10/30/214368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转) GDI GDI+双缓冲</title><link>http://www.cppblog.com/Error/archive/2015/11/12/212250.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 12 Nov 2015 06:28:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/11/12/212250.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/212250.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/11/12/212250.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/212250.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/212250.html</trackback:ping><description><![CDATA[<div>GDI+使用双缓冲绘图</div> <div>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</div> <div>我再来详细解释一下刚才实现双缓冲的具体步骤：</div> <div>1、在内存中建立一块&#8220;虚拟画布&#8221;：</div> <div>Bitmap bmp = new Bitmap(600, 600);</div> <div>2、获取这块内存画布的Graphics引用：</div> <div>Graphics g = Graphics.FromImage(bmp);</div> <div>3、在这块内存画布上绘图：</div> <div>g.FillEllipse(brush, i * 10, j * 10, 10, 10);</div> <div>4、将内存画布画到窗口中</div> <div>this.CreateGraphics().DrawImage(bmp, 0, 0);</div> <div></div> <div>====================</div> <div>maybe better</div> <div> <div> <div> <div id="highlighter_698821" nogutter="" cpp=""  ie"=""> <div><a command_help=""  help"="" href="http://www.cnblogs.com/watsonlong/archive/2011/04/25/2026670.html#">?</a></div> <table border="0" cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <div> <div number1="" index0=""  alt2"=""><code plain"="">CDC dcMemory; </code></div> <div number2="" index1=""  alt1"=""><code plain"="">dcMemory.CreateCompatibleDC(&amp;dc); </code></div> <div number3="" index2=""  alt2"=""><code plain"="">CBitmap bmp; </code></div> <div number4="" index3=""  alt1"=""><code plain"="">bmp.CreateCompatibleBitmap(&amp;dc,1024,768); </code></div> <div number5="" index4=""  alt2"=""><code plain"="">dcMemory.SelectObject(&amp;bmp); </code></div> <div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code>&nbsp;</div> <div number7="" index6=""  alt2"=""><code plain"="">Graphics _Graphics(dcMemory.m_hDC); </code></div> <div number8="" index7=""  alt1"=""><code plain"="">_Graphics.DrawImage(_pImage,0,0,1024,768); </code></div> <div number9="" index8=""  alt2"=""><code comments"="">//这是在GDI+中的写法。 </code></div> <div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code>&nbsp;</div> <div number11="" index10=""  alt2"=""><code plain"="">dc.BitBlt(0,0,1024,768,&amp;dcMemory,0,0,SRCCOPY); </code></div> <div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code>&nbsp;</div> <div number13="" index12=""  alt2"=""><code plain"="">_Graphics.ReleaseHDC(dcMemory.m_hDC); </code></div> <div number14="" index13=""  alt1"=""><code plain"="">dcMemory.DeleteDC(); </code></div> <div number15="" index14=""  alt2"=""><code plain"="">bmp.DeleteObject();&nbsp;</code></div></div></td></tr></tbody></table><br /><br /><br />-------------------------------------------------------------------------<br />补充：<br />1.对于GDI常见的做法都是MemDC一下不解释了<br />2.GDI+似乎也可以用MemDC生成一个graphics，然后画好了，在把MemDC bit到WndDC上，但是会有各种各样的问题。<br />3.不管是那种方式，都是一个宗旨：直接操作前台屏幕上的DC在绘图的过程中会显得比较慢，所以生成一个内存画布，把所有的贴图操作都在不可见的内存画布上操作完成，然后一次性贴图到前台DC上。这样实际上还多了一次贴图，但是对于前台DC的操作已经是无限小了。<br />4.GDI+还有一种更优的方式：创建一个内存bitmap，然后从内存bitmap创建出GDI+位图，然后使用做个位图作为渲染画布。渲染完成后，在直接把bitmap贴图到前台DC上面来，内存中的bitmap是复用的，不用在每个渲染事件中重新创建。<br />5.为了更好的GL或者其他的渲染接口融合，基于bitmap的内存画布应该是最优的做法。<br /><br /><br /><br /><br /></div></div></div></div><img src ="http://www.cppblog.com/Error/aggbug/212250.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-11-12 14:28 <a href="http://www.cppblog.com/Error/archive/2015/11/12/212250.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MS Sql 数据库备份</title><link>http://www.cppblog.com/Error/archive/2015/09/06/211763.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sun, 06 Sep 2015 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/09/06/211763.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/211763.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/09/06/211763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/211763.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/211763.html</trackback:ping><description><![CDATA[<span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">数据库备份实例/**&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**数据库备份实例&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**朱二 2004年5月&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**备份策略:&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**数据库名:test&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**备份文件的路径e:\backup&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**每个星期天凌晨1点做一次完全备份,为保险起见,备份到两个同样的完全备份文件test_full_A.bak和test_full_B.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**每天1点(除了星期天)做一次差异备份,分别备份到两个文件test_df_A.bak和test_df_B.bak(采用附加到原备份的方式)&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**每一个小时做一次事务日志备份,分别备份到两个文件test_log_A.bak和test_log_B.bak(采用附加到原备份的方式)&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">**/&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--第一 完全备份部分&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_job @job_name = '完全备份'&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤1,把数据库备份到test_full_backup_A.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '完全备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_A.bak'' WITH INIT',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_fail_action=3, --失败后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_success_action=3,-- 成功后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤2,把数据库备份到test_full_B.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '完全备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp2',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_full_B.bak'' WITH INIT',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--调度&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobschedule @job_name = '完全备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@name = 'Schedule_1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_type = 8, -- 按周&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_interval = 1, --每星期天执行&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_recurrence_factor=1,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@active_start_time = 10000 --开始时间: 凌晨1点&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--第二 差异备份部分&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_job @job_name = '差异备份'&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤1,把数据库备份到test_df_A.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '差异备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_A.bak'' WITH DIFFERENTIAL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_fail_action=3, --失败后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_success_action=3,-- 成功后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤2,把数据库备份到test_df_B.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '差异备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp2',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP DATABASE Test TO DISK=''e:\backup\test_df_B.bak'' WITH DIFFERENTIAL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--调度&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobschedule @job_name = '差异备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@name = 'Schedule_1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_type = 8, -- 按周&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_interval = 126, --星期一至星期六&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_recurrence_factor=1,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@active_start_time = 10000 --开始时间: 凌晨1点&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--第二 事务备份部分&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_job @job_name = '事务备份'&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤1,把数据库备份到test_log_A.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '事务备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_A.bak''',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_fail_action=3, --失败后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@on_success_action=3,-- 成功后转到下一步&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--新增作业步骤2,把数据库备份到test_log_B.bak&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobstep @job_name = '事务备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@step_name = 'Setp2',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@subsystem = 'TSQL',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@command = 'BACKUP LOG Test TO DISK=''e:\backup\test_log_B.bak''',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_attempts = 5,&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@retry_interval = 5&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">--调度&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">EXEC sp_add_jobschedule @job_name = '事务备份',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@name = 'Schedule_1',&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_type = 4, -- 按天&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_interval=1,--每一天&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_subday_type=8, --按小时&nbsp;</span><br style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px;" /><span style="font-family: Tahoma, Helvetica, Arial, 宋体, sans-serif; line-height: 25.2000007629395px; background-color: #ddedfb;">@freq_subday_interval=1 --每一个小时&nbsp;</span><img src ="http://www.cppblog.com/Error/aggbug/211763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-09-06 09:33 <a href="http://www.cppblog.com/Error/archive/2015/09/06/211763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）VC++ Runtime Error 异常捕获之不挂的程序  ExceptionFilter没有调用，不生成dump(WIN8.1崩溃)</title><link>http://www.cppblog.com/Error/archive/2015/08/28/211705.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Fri, 28 Aug 2015 03:14:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/08/28/211705.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/211705.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/08/28/211705.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/211705.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/211705.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/yuzhiyuxia/article/details/16889155" style="color: #000000; text-decoration: none; font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px;">VC++ Runtime Error 异常捕获之不挂的程序</a><br /><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;很多软件通过设置自己的异常捕获函数，捕获未处理的异常，生成报告或者日志（例如生成mini-dump文件），达到Release版本下追踪Bug的目的。但是，到了VS2005（即VC8），Microsoft对CRT（C运行时库）的一些与安全相关的代码做了些改动，典型的，例如增加了对缓冲溢出的检查。新CRT版本在出现错误时强制把异常抛给默认的调试器（如果没有配置的话，默认是Dr.Watson），而不再通知应用程序设置的异常捕获函数，这种行为主要在以下三种情况出现。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用abort函数，并且设置了_CALL_REPORTFAULT选项（这个选项在Release版本是默认设置的）。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;启用了运行时安全检查选项，并且在软件运行时检查出安全性错误，例如出现缓存溢出。（安全检查选项/GS&nbsp;默认也是打开的）</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">（3）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;遇到_invalid_parameter错误，而应用程序又没有主动调用</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">_set_invalid_parameter_handler设置错误捕获函数。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">所以结论是，使用VS2005（VC8）编译的程序，许多错误都不能在SetUnhandledExceptionFilter捕获到。这是CRT相对于前面版本的一个比较大的改变，但是很遗憾，Microsoft却没有在相应的文档明确指出。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;"><strong><span style="color: red;">解决方法</span></strong></p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;之所以应用程序捕获不到那些异常，原因是因为新版本的CRT实现在异常处理中强制删除所有应用程序先前设置的捕获函数，如下所示：</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;/* Make sure any filter already in place is deleted. */</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;SetUnhandledExceptionFilter(NULL);</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;UnhandledExceptionFilter(&amp;ExceptionPointers);</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">解决方法是拦截CRT调用SetUnhandledExceptionFilter函数，使之无效。在X86平台下，可以使用以下代码。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">#ifndef _M_IX86</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#error "The following code only works for x86!"</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">#endif</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">void DisableSetUnhandledExceptionFilter()</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">{</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;void *addr = (void*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SetUnhandledExceptionFilter");</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;if (addr)</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;{</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned char code[16];</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int size = 0;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++] = 0x33;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++] = 0xC0;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++] = 0xC2;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++] = 0x04;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++] = 0x00;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD dwOldFlag, dwTempFlag;</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(addr, size, PAGE_READWRITE, &amp;dwOldFlag);</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(addr, size, dwOldFlag, &amp;dwTempFlag);</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">}</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">在设置自己的异常处理函数后，调用DisableSetUnhandledExceptionFilter禁止CRT设置即可。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;"><strong><span style="color: red;">其它讨论</span></strong></p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面通过设置api hook，解决了在VS2005上的异常捕获问题，这种虽然不是那么&#8220;干净&#8221;的解决方案，确是目前唯一简单有效的方式。</p><p style="font-family: Arial; line-height: 26px; color: #333333; background-color: #ffffff;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;虽然也可以通过_set_abort_behavior(0, _WRITE_ABORT_MSG | _CALL_REPORTFAULT), signal(SIGABRT, ...),&nbsp;和_set_invalid_parameter_handler(...)&nbsp;解决（1）（3），但是对于（2），设置api hook是唯一的方式。</p><p style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="color: #ff0000;">注：对于错误是否显示错误提示框，可以使用SetErrorMode（）<br /><br /><br /><strong>后面又遇到WIN8.1上</strong></span><span style="color: #000000; font-family: verdana, 'courier new'; font-size: 13px; line-height: 21px; background-color: #eeeeee;">VirtualProtect报错C0000005，最后还是想办法解决了</span></p><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: #0000FF; ">bool</span>&nbsp;AdjustPrivileges()&nbsp;<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hToken;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TOKEN_PRIVILEGES&nbsp;tp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;TOKEN_PRIVILEGES&nbsp;oldtp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwSize=<span style="color: #0000FF; ">sizeof</span>(TOKEN_PRIVILEGES);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LUID&nbsp;luid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!OpenProcessToken(GetCurrentProcess(),&nbsp;TOKEN_ADJUST_PRIVILEGES&nbsp;|&nbsp;TOKEN_QUERY,&nbsp;&amp;hToken))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(GetLastError()==ERROR_CALL_NOT_IMPLEMENTED)&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!LookupPrivilegeValue(NULL,&nbsp;SE_DEBUG_NAME,&nbsp;&amp;luid))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hToken);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(&amp;tp,&nbsp;<span style="color: #0000FF; ">sizeof</span>(tp));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tp.PrivilegeCount=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tp.Privileges[0].Luid=luid;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;Adjust&nbsp;Token&nbsp;Privileges&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!AdjustTokenPrivileges(hToken,&nbsp;FALSE,&nbsp;&amp;tp,&nbsp;<span style="color: #0000FF; ">sizeof</span>(TOKEN_PRIVILEGES),&nbsp;&amp;oldtp,&nbsp;&amp;dwSize))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hToken);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;close&nbsp;handles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(hToken);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;<br />}&nbsp;<br /><br /><br /><span style="color: #0000FF; ">void</span>&nbsp;DisableSetUnhandledExceptionFilter()<br /><br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*addr&nbsp;=&nbsp;(<span style="color: #0000FF; ">void</span>*)GetProcAddress(LoadLibrary(_T("kernel32.dll")),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"SetUnhandledExceptionFilter");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(addr)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;code[16];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;size&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++]&nbsp;=&nbsp;0x33;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++]&nbsp;=&nbsp;0xC0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++]&nbsp;=&nbsp;0xC2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++]&nbsp;=&nbsp;0x04;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code[size++]&nbsp;=&nbsp;0x00;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">SetProcessDEPPolicy(1);</span><span style="color: #008000; "><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwOldFlag,&nbsp;dwTempFlag;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;win8.1下用百度找了下PAGE_READWRITE崩溃，实际测试提升debug权限，SetProcessDEPPolicy(1);都无效，改成PAGE_EXECUTE_READWRITE生效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">VirtualProtect(addr,&nbsp;size,&nbsp;PAGE_READWRITE,&nbsp;&amp;dwOldFlag);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(addr,&nbsp;size,&nbsp;PAGE_EXECUTE_READWRITE,&nbsp;&amp;dwOldFlag);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory(GetCurrentProcess(),&nbsp;addr,&nbsp;code,&nbsp;size,&nbsp;NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(addr,&nbsp;size,&nbsp;dwOldFlag,&nbsp;&amp;dwTempFlag);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><p style="color: #362e2b; font-family: Arial; line-height: 26px; background-color: #ffffff;"><span style="color: #ff0000;"><br /><br /></span></p><img src ="http://www.cppblog.com/Error/aggbug/211705.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-08-28 11:14 <a href="http://www.cppblog.com/Error/archive/2015/08/28/211705.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TCP之选项TCP_KETEPALIVE</title><link>http://www.cppblog.com/Error/archive/2015/07/22/211342.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 22 Jul 2015 09:48:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/07/22/211342.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/211342.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/07/22/211342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/211342.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/211342.html</trackback:ping><description><![CDATA[<div>TCP之选项TCP_KETEPALIVE</div><div>&nbsp;</div><div>KEEPALIVE机制，是TCP协议规定的TCP层（非应用层业务代码实现的）检测TCP本端到对方主机的TCP连接的连通性的行为。避免服务器在客户端出现各种不良状况时无法感知，而永远等在这条TCP连接上。</div><div>&nbsp;</div><div>该选项可以设置这个检测行为的细节，如下代码所示：</div><div>int keepAlive = 1; &nbsp; &nbsp;// 非0值，开启keepalive属性</div><div>int keepIdle = 60; &nbsp; &nbsp;// 如该连接在60秒内没有任何数据往来,则进行此TCP层的探测</div><div>int keepInterval = 5; // 探测发包间隔为5秒</div><div>int keepCount = 3; &nbsp; &nbsp; &nbsp; &nbsp;// 尝试探测的次数.如果第1次探测包就收到响应了,则后2次的不再发</div><div>setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, (void *)&amp;keepAlive, sizeof(keepAlive));</div><div>setsockopt(sockfd, SOL_TCP, TCP_KEEPIDLE, (void*)&amp;keepIdle, sizeof(keepIdle));</div><div>setsockopt(sockfd, SOL_TCP, TCP_KEEPINTVL, (void *)&amp;keepInterval, sizeof(keepInterval));</div><div>setsockopt(sockfd, SOL_TCP, TCP_KEEPCNT, (void *)&amp;keepCount, sizeof(keepCount));</div><div>&nbsp;</div><div>设置该选项后，如果60秒内在此套接口所对应连接的任一方向都没有数据交换，TCP层就自动给对方发一个保活探测分节(keepalive probe)。这是一个对方必须响应的TCP分节。它会导致以下三种情况：</div><div>&nbsp; &nbsp; 对方接收一切正常：以期望的ACK响应。60秒后，TCP将重新开始下一轮探测。</div><div>&nbsp; &nbsp; 对方已崩溃且已重新启动：以RST响应。套接口的待处理错误被置为ECONNRESET。</div><div>&nbsp; &nbsp; 对方无任何响应：比如客户端那边已经断网，或者客户端直接死机。以设定的时间间隔尝试3次，无响应就放弃。套接口的待处理错误被置为ETIMEOUT。</div><div>&nbsp;</div><div>全局设置可更改/etc/sysctl.conf,加上:</div><div>net.ipv4.tcp_keepalive_intvl = 5</div><div>net.ipv4.tcp_keepalive_probes = 3</div><div>net.ipv4.tcp_keepalive_time = 60</div><div>&nbsp;</div><div>在程序中表现为：</div><div>阻塞模型下，当TCP层检测到对端socket不再可用时，内核无法主动通知应用层出错，只有应用层主动调用read()或者write()这样的IO<a href="http://www.2cto.com/os/" target="_blank">系统</a>调用时，内核才会利用出错来通知应用层。</div><div>非阻塞模型下，select或者epoll会返回sockfd可读,应用层对其进行读取时，read()会报错。</div><div>&nbsp;</div><div>一点经验：</div><div>实际上我们在做服务器程序的时候，对客户端的保活探测基本上不依赖于这个TCP层的keepalive探测机制。</div><div>而是我们自己做一套应用层的请求应答消息，在应用层实现这样一个功能。<br /><br /><br /><br />在Window上遇到这个问题，最后发现貌似只支持：<span style="white-space: pre;">		<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置KEEPALIVE (开启检测)</div><div><span style="white-space:pre">		</span>int optval = 1;</div><div><span style="white-space:pre">		</span>setsockopt(m_hSocket, SOL_SOCKET, SO_KEEPALIVE, (char *) &amp;optval, sizeof(optval));<br /><br /><br />然后实际断开是在主动Recv或者Send调用后才触发的</div><img src ="http://www.cppblog.com/Error/aggbug/211342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-07-22 17:48 <a href="http://www.cppblog.com/Error/archive/2015/07/22/211342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>UI开发今天学了两次新词：IMGUI  RMGUI</title><link>http://www.cppblog.com/Error/archive/2015/06/25/211039.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 25 Jun 2015 05:49:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/06/25/211039.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/211039.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/06/25/211039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/211039.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/211039.html</trackback:ping><description><![CDATA[<span style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 22px;">大神的解释：<br /><br />Immediate Mode GUI (IMGUI)。这种类型的更多的适用于显示区域实时刷新的程序里面，例如游戏和CAD等。<br />Retained Mode GUI (RMGUI)<br /><br /><br /></span><span style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 22px;">用一个传统RMGUI库的时候，用户往往需要显式的初始化每一个控件对象。每个控件都是存在内存中的实体，并且每个控件都需要自己保存一部分数据（例如一个slider需要保存一个数值，Button要保存一个回调事件等），用户还需要在一个回调函数里将控件里的数据拷贝回程序本身中（MVC模式）。</span><br /><span style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 22px;"><br /></span><span style="color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; line-height: 22px;">IMGUI模式在使用上会更简单粗暴一些。控件没有自己的对象，不保存任何状态，不用单独的去实现UI和程序间数据的交换，甚至都不需要单独为事件写回调函数。每个控件就是一个函数，直接在程序的Draw()函数里要哪个控件就调用哪个函数就好了。<br /><br /><br /><br /></span><img src ="http://www.cppblog.com/Error/aggbug/211039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-06-25 13:49 <a href="http://www.cppblog.com/Error/archive/2015/06/25/211039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WIN8 OEM版本没有找到组策略编辑器，设置默认使用管理员权限启动VS，免得每次都要提示重启VS才能调试程序</title><link>http://www.cppblog.com/Error/archive/2015/06/20/210998.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sat, 20 Jun 2015 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/06/20/210998.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210998.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/06/20/210998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210998.html</trackback:ping><description><![CDATA[<div>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "c:\windows\system32\cmd.exe" /d "RUNASADMIN" /f</div><div></div><div>reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" /v "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /d "RUNASADMIN" /f<br /><br /><br /><div><h1><a id="cb_post_title_url" href="http://www.cnblogs.com/yipu/archive/2013/05/05/3060893.html">VS2012：出现devenv.sln解决方案保存对话框</a></h1></div><div id="cnblogs_post_body"><p><span style="line-height: 18px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; orphans: 2; widows: 2; background-color: #ffffff;">问题描述：</span></p><p><span style="line-height: 18px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; orphans: 2; widows: 2; background-color: #ffffff;">　　打开VS2012项目时，提示保存&#8220;devenv.sln&#8221;</span></p><p>&nbsp;</p><p><span style="line-height: 18px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; orphans: 2; widows: 2; background-color: #ffffff;">解决方法：</span></p><p><span style="line-height: 18px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; orphans: 2; widows: 2; background-color: #ffffff;">　　找到文件：C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\vslauncher.exe</span></p><p><span style="line-height: 18px; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; orphans: 2; widows: 2; background-color: #ffffff;">　　鼠标右键设置&#8220;兼容性&#8221;-&gt;&#8220;以管理员身份运行此程序&#8221;即可</span></p></div></div><img src ="http://www.cppblog.com/Error/aggbug/210998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-06-20 13:03 <a href="http://www.cppblog.com/Error/archive/2015/06/20/210998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>coco2d的obj内存管理：</title><link>http://www.cppblog.com/Error/archive/2015/06/06/210845.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sat, 06 Jun 2015 13:28:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/06/06/210845.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210845.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/06/06/210845.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210845.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210845.html</trackback:ping><description><![CDATA[理解三个函数：release &nbsp;retain &nbsp;autorelease<br />对应的有两个计数器：ref &nbsp;autoref<br />autorelease是委托pool管理器在某个时候执行release<br /><br />话说cocos默认的create方法会创建完成以后立刻、马上执行一次autorelease，行为有点诡异，而且new出来只有ref值是1<br />作为规范，create以后应该马上autorelease和init否则坑爹<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; ">&nbsp;1</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;template&nbsp;&lt;typename&nbsp;TVal&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;xcc::RefPtr&lt;TVal&gt;&nbsp;TMakeRefPtr()<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TVal*&nbsp;pRefTem&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TVal;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xcc::RefPtr&lt;TVal&gt;&nbsp;rpTem&nbsp;=&nbsp;pRefTem;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rpTem-&gt;init();<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rpTem-&gt;autorelease();<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;rpTem;<br /><span style="color: #008080; ">11</span>&nbsp;}</div><br />顺便放一个用于cocos的智能指针：<span style="font-size: 13px; color: #008080;">&nbsp;1</span><span style="font-size: 13px; background-color: #eeeeee;">&nbsp;</span><span style="font-size: 13px; color: #008000;">//</span><span style="font-size: 13px; color: #008000;">&nbsp;cocos2d</span><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"><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span>template&lt;typename&nbsp;TCocosRefVal&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;RefPtr<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefPtr(TCocosRefVal*&nbsp;pRefVal&nbsp;=&nbsp;NULL)<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal&nbsp;=&nbsp;pRefVal;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__IncRef();<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">11</span>&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefPtr(<span style="color: #0000FF; ">const</span>&nbsp;RefPtr&lt;TCocosRefVal&gt;&amp;&nbsp;refVal)<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal&nbsp;=&nbsp;pRefVal;<br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__IncRef();<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">17</span>&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefPtr(RefPtr&lt;TCocosRefVal&gt;&amp;&amp;&nbsp;refVal)<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal&nbsp;=&nbsp;refVal.m_pRefVal;<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;refVal.m_pRefVal&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~RefPtr()<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__DecRef();<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">29</span>&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;RefPtr&amp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;=&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;RefPtr&lt;TCocosRefVal&gt;&amp;&nbsp;refVal)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(m_pRefVal&nbsp;!=&nbsp;refVal.m_pRefVal)<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reset(refVal.m_pRefVal);<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">36</span>&nbsp;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Reset(TCocosRefVal*&nbsp;pRefVal&nbsp;=&nbsp;NULL)<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__DecRef();<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal&nbsp;=&nbsp;pRefVal;<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__IncRef();<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;==&nbsp;(<span style="color: #0000FF; ">const</span>&nbsp;RefPtr&lt;TCocosRefVal&gt;&amp;&nbsp;refVal)<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(m_pRefVal&nbsp;!=&nbsp;refVal.m_pRefVal);<br /><span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;TCocosRefVal*&nbsp;Get()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_pRefVal;<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;TCocosRefVal*()&nbsp;<span style="color: #0000FF; ">const</span><br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_pRefVal;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;TCocosRefVal*&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;-&gt;&nbsp;()&nbsp;<span style="color: #0000FF; ">const</span><br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;m_pRefVal;<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;TCocosRefVal&amp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;*&nbsp;()&nbsp;<span style="color: #0000FF; ">const</span><br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*m_pRefVal;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">71</span>&nbsp;<br /><span style="color: #008080; ">72</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;__IncRef()<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(NULL&nbsp;!=&nbsp;m_pRefVal)<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal-&gt;retain();<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">80</span>&nbsp;<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;__DecRef()<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(NULL&nbsp;!=&nbsp;m_pRefVal)<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CCAssert(m_pRefVal-&gt;retainCount()&nbsp;&gt;=&nbsp;1,&nbsp;"");<br /><span style="color: #008080; ">86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRefVal-&gt;release();<br /><span style="color: #008080; ">87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">89</span>&nbsp;<br /><span style="color: #008080; ">90</span>&nbsp;<span style="color: #0000FF; ">private</span>:<br /><span style="color: #008080; ">91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TCocosRefVal*&nbsp;m_pRefVal;<br /><span style="color: #008080; ">92</span>&nbsp;};</div><img src ="http://www.cppblog.com/Error/aggbug/210845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-06-06 21:28 <a href="http://www.cppblog.com/Error/archive/2015/06/06/210845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GetModuleHandle获取到的句柄是不用closehandle的</title><link>http://www.cppblog.com/Error/archive/2015/06/06/210844.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Sat, 06 Jun 2015 12:58:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/06/06/210844.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210844.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/06/06/210844.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210844.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210844.html</trackback:ping><description><![CDATA[<div>void FixWorkingDir()</div><div>{</div><div><span style="white-space:pre">	</span>HANDLE hCurrentExe = ::GetModuleHandle(NULL);</div><div></div><div><span style="white-space:pre">	</span>std::tstring strFileName;</div><div><span style="white-space:pre">	</span>std::tstring strPath;</div><div><span style="white-space:pre">	</span>strFileName.resize(MAX_PATH*2, 0);</div><div><span style="white-space:pre">	</span>::GetModuleFileName((HMODULE)hCurrentExe, const_cast&lt;TCHAR*&gt;(strFileName.data()), strFileName.size());</div><div></div><div><span style="white-space:pre">	</span>auto nPosEnd = strFileName.find_last_of(_T('\\'));</div><div><span style="white-space:pre">	</span>if (std::tstring::npos != nPosEnd)</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>strPath = strFileName.substr(0, nPosEnd);</div><div><span style="white-space:pre">		</span>::SetCurrentDirectory(strPath.c_str());</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span>else</div><div><span style="white-space:pre">	</span>{</div><div><span style="white-space:pre">		</span>XASSERT_MSG(false, _T("windows did not have root path, \\ must be found"));</div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div>}</div><img src ="http://www.cppblog.com/Error/aggbug/210844.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-06-06 20:58 <a href="http://www.cppblog.com/Error/archive/2015/06/06/210844.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从结果集创建临时表，存储过程中select其他存储过程的select返回</title><link>http://www.cppblog.com/Error/archive/2015/05/26/210747.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Tue, 26 May 2015 03:37:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/26/210747.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210747.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/26/210747.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210747.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210747.html</trackback:ping><description><![CDATA[<span style="color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">在sqlserver 下想复制一张表的，想到oracle下直接create table xxx as select * from ....即可。</span><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;" /><span style="color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">但是结果却是错误的，baidu一下发现。</span><br style="word-wrap: break-word; color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;" /><span style="color: #666666; font-family: 宋体, Arial; font-size: 12px; line-height: 26px; background-color: #ffffff;">sqlserver的语法是 : select * into tablenew from tableold<br /><br /><br /><br /></span><div>CREATE TABLE #TemTable AS SELECT * FROM PlatformCoinExchangeRecord;</div><div>SELECT * INTO #TemTable FROM PlatformCoinExchangeRecord;</div><div>SELECT * FROM #TemTable;</div><div>DROP TABLE #TemTable;<br /><br /><br /><div>CREATE TABLE #TemTable&nbsp;</div><div><span style="white-space:pre">	</span>(TotalOnlineDuration bigint,&nbsp;</div><div><span style="white-space:pre">	</span> ByPlayDuration int,&nbsp;</div><div><span style="white-space:pre">	</span> TotalPlayTimes int,&nbsp;</div><div><span style="white-space:pre">	</span> Task30 int,&nbsp;</div><div><span style="white-space:pre">	</span> Task60 int,&nbsp;</div><div><span style="white-space:pre">	</span> Task120 int);</div><div>INSERT INTO #TemTable exec NET_PW_GetPlayDurationTask 539;</div><div>SELECT * from #TemTable;</div><div>DROP TABLE #TemTable;<br />临时表可能创建后可能应为其他原因导致没有执行到drop，这样下次执行的时候临时表还存在，所以创建临时表以后最好会是做异常处理在catch中强制销毁。<br /><span style="color: #006699; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 13px; font-weight: bold; line-height: 14.65625px; white-space: pre; background-color: #ffffff;">CONTINUE HANDLE mysql可以用这个东西<br /></span><p style="line-height: 28px; margin: 0px 0px 10px; padding: 0px; color: #005327; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; font-size: 16px; background-color: #34c181;">&nbsp;CREATE TEMPORARY table IF NOT EXISTS alarmLeveltb<br />&nbsp;(&nbsp;&nbsp;&nbsp; devID bigint not null,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alarmLevel bigint not null<br />&nbsp;);</p><p style="line-height: 28px; margin: 0px 0px 10px; padding: 0px; color: #005327; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, u5b8bu4f53; font-size: 16px; background-color: #34c181;">truncate TABLE alarmLeveltb;--清空表中的数据</p>如果不存在某个表就创建，mysql写法<br /><br /><div number9="" index8=""  alt2"="" style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; color: #393939; margin: 0px !important; padding-right: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important;"><code plain"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #000000 !important;">IF objectproperty(object_id(@DbTableFileName),</code><code string"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: blue !important;">'IsUserTable'</code><code plain"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #000000 !important;">) </code><code keyword"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #0000ff !important;">IS</code>&nbsp;<code color1"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: gray !important;">NOT</code>&nbsp;<code color1"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: gray !important;">NULL</code></div><div number10="" index9=""  alt1"="" style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; color: #393939; margin: 0px !important; padding-right: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; background-color: #ffffff !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important;"><code spaces"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important;">&nbsp;&nbsp;&nbsp;</code><code plain"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #000000 !important;">PRINT </code><code string"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: blue !important;">'EXISTS '</code></div><div number11="" index10=""  alt2"="" style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; color: #393939; margin: 0px !important; padding-right: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; background-color: #f4f4f4 !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important;"><code keyword"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #0000ff !important;">ELSE</code></div><div number12="" index11=""  alt1"="" style="font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace; font-size: 12px; color: #393939; margin: 0px !important; padding-right: 1em !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; background-color: #ffffff !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: inherit !important;"><code spaces"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important;">&nbsp;&nbsp;&nbsp;</code><code plain"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: #000000 !important;">PRINT </code><code string"="" style="white-space: pre-wrap; margin: 0px !important; padding: 0px !important; border-top-left-radius: 0px !important; border-top-right-radius: 0px !important; border-bottom-right-radius: 0px !important; border-bottom-left-radius: 0px !important; background-image: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 1.8em !important; outline: 0px !important; overflow: visible !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; font-family: Consolas, 'Bitstream Vera Sans Mono', 'Courier New', Courier, monospace !important; min-height: inherit !important; color: blue !important;">'NOT EXISTS '</code></div><br /><br />貌似没有找到直接创建的办法，所以要约定好结果集</div></div><img src ="http://www.cppblog.com/Error/aggbug/210747.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-26 11:37 <a href="http://www.cppblog.com/Error/archive/2015/05/26/210747.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>case when是个好东西</title><link>http://www.cppblog.com/Error/archive/2015/05/20/210696.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Wed, 20 May 2015 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/20/210696.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210696.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/20/210696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210696.html</trackback:ping><description><![CDATA[<div><a href="http://blog.csdn.net/wangziling100/article/details/7598873" style="color: #000000; text-decoration: none; font-family: 'Microsoft YaHei'; font-size: 20px; line-height: 30px; background-color: #ffffff;">在同一个sql语句中写不同条件的Count数量</a><br />select sum(case when Experience &gt;= 218706 then 1 else 0 end) as '[25,+',</div><div><span style="white-space:pre">	</span> &nbsp; sum(case when Experience &gt;= 49065 and Experience &lt; 218706 then 1 else 0 end) as '[20,25)',</div><div>&nbsp; &nbsp; &nbsp; &nbsp;sum(case when Experience &gt;= 11773 and Experience &lt; 49065 then 1 else 0 end) as '[15,20)',</div><div><span style="white-space:pre">	</span> &nbsp; sum(case when Experience &gt;= 2171 and Experience &lt; 11773 then 1 else 0 end) as '[10,15)'</div><div><span style="white-space:pre">	</span>from QPAccountsDB.dbo.AccountsInfo where IsAndroid = 0;<br /><br /><div>http://blog.csdn.net/wangziling100/article/details/7598873</div><br /></div><img src ="http://www.cppblog.com/Error/aggbug/210696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-20 15:49 <a href="http://www.cppblog.com/Error/archive/2015/05/20/210696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>NOMINMAX引起的stl gdi冲突，</title><link>http://www.cppblog.com/Error/archive/2015/05/18/210680.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Mon, 18 May 2015 03:55:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/18/210680.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210680.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/18/210680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210680.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-size: 15px; clear: both; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19px; background-color: #ffffff;">If you define NOMINMAX, because you prefer the STL version, then you may get problems while including gdiplus.h, which uses the min/max macro. As solution you need to include the STL headers and use "using namespace std"&nbsp;<strong style="margin: 0px; padding: 0px; border: 0px;">before</strong>&nbsp;you include the gdiplus.h.</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-size: 15px; clear: both; color: #222222; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 19px; background-color: #ffffff;">In example:</p><pre style="margin-top: 0px; padding: 5px; border: 0px; font-size: 13px; overflow: auto; width: auto; max-height: 600px; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; word-wrap: normal; color: #222222;"><code style="margin: 0px; padding: 0px; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, sans-serif; white-space: inherit;">#define NOMINMAX <br /> // Include C++ headers <br />#include &lt;algorithm&gt; <br />using namespace std; <br /> <br />// Include Windows headers <br />#include &lt;windows.h&gt; <br />#include &lt;gdiplus.h&gt;<br /><br />不能直接在工程中添加NOMINMAX，必须这么处理才能OK</code></pre><img src ="http://www.cppblog.com/Error/aggbug/210680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-18 11:55 <a href="http://www.cppblog.com/Error/archive/2015/05/18/210680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>minidump吐出来的dump文件为空，文件大小为0</title><link>http://www.cppblog.com/Error/archive/2015/05/15/210655.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 14 May 2015 20:55:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/15/210655.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210655.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/15/210655.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210655.html</trackback:ping><description><![CDATA[把WriteMiniDump的多线程保护去掉就正常了，太奇葩了把<img src ="http://www.cppblog.com/Error/aggbug/210655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-15 04:55 <a href="http://www.cppblog.com/Error/archive/2015/05/15/210655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unhandled exceptions 无法捕获的原因以及解决方案</title><link>http://www.cppblog.com/Error/archive/2015/05/15/210654.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 14 May 2015 18:17:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/15/210654.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210654.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/15/210654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210654.html</trackback:ping><description><![CDATA[<p style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;">// 本质上来说就是自己设置了UnhandleExceptionFilter后，C运行库或者其他什么别的函数也调用了，所以自己设置的就无效了，解决方案就是HOOK SET函数，让别人无法取代自己<br /><br />很多 C/C++ 程序会设置自己的&nbsp;<a href="http://msdn.microsoft.com/en-us/library/ms680634" style="text-decoration: none; color: #5353cb;">Unhandled Exception Filter</a>&nbsp;用于捕获 Unhandled exceptions 并输出一些信息（例如，<a href="http://msdn.microsoft.com/en-us/library/ms680360" style="text-decoration: none; color: #5353cb;">创建 mini-dump</a>&nbsp;或者输出调用栈到日志文件中）。</p><p style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;">从 VC++2005 开始出于安全因素微软改变了 CRT 的行为。在以下情况下 CRT 不会通知被注册的 Unhandled Exception Filter：</p><ol style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;"><li>调用了 abort() 并且<a href="http://msdn.microsoft.com/en-us/e631wekh" style="text-decoration: none; color: #5353cb;">设置 abort 的行为</a>为 _CALL_REPORTFAULT（Release 版本默认使用此设置）</li><li><a href="http://msdn.microsoft.com/en-us/8dbf701c" style="text-decoration: none; color: #5353cb;">Security Checks</a>&nbsp;失败时，具体来说就是检查到一些会引发安全问题的堆栈溢出时不会通知被注册的 Unhandled Exception Filter，会引发安全问题的堆栈溢出包括：覆盖了函数的返回值，覆盖了 Exception handler 的地址，覆盖了某些类型的参数。关于编译器的 Security Checks 的内容，详细参考：<a href="http://msdn.microsoft.com/en-us/library/Aa290051" style="text-decoration: none; color: #5353cb;">http://msdn.microsoft.com/en-us/library/Aa290051</a>（注意，此文章谈到的是 Visual Studio .NET 2003，其中&nbsp;<a href="http://msdn.microsoft.com/en-us/library/ms395801(v=vs.71).aspx" style="text-decoration: none; color: #5353cb;">_set_security_error_handler</a>&nbsp;函数在 VC++2005 以及以上版本已经无法使用）</li><li>如果没有调用&nbsp;<a href="http://msdn.microsoft.com/en-us/a9yf33zb" style="text-decoration: none; color: #5353cb;">_set_invalid_parameter_handler</a>&nbsp;设置 Invalid parameter handler 时，检查到了非法的参数</li></ol><p style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;">CRT 是通过何种方式使得我们注册的 Unhandled Exception Filter 不被调用的？答案在 CRT 的代码中：</p><pre prettyprint="" linenums:1=""  prettyprinted"="" style="overflow: auto; line-height: 18px; margin-top: 6px; margin-bottom: 6px; padding: 2px 7px; word-wrap: normal; width: 882px; color: #585858;"><ol style="margin: 0px; padding-left: 27px;"><li value="1" style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">/* 代码来源于 gs_report.c */</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">/* Make sure any filter already in place is deleted. */</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #660066;">SetUnhandledExceptionFilter</span><span style="color: #666600;">(</span><span style="color: #000000;">NULL</span><span style="color: #666600;">);</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #660066;">UnhandledExceptionFilter</span><span style="color: #666600;">(&amp;</span><span style="color: #660066;">ExceptionPointers</span><span style="color: #666600;">);</span></li></ol></pre><p style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;">CRT 通过调用 SetUnhandledExceptionFilter 并传递参数 NULL 来清除用户注册的 Unhandled Exception Filter。如果期望用户注册的 Unhandled Exception Filter 总是被调用那么应该避免 CRT 中相关的清理代码。做法之一就是修改 CRT 代码并且编译为静态库（微软的 VC++ Libraries 开发 Lead Martyn Lovell 在&nbsp;<a href="https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=101337&amp;SiteID=210" style="text-decoration: none; color: #5353cb;">https://connect.microsoft.com/feedback/ViewFeedback.aspx?FeedbackID=101337&amp;SiteID=210</a>&nbsp;谈到过有关的问题），这里并不建议使用此做法。另外一种做法则是改变 SetUnhandledExceptionFilter 的行为，使得 CRT 对&nbsp;SetUnhandledExceptionFilter 的调用不起任何作用（更加详细的论述可以参考《<a href="http://book.douban.com/subject/1088045/" style="text-decoration: none; color: #5353cb;">Windows 核心编程</a>》相关章节）。</p><pre prettyprint="" linenums:1=""  prettyprinted"="" style="overflow: auto; line-height: 18px; margin-top: 6px; margin-bottom: 6px; padding: 2px 7px; word-wrap: normal; width: 882px; color: #585858;"><ol style="margin: 0px; padding-left: 27px;"><li value="1" style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">// 无法得知此代码来源于</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">#ifndef</span><span style="color: #000000;"> _M_IX86</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #880000;">#error</span> <span style="color: #008800;">"The following code only works for x86!"</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">#endif</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;">&nbsp;</li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #880000;">// 此函数一旦成功调用，之后对 SetUnhandledExceptionFilter 的调用将无效</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000088;">void</span> <span style="color: #660066;">DisableSetUnhandledExceptionFilter</span><span style="color: #666600;">()</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #666600;">{</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #000088;">void</span><span style="color: #666600;">*</span><span style="color: #000000;"> addr </span><span style="color: #666600;">=</span> <span style="color: #666600;">(</span><span style="color: #000088;">void</span><span style="color: #666600;">*)</span><span style="color: #660066;">GetProcAddress</span><span style="color: #666600;">(</span><span style="color: #660066;">LoadLibrary</span><span style="color: #666600;">(</span><span style="color: #008800;">"kernel32.dll"</span><span style="color: #666600;">),</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">			</span><span style="color: #008800;">"SetUnhandledExceptionFilter"</span><span style="color: #666600;">);</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;">&nbsp;</li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #000088;">if</span> <span style="color: #666600;">(</span><span style="color: #000000;">addr</span><span style="color: #666600;">)</span> </li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #666600;">{</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #000088;">unsigned</span> <span style="color: #000088;">char</span><span style="color: #000000;"> code</span><span style="color: #666600;">[</span><span style="color: #006666;">16</span><span style="color: #666600;">];</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #000088;">int</span><span style="color: #000000;"> size </span><span style="color: #666600;">=</span> <span style="color: #006666;">0</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;">&nbsp;</li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        code</span><span style="color: #666600;">[</span><span style="color: #000000;">size</span><span style="color: #666600;">++]</span> <span style="color: #666600;">=</span> <span style="color: #006666;">0x33</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        code</span><span style="color: #666600;">[</span><span style="color: #000000;">size</span><span style="color: #666600;">++]</span> <span style="color: #666600;">=</span> <span style="color: #006666;">0xC0</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        code</span><span style="color: #666600;">[</span><span style="color: #000000;">size</span><span style="color: #666600;">++]</span> <span style="color: #666600;">=</span> <span style="color: #006666;">0xC2</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        code</span><span style="color: #666600;">[</span><span style="color: #000000;">size</span><span style="color: #666600;">++]</span> <span style="color: #666600;">=</span> <span style="color: #006666;">0x04</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        code</span><span style="color: #666600;">[</span><span style="color: #000000;">size</span><span style="color: #666600;">++]</span> <span style="color: #666600;">=</span> <span style="color: #006666;">0x00</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;">&nbsp;</li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #000000;">        DWORD dwOldFlag</span><span style="color: #666600;">,</span><span style="color: #000000;"> dwTempFlag</span><span style="color: #666600;">;</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #660066;">VirtualProtect</span><span style="color: #666600;">(</span><span style="color: #000000;">addr</span><span style="color: #666600;">,</span><span style="color: #000000;"> size</span><span style="color: #666600;">,</span><span style="color: #000000;"> PAGE_READWRITE</span><span style="color: #666600;">,</span> <span style="color: #666600;">&amp;</span><span style="color: #000000;">dwOldFlag</span><span style="color: #666600;">);</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #660066;">WriteProcessMemory</span><span style="color: #666600;">(</span><span style="color: #660066;">GetCurrentProcess</span><span style="color: #666600;">(),</span><span style="color: #000000;"> addr</span><span style="color: #666600;">,</span><span style="color: #000000;"> code</span><span style="color: #666600;">,</span><span style="color: #000000;"> size</span><span style="color: #666600;">,</span><span style="color: #000000;"> NULL</span><span style="color: #666600;">);</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #660066;">VirtualProtect</span><span style="color: #666600;">(</span><span style="color: #000000;">addr</span><span style="color: #666600;">,</span><span style="color: #000000;"> size</span><span style="color: #666600;">,</span><span style="color: #000000;"> dwOldFlag</span><span style="color: #666600;">,</span> <span style="color: #666600;">&amp;</span><span style="color: #000000;">dwTempFlag</span><span style="color: #666600;">);</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"> <span style="color: #666600;">}</span></li><li style="line-height: 16px; margin: 0px; padding: 0px 0px 0px 8px; list-style: decimal; border-left-width: 3px; border-left-style: solid; border-left-color: #58cc58;"><span style="color: #666600;">}</span></li></ol></pre><p style="color: #585858; font-family: Verdana, 'Lucida Grande', Geneva, Arial, sans-serif; line-height: 22.399999618530273px;">只需要在注册 Unhandled Exception Filter 之后调用 DisableSetUnhandledExceptionFilter() 函数，那么之后所有对 SetUnhandledExceptionFilter 的调用都将无效，自然 CRT 也无法通过调用 SetUnhandledExceptionFilter 来清除用户注册的 Unhandled Exception Filter。</p><img src ="http://www.cppblog.com/Error/aggbug/210654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-15 02:17 <a href="http://www.cppblog.com/Error/archive/2015/05/15/210654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SOUI的智能指针赏析</title><link>http://www.cppblog.com/Error/archive/2015/05/14/210647.html</link><dc:creator>Enic</dc:creator><author>Enic</author><pubDate>Thu, 14 May 2015 02:07:00 GMT</pubDate><guid>http://www.cppblog.com/Error/archive/2015/05/14/210647.html</guid><wfw:comment>http://www.cppblog.com/Error/comments/210647.html</wfw:comment><comments>http://www.cppblog.com/Error/archive/2015/05/14/210647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Error/comments/commentRss/210647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Error/services/trackbacks/210647.html</trackback:ping><description><![CDATA[<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;">之前自己设计Ref类型遇到new出来的地址，和Ref的this指针一致的情况，soui的这套做法一定程度避免了<br />如果有普通的单根继承直接使用: public&nbsp;</span>TObjRefImpl&lt;IRef&gt;<br />如果是多根继承可以指定析构类型 ：<span style="color: #008080;">public&nbsp;</span>TObjRefImpl2&lt;TDeleteType&gt;<br />但是多重继承两个Ref类还是没有解决，原则上应该劲量不再非接口是上使用多重继承<br /><span style="color: #008080;"><br /><br />&nbsp; 1</span>&nbsp;template&lt;<span style="color: #0000FF; ">class</span>&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TObjRefImpl&nbsp;:&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;T<br /><span style="color: #008080; ">&nbsp;&nbsp;3</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TObjRefImpl():m_cRef(1)<br /><span style="color: #008080; ">&nbsp;&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;&nbsp;8</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~TObjRefImpl(){<br /><span style="color: #008080; ">&nbsp;10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;11</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">!添加引用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;13</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">!<br /></span><span style="color: #008080; ">&nbsp;14</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;AddRef()<br /><span style="color: #008080; ">&nbsp;16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;InterlockedIncrement(&amp;m_cRef);<br /><span style="color: #008080; ">&nbsp;18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;19</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">!释放引用</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;21</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">!<br /></span><span style="color: #008080; ">&nbsp;22</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;Release()<br /><span style="color: #008080; ">&nbsp;24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;lRet&nbsp;=&nbsp;InterlockedDecrement(&amp;m_cRef);<br /><span style="color: #008080; ">&nbsp;26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(lRet==0)<br /><span style="color: #008080; ">&nbsp;27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnFinalRelease();<br /><span style="color: #008080; ">&nbsp;29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;lRet;<br /><span style="color: #008080; ">&nbsp;31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;32</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">!释放对象</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;34</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">!<br /></span><span style="color: #008080; ">&nbsp;35</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">&nbsp;36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnFinalRelease()<br /><span style="color: #008080; ">&nbsp;37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;<span style="color: #0000FF; ">this</span>;<br /><span style="color: #008080; ">&nbsp;39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;40</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">&nbsp;41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">volatile</span>&nbsp;LONG&nbsp;m_cRef;<br /><span style="color: #008080; ">&nbsp;42</span>&nbsp;};<br /><span style="color: #008080; ">&nbsp;43</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;44</span>&nbsp;template&lt;<span style="color: #0000FF; ">class</span>&nbsp;T,<span style="color: #0000FF; ">class</span>&nbsp;T2&gt;<br /><span style="color: #008080; ">&nbsp;45</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TObjRefImpl2&nbsp;:&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;TObjRefImpl&lt;T&gt;<br /><span style="color: #008080; ">&nbsp;46</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;47</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnFinalRelease()<br /><span style="color: #008080; ">&nbsp;49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;static_cast&lt;T2*&gt;(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">&nbsp;51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;52</span>&nbsp;};<br /><span style="color: #008080; ">&nbsp;53</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;54</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">CAutoRefPtr&nbsp;provides&nbsp;the&nbsp;basis&nbsp;for&nbsp;all&nbsp;other&nbsp;smart&nbsp;pointers</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;55</span>&nbsp;<span style="color: #008000; "></span>template&nbsp;&lt;<span style="color: #0000FF; ">class</span>&nbsp;T&gt;<br /><span style="color: #008080; ">&nbsp;56</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CAutoRefPtr<br /><span style="color: #008080; ">&nbsp;57</span>&nbsp;{<br /><span style="color: #008080; ">&nbsp;58</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">&nbsp;59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAutoRefPtr()&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">&nbsp;62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAutoRefPtr(_In_&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;nNull)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span style="color: #0000FF; ">void</span>)nNull;<br /><span style="color: #008080; ">&nbsp;66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">&nbsp;67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAutoRefPtr(_In_opt_&nbsp;T*&nbsp;lp)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;lp;<br /><span style="color: #008080; ">&nbsp;71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p&nbsp;!=&nbsp;NULL)<br /><span style="color: #008080; ">&nbsp;72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;AddRef();<br /><span style="color: #008080; ">&nbsp;74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;76</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CAutoRefPtr(<span style="color: #0000FF; ">const</span>&nbsp;CAutoRefPtr&nbsp;&amp;&nbsp;src)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;79</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=src.p;<br /><span style="color: #008080; ">&nbsp;80</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(p)<br /><span style="color: #008080; ">&nbsp;81</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;AddRef();<br /><span style="color: #008080; ">&nbsp;83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;84</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;85</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;86</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~CAutoRefPtr()&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;87</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;88</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)<br /><span style="color: #008080; ">&nbsp;89</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;90</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;Release();<br /><span style="color: #008080; ">&nbsp;91</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;92</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;93</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;94</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;<span style="color: #0000FF; ">operator</span>-&gt;()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">&nbsp;95</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">&nbsp;96</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br /><span style="color: #008080; ">&nbsp;97</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">&nbsp;98</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;99</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>&nbsp;T*()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">100</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">101</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p;<br /><span style="color: #008080; ">102</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">103</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&amp;&nbsp;<span style="color: #0000FF; ">operator</span>*()&nbsp;<span style="color: #0000FF; ">const</span><br /><span style="color: #008080; ">104</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">105</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*p;<br /><span style="color: #008080; ">106</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">107</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">The&nbsp;assert&nbsp;on&nbsp;operator&amp;&nbsp;usually&nbsp;indicates&nbsp;a&nbsp;bug.&nbsp;&nbsp;If&nbsp;this&nbsp;is&nbsp;really<br /></span><span style="color: #008080; ">108</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">what&nbsp;is&nbsp;needed,&nbsp;however,&nbsp;take&nbsp;the&nbsp;address&nbsp;of&nbsp;the&nbsp;p&nbsp;member&nbsp;explicitly.</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">109</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;T**&nbsp;<span style="color: #0000FF; ">operator</span>&amp;()&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">110</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">111</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SASSERT(p==NULL);<br /><span style="color: #008080; ">112</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&amp;p;<br /><span style="color: #008080; ">113</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">114</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>!()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">115</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">116</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(p&nbsp;==&nbsp;NULL);<br /><span style="color: #008080; ">117</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">118</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>&lt;(_In_opt_&nbsp;T*&nbsp;pT)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">119</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">120</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p&nbsp;&lt;&nbsp;pT;<br /><span style="color: #008080; ">121</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">122</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>!=(_In_opt_&nbsp;T*&nbsp;pT)&nbsp;<span style="color: #0000FF; ">const</span><br /><span style="color: #008080; ">123</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">124</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;!<span style="color: #0000FF; ">operator</span>==(pT);<br /><span style="color: #008080; ">125</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">126</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>==(_In_opt_&nbsp;T*&nbsp;pT)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">127</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">128</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;p&nbsp;==&nbsp;pT;<br /><span style="color: #008080; ">129</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">130</span>&nbsp;<br /><span style="color: #008080; ">131</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;<span style="color: #0000FF; ">operator</span>=(_In_opt_&nbsp;T*&nbsp;lp)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">132</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">133</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*<span style="color: #0000FF; ">this</span>!=lp)<br /><span style="color: #008080; ">134</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">135</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(p)<br /><span style="color: #008080; ">136</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">137</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;Release();<br /><span style="color: #008080; ">138</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">139</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=lp;<br /><span style="color: #008080; ">140</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(p)<br /><span style="color: #008080; ">141</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">142</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;AddRef();<br /><span style="color: #008080; ">143</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">144</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">145</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;<br /><span style="color: #008080; ">146</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">147</span>&nbsp;<br /><span style="color: #008080; ">148</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;<span style="color: #0000FF; ">operator</span>=(_In_&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;CAutoRefPtr&lt;T&gt;&amp;&nbsp;lp)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">149</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">150</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(*<span style="color: #0000FF; ">this</span>!=lp)<br /><span style="color: #008080; ">151</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">152</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(p)<br /><span style="color: #008080; ">153</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">154</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;Release();<br /><span style="color: #008080; ">155</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">156</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=lp;<br /><span style="color: #008080; ">157</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(p)<br /><span style="color: #008080; ">158</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">159</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;AddRef();<br /><span style="color: #008080; ">160</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">161</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">162</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;*<span style="color: #0000FF; ">this</span>;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">163</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">164</span>&nbsp;<br /><span style="color: #008080; ">165</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Release&nbsp;the&nbsp;interface&nbsp;and&nbsp;set&nbsp;to&nbsp;NULL</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">166</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Release()&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">167</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">168</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;pTemp&nbsp;=&nbsp;p;<br /><span style="color: #008080; ">169</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(pTemp)<br /><span style="color: #008080; ">170</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">171</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">172</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTemp-&gt;Release();<br /><span style="color: #008080; ">173</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">174</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">175</span>&nbsp;<br /><span style="color: #008080; ">176</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Attach&nbsp;to&nbsp;an&nbsp;existing&nbsp;interface&nbsp;(does&nbsp;not&nbsp;AddRef)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">177</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;Attach(_In_opt_&nbsp;T*&nbsp;p2)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">178</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">179</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)<br /><span style="color: #008080; ">180</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">181</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;Release();<br /><span style="color: #008080; ">182</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">183</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;p2;<br /><span style="color: #008080; ">184</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">185</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Detach&nbsp;the&nbsp;interface&nbsp;(does&nbsp;not&nbsp;Release)</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">186</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;Detach()&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">187</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">188</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;pt&nbsp;=&nbsp;p;<br /><span style="color: #008080; ">189</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">190</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;pt;<br /><span style="color: #008080; ">191</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">192</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HRESULT&nbsp;CopyTo(_Deref_out_opt_&nbsp;T**&nbsp;ppT)&nbsp;<span style="color: #0000FF; ">throw</span>()<br /><span style="color: #008080; ">193</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">194</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ppT&nbsp;==&nbsp;NULL)<br /><span style="color: #008080; ">195</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;E_POINTER;<br /><span style="color: #008080; ">196</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*ppT&nbsp;=&nbsp;p;<br /><span style="color: #008080; ">197</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)<br /><span style="color: #008080; ">198</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /><span style="color: #008080; ">199</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p-&gt;AddRef();<br /><span style="color: #008080; ">200</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">201</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;S_OK;<br /><span style="color: #008080; ">202</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">203</span>&nbsp;<br /><span style="color: #008080; ">204</span>&nbsp;<span style="color: #0000FF; ">protected</span>:<br /><span style="color: #008080; ">205</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T*&nbsp;p;<br /><span style="color: #008080; ">206</span>&nbsp;};</div><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"><span style="color: #0000ff;">struct</span>&nbsp;IObjRef<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;AddRef()&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;Release()&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;OnFinalRelease()&nbsp;=0;<br />};<br /><br /><br /></div><img src ="http://www.cppblog.com/Error/aggbug/210647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Error/" target="_blank">Enic</a> 2015-05-14 10:07 <a href="http://www.cppblog.com/Error/archive/2015/05/14/210647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>