﻿<?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++博客-&lt;a href="http://cppblog.com/jianc/"&gt;jianc's blog&lt;/a&gt;</title><link>http://www.cppblog.com/jianc/</link><description>&lt;script type="text/javascript"&gt;
    function OnClient(){
        var tmp = 1;
        var tmp2 = 2;
        var sum = tmp + tmp2;

        alert(sum);
    }
&lt;/script&gt;</description><language>zh-cn</language><lastBuildDate>Tue, 07 Apr 2026 23:24:15 GMT</lastBuildDate><pubDate>Tue, 07 Apr 2026 23:24:15 GMT</pubDate><ttl>60</ttl><item><title>代码自动补全插件</title><link>http://www.cppblog.com/jianc/archive/2016/01/31/212766.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sun, 31 Jan 2016 13:21:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2016/01/31/212766.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/212766.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2016/01/31/212766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/212766.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/212766.html</trackback:ping><description><![CDATA[<div><strong>Visual Assist</strong></div><div>http://www.wholetomato.com/</div><img src ="http://www.cppblog.com/jianc/aggbug/212766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2016-01-31 21:21 <a href="http://www.cppblog.com/jianc/archive/2016/01/31/212766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实用工具音速启动</title><link>http://www.cppblog.com/jianc/archive/2012/12/13/196202.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 13 Dec 2012 02:19:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/12/13/196202.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/196202.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/12/13/196202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/196202.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/196202.html</trackback:ping><description><![CDATA[http://www.3lsoft.com/<img src ="http://www.cppblog.com/jianc/aggbug/196202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-12-13 10:19 <a href="http://www.cppblog.com/jianc/archive/2012/12/13/196202.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlite 判断表是否存在</title><link>http://www.cppblog.com/jianc/archive/2012/10/17/193427.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 17 Oct 2012 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/10/17/193427.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/193427.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/10/17/193427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/193427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/193427.html</trackback:ping><description><![CDATA[<div>执行sql语句：<br />SELECT COUNT(*) FROM<strong> sqlite_master</strong> where type='table' and name='xxx表名'</div><img src ="http://www.cppblog.com/jianc/aggbug/193427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-10-17 17:54 <a href="http://www.cppblog.com/jianc/archive/2012/10/17/193427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sqlite开发工具</title><link>http://www.cppblog.com/jianc/archive/2012/10/17/193417.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 17 Oct 2012 07:30:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/10/17/193417.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/193417.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/10/17/193417.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/193417.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/193417.html</trackback:ping><description><![CDATA[<div>http://sqliteadmin.orbmu2k.de/</div><img src ="http://www.cppblog.com/jianc/aggbug/193417.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-10-17 15:30 <a href="http://www.cppblog.com/jianc/archive/2012/10/17/193417.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zeromq?</title><link>http://www.cppblog.com/jianc/archive/2012/10/11/193170.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 11 Oct 2012 07:58:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/10/11/193170.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/193170.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/10/11/193170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/193170.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/193170.html</trackback:ping><description><![CDATA[<div>http://www.zeromq.org/</div><div>https://github.com/zeromq/libzmq</div><div>http://zguide2.zeromq.org/page:all<br /></div><div>http://blog.codingnow.com/2011/02/zeromq_message_patterns.html</div><br /><img src ="http://www.cppblog.com/jianc/aggbug/193170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-10-11 15:58 <a href="http://www.cppblog.com/jianc/archive/2012/10/11/193170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt 搭建c/s框架总结</title><link>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 08 Aug 2012 08:07:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/186661.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/08/08/186661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/186661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/186661.html</trackback:ping><description><![CDATA[<div>Qt 搭建c/s框架总结<br /><br />一 服务端<br />使用QTcpServer类<br />QTcpServer *tcpServer = new QTcpServer(this);<br />开启监听<br />tcpServer-&gt;listen(QHostAddress::LocalHost, port);&nbsp;&nbsp; &nbsp;//port为端口号<br />如果监听失败, 请查看tcpServer-&gt;errorString();<br />可以连接tcpServer对象的newConnection信号, 这样一有客户端连接上来, 就可以调用我们的连接槽进行处理<br />connect(tcpServer, SIGNAL(newConnection), this, SLOT(slotNewClientConnect()));<br /><br />当断开监听时, 可以先判断单前是否在监听<br />tcpServer-&gt;isListening(), 若果是, 则调用tcpServer-&gt;close();关闭监听<br /><br />当客户端连接上来的时候, 可以调用tcpServer-&gt;nextPendingConnection();来允许客户端连接, 并返回客户端的socket对象<br />可以对连接上来的socket对象进行信号-槽关联, 这样就可以对这个客户端的socket对象进行更多的控制<br /><br /><br /><br />二 客户端<br />使用QTcpSocket对象连接到服务器<br />QTcpSocket *tcpSocket = new QTcpSocket(this);<br />tcpSocket-&gt;abort();&nbsp;&nbsp; &nbsp;//取消已有的连接<br />tcpSocket-&gt;connectToHost(服务器ip, 服务器端口);<br />可以关联tcpSocket的error信号, 这样连接失败时候就可以得到通知了<br />可以关联tcpSocket的readyRead()信号, 这样接收到数据时候也可以得到通知了<br />同样connected()信号提示已成功连接到服务端<br />disconnected()信号提示已经断开连接, 可以关联到该对象的deleteLater()槽上删除连接(服务端)<br /><br /><br />这样, 只要得到通讯的socket对象, 关联一下readyRead()信号就可以读取连接端发送过来的数据, 写的话直接调用write方法即可<br /><br /><br />写数据发送可以用QByteArray和QDataStream进行操作:<br />QDataStream对象可以对QByteArray对象进行读写操作<br />比如：<br />QByteArray block;<br />QDataStream out(&amp;block, QIODevice::WriteOnly);<br />out.setVersion(QDataStream::Qt_4_0);&nbsp;&nbsp; &nbsp;//要设置版本, 版本号要和接受端读取版本号一致<br />out &lt;&lt; (quint16)0; //写要发送数据的长度, 这里先用0写前面两个字节占位, 后面再补上来<br />out &lt;&lt; tr("发送的数据");<br />out.device()-&gt;seek(0);&nbsp;&nbsp; &nbsp;//又跳到缓冲区的开头, 准备些数据包的长度<br />out &lt;&lt; (quint16)(block.size() - sizeof(quint16));<br />然后使用连接套接字对象 conObj-&gt;write(QByteArray对象); 这样就把数据发送出去了, 如<br />conObj-&gt;write(block);<br /><br /><br />读取连接端发送过来的数据<br />同样用QDataStream来处理:<br />QDataStream in(连接端套接字对象);<br />in.setVersion(QDataStream::Qt_4_0);&nbsp;&nbsp; &nbsp;//要和发送端的版本号一致<br /><br />qint16 blockSize = 0; //初始化0<br /><br />if(0 == blockSize)<br />{<br />&nbsp;&nbsp;&nbsp; if(conSocket-&gt;bytesAvailable() &lt; (int)sizeof(quint16)) //如果已经接收到的数据小于2个字节, <br />&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //说明数据还没接收完，直接退出，等待数据接收完全<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; in &gt;&gt; bIockSize; //保存数据包大小(两个字节)<br />}<br />if(conSocket-&gt;bytesAvailable() &lt; blockSize)<br />{//接收到的数据不完全<br />&nbsp;&nbsp;&nbsp; return;<br />}<br />in &gt;&gt; message; //QString message; 把接收到的数据存放到message对象里面<br />这样就ok了<br /><br /><br />//取得本地ip地址信息<br />QString localHostName = QHostInfo::localHostName();<br />&nbsp;&nbsp;&nbsp; QHostInfo info = QHostInfo::fromName(localHostName);<br />&nbsp;&nbsp;&nbsp; qDebug() &lt;&lt; "localHostName:" &lt;&lt; localHostName &lt;&lt; endl<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;&lt; "IP Address:" &lt;&lt; info.addresses();<br /><br /><br /><br /><br /></div><img src ="http://www.cppblog.com/jianc/aggbug/186661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-08-08 16:07 <a href="http://www.cppblog.com/jianc/archive/2012/08/08/186661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt笔记</title><link>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sat, 04 Aug 2012 02:30:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/186237.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/08/04/186237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/186237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/186237.html</trackback:ping><description><![CDATA[由于工作需要, 开始学习Qt. 这里记下一些笔记, 方便以后查阅(随时更新).<br /><br />1.用Qt Creator创建一个基于GUI的应用程序, 选择基类有QWidget, QDialog, QMainWindow三种. 发现一个问题, 当选择用QWidget, QDialog时, 可以直接在派生类的构造函数里创建控件添加到布局管理器对象, 然后调用setLayout(布局管理器对象)就可以在界面显示创建好的控件了; 然而选用QMainWindow作为基类的时候, 这样操作却没有显示出控件来. 经过百度, 发现原来派生类还要创建一个QWidget对象, 把布局管理器放到这个QWidget对象上面, 然后把这个QWidget对象作为参数调用setCentralWidget就可以正常显示控件了.<br /><br />2.解决Qt中显示中文乱码的方法, 这里直接添加两个方法的调用:<br /><div><span style=" color:#800080;"></span><div><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>setCodecForTr<span style=" color:#000000;">(</span><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>codecForLocale<span style=" color:#000000;">());</span> <pre style="margin: 0px; text-indent: 0px;"><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>setCodecForCStrings<span style=" color:#000000;">(</span><span style=" color:#800080;">QTextCodec</span><span style=" color:#000000;">::</span>codecForLocale<span style="color: #000000;">());<br /><br />3.窗口样式<br /><div><span style="color: #008000;">setWindowFlags(Qt::FramelessWindowHint); //去掉窗口边框标题</span></div><br />4.md5加密<br /><div>Qt中使用MD5加密<br />QCryptographicHash test(QCryptographicHash::MD5);<br />QByteArray data;<br />data.append(tr("test"));<br />test.addData(data);<br />QByteArray result = test.result();<br /><br />result.toBase64(); //密文用base64编码<br />result.toHex(); //用16进制显示数据<br /><br />5.使用多线程<br />继承QThread, 重写run虚方法, 如果使用线程事件循环, 在run里面使用QObject对象并用connect关联信号, 需要在构造函数里调用<div>moveToThread<span style=" color:#000000;">(</span><span style=" color:#808000;">this</span><span style=" color:#000000;">);否则slots槽还是在主调线程中被调用而不是在新创建的线程中执行的.<br /><br />6.<div>wchar_t* 转QString<br /><br />wchar_t* wptr = L"test";<br />QString ret = QString::fromWCharArray(wptr);<br />QString ret2 = QString((QChar*)wptr, wcslen(wptr));<br /><br />QString 转wchar_t*<br />wchar_t szBuf[1024];<br />QString str = tr("hello");<br />wcscpy_s(reinterpret_cast&lt;wchar_t*&gt;(szBuf),<br />    sizeof(szBuf) / sizeof(wchar_t),<br />    reinterpret_cast&lt;const wchar_t*&gt;(str.utf16()));<br /><br />7.<br /><div>QTreeView 设置列宽度固定<br />QTreeView()::header()-&gt;setResizeMode(QHeaderView::Fixed);<br /><br />8.对话框屏幕居中显示<br /><div><span style=" color:#800080;">quint32</span> <span style=" color:#000000;">scrwidth</span> <span style=" color:#000000;">=</span> <span style=" color:#800080;">QApplication</span><span style=" color:#000000;">::</span>desktop<span style=" color:#000000;">()-&gt;</span>width<span style=" color:#000000;">();</span> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">scrheight</span> <span style=" color:#000000;">=</span> <span style=" color:#800080;">QApplication</span><span style=" color:#000000;">::</span>desktop<span style=" color:#000000;">()-&gt;</span>height<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">width</span> <span style=" color:#000000;">=</span> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>width<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#800080;">quint32</span> <span style=" color:#000000;">height</span> <span style=" color:#000000;">=</span> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>height<span style=" color:#000000;">();</span></pre> <pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> <span style=" color:#808000;">this</span><span style=" color:#000000;">-&gt;</span>move<span style=" color:#000000;">((</span><span style=" color:#000000;">scrwidth</span> <span style=" color:#000000;">-</span> <span style=" color:#000000;">width</span><span style=" color:#000000;">)</span> <span style=" color:#000000;">/</span> <span style=" color:#000080;">2</span><span style=" color:#000000;">,</span> <span style=" color:#000000;">(</span><span style=" color:#000000;">scrheight</span> <span style=" color:#000000;">-</span> <span style=" color:#000000;">height</span><span style=" color:#000000;">)</span> <span style=" color:#000000;">/</span> <span style=" color:#000080;">2</span><span style=" color:#000000;">);<br /><br />9.发送信号的时候, 一些类型作为参数, 需要注册:<br /></span></pre><div><span style=" color:#800080;">Q_DECLARE_METATYPE(类名)</span></div><div>qRegisterMetaType<span style=" color:#000000;">&lt;类名</span><span style=" color:#000000;">&gt;(</span><span style=" color:#008000;">"类名"</span><span style=" color:#000000;">);</span></div>类名也可以是结构体等其他结构<br /><br /><pre style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">10.rcc资源文件<br />bin目录下有个rcc.exe工具, 可以吧qrc脚本编译成rcc资源2进制文件, 命令如下:<br />rcc -binary xxx.qrc -o xxx.rcc<br /><br />在程序中引用这个rcc资源文件:<br />QResource::registerResource("xxx.rcc");<br />卸载<br />QResource::unregisterResource("xxx.rcc")<br /><br /><br /></pre></div></div></div><br /></span></div></div><br /></span></pre></div><pre style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" color:#000000;"></span></pre></div><img src ="http://www.cppblog.com/jianc/aggbug/186237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-08-04 10:30 <a href="http://www.cppblog.com/jianc/archive/2012/08/04/186237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Qt gif动画</title><link>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 31 Jul 2012 01:27:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/185717.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/07/31/185717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/185717.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/185717.html</trackback:ping><description><![CDATA[<div>Qt可以用QLabel和QMovie显示gif动画<br /><br /><br />QMovie *obj = new QMovie("xxx.gif");<br />labObj-&gt;setMovie(obj);<br />obj-&gt;start();</div><img src ="http://www.cppblog.com/jianc/aggbug/185717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-07-31 09:27 <a href="http://www.cppblog.com/jianc/archive/2012/07/31/185717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>w.cn9.cn注册</title><link>http://www.cppblog.com/jianc/archive/2012/06/06/177798.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 06 Jun 2012 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/06/06/177798.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/177798.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/06/06/177798.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/177798.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/177798.html</trackback:ping><description><![CDATA[<div>
<p>@w.cn邮箱注册地址：<br />
<a href="https://domains.live.com/members/signup.aspx?domain=w.cn" target="_blank">https://domains.live.com/members/signup.aspx?domain=w.cn</a></p>
<p>@9.cn邮箱注册地址：<br />
<a href="https://domains.live.com/members/signup.aspx?domain=9.cn" target="_blank">https://domains.live.com/members/signup.aspx?domain=9.cn</a></p>登陆地址:<a href="www.hotmail.com">www.hotmail.com</a></div><img src ="http://www.cppblog.com/jianc/aggbug/177798.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-06-06 16:01 <a href="http://www.cppblog.com/jianc/archive/2012/06/06/177798.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>取消svn记住密码</title><link>http://www.cppblog.com/jianc/archive/2012/05/31/176970.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 31 May 2012 12:51:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/31/176970.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/176970.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/31/176970.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/176970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/176970.html</trackback:ping><description><![CDATA[方法来源于网上<br />在系统盘下<br />进入目录: <div>Documents and Settings\系统用户名\Application Data\Subversion\auth\<br />把该删的删除, 就ok了<br /><br />记得备份..</div><img src ="http://www.cppblog.com/jianc/aggbug/176970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-31 20:51 <a href="http://www.cppblog.com/jianc/archive/2012/05/31/176970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对话框淡入浅出效果</title><link>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 29 May 2012 10:52:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/176639.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/29/176639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/176639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/176639.html</trackback:ping><description><![CDATA[要实现对话框淡入浅出效果, 还是挺简单的, 说白了, 就是在对话框初始化时候加个定时器, 在对话框销毁前也加个定时器, 定时器的操作, 无非就是更新对话框界面的透明度, 要改变对话框的透明度, 用一个API就搞定了:SetLayeredWindowAttributes<br /><br />恩, 思路就是这样, 这里上关键代码吧<br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">typedef&nbsp;BOOL&nbsp;(__stdcall&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">FunSetLayeredWindowAttributes)(HWND&nbsp;hwnd,&nbsp;COLORREF&nbsp;crKey,&nbsp;BYTE&nbsp;bAlpha,&nbsp;DWORD&nbsp;dwFlags);<br />FunSetLayeredWindowAttributes&nbsp;funSetLayeredWindowAttributes;<br />funSetLayeredWindowAttributes&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;&nbsp;(FunSetLayeredWindowAttributes)GetProcAddress(GetModuleHandle(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">user32.dll</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetLayeredWindowAttributes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);ModifyStyleEx(NULL,&nbsp;</span><span style="color: #000000; ">0x80000</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">WS_EX_LAYERED</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">窗口要有WS_EX_LAYERED属性才能用设置透明的那个API</span></div><div></div><br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{IDT_SHOW&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,&nbsp;IDT_EXIT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">101</span><span style="color: #000000; ">};</span></div></div>在OnInitDialog方法里面添加一个定时器</div><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: #000000; ">SetTimer(IDT_SHOW,&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,&nbsp;NULL);</span></div><br />同样, 在OnCancel方法里面添加一个定时器, 顺便把IDT_SHOW定时器给KILL掉<br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">KillTimer(IDT_SHOW);<br />SetTimer(IDT_EXIT,&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">,&nbsp;NULL);</span></div></div><br />OnTimer方法这样写:<br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(nIDEvent)<br />{<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;IDT_SHOW:<br />&nbsp;&nbsp;&nbsp;&nbsp;funSetLayeredWindowAttributes(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_hWnd,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_current&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_current&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_current&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(IDT_SHOW);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;IDT_EXIT:<br />&nbsp;&nbsp;&nbsp;&nbsp;m_current&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;funSetLayeredWindowAttributes(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_hWnd,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_current&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_current&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(IDT_EXIT);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />}</span></div></div><br />很简单吧, 一个淡入浅出效果就出来了<br /><br />另:<br />static控件背景透明<br />添加WM_CTLCOLOR消息映射<div>ON_WM_CTLCOLOR()<br />添加响应函数<br /><div>afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);</div><br />实现响应函数<br /><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"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(IDS_STATIC&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;pWnd</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetDlgCtrlID())<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;pDC</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">SetBkMode(TRANSPARENT);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(HBRUSH)::GetStockObject(NULL_BRUSH);<br />}</span></div></div><br /><br />这里, 封装了一个基类, 方便以后用<br />FadeIODlg.h<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: #000000; ">#pragma&nbsp;once<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;CFadeIODlg&nbsp;:&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;CDialog<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DECLARE_MESSAGE_MAP()<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;CFadeIODlg(UINT&nbsp;uDLGID,&nbsp;CWnd</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pParent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">~</span><span style="color: #000000; ">CFadeIODlg();<br /><br /></span><span style="color: #0000FF; ">protected</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;DoDataExchange(CDataExchange</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDX);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">virtual</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnOK();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;afx_msg&nbsp;BOOL&nbsp;OnInitDialog();<br />&nbsp;&nbsp;&nbsp;&nbsp;afx_msg&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;OnTimer(UINT&nbsp;nIDEvent);&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{&nbsp;TIME_BEGIN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">100</span><span style="color: #000000; ">,&nbsp;TIME_END&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">101</span><span style="color: #000000; ">};<br />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;BOOL&nbsp;(__stdcall&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">FUNSetLayeredWindowAttributes)(HWND&nbsp;hwnd,&nbsp;COLORREF&nbsp;crKey,&nbsp;BYTE&nbsp;bAlpha,&nbsp;DWORD&nbsp;dwFlags);<br />&nbsp;&nbsp;&nbsp;&nbsp;FUNSetLayeredWindowAttributes&nbsp;m_funTransparent;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">enum</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MAX_TRANSPARENT&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">最大透明度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_BEGIN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">开始计时器时间间隔</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_END&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">结束计时器时间间隔</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NUM_CHANGE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">改变透明度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;};<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">当前窗口透明度</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">};<br /><br /></span></div><br />FadeIODlg.cpp<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: #000000; ">#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">stdafx.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">UI.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FadeIODlg.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br /><br />#ifdef&nbsp;_DEBUG<br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;new&nbsp;DEBUG_NEW</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">#undef</span><span style="color: #000000; ">&nbsp;THIS_FILE</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;THIS_FILE[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;__FILE__;<br /></span><span style="color: #0000FF; ">#endif</span><span style="color: #000000; "><br /><br /><br />CFadeIODlg::CFadeIODlg(UINT&nbsp;uDLGID,&nbsp;CWnd</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pParent&nbsp;</span><span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;=&nbsp;NULL&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;CDialog(uDLGID,&nbsp;pParent)<br />{}<br /><br />CFadeIODlg::</span><span style="color: #000000; ">~</span><span style="color: #000000; ">CFadeIODlg()<br />{}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::DoDataExchange(CDataExchange</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDX)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CDialog::DoDataExchange(pDX);<br />}<br /><br /><br />BEGIN_MESSAGE_MAP(CFadeIODlg,&nbsp;CDialog)<br />&nbsp;&nbsp;&nbsp;&nbsp;ON_WM_TIMER()<br />END_MESSAGE_MAP()<br /><br />BOOL&nbsp;CFadeIODlg::OnInitDialog()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnInitDialog();<br />&nbsp;&nbsp;&nbsp;&nbsp;ModifyStyleEx(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">0x80000</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(FUNSetLayeredWindowAttributes)GetProcAddress(GetModuleHandle(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">User32.dll</span><span style="color: #000000; ">"</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">SetLayeredWindowAttributes</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_funTransparent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">m_funTransparent(this-&gt;GetSafeHwnd(),&nbsp;0,&nbsp;0,&nbsp;2);</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(TIME_BEGIN,&nbsp;NUM_BEGIN,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;TRUE;<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::OnTimer(UINT&nbsp;nIDEvent)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">switch</span><span style="color: #000000; ">(nIDEvent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;TIME_BEGIN:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetSafeHwnd(),&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_currentTransparent,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;NUM_CHANGE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_BEGIN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">case</span><span style="color: #000000; ">&nbsp;TIME_END:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_currentTransparent&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MAX_TRANSPARENT;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_funTransparent(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">GetSafeHwnd(),&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;m_currentTransparent,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_currentTransparent&nbsp;</span><span style="color: #000000; ">-=</span><span style="color: #000000; ">&nbsp;NUM_CHANGE;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_END);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">break</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000;">&nbsp;CFadeIODlg::OnOK()<br />{<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CFadeIODlg::OnCancel()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(m_funTransparent)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(TIME_BEGIN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(TIME_END,&nbsp;NUM_END,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnCancel();<br />}</span></div><br /><br />ok, 完成, 以后直接继承这个对话框, 稍微修改一下, 效果就出来了</div><img src ="http://www.cppblog.com/jianc/aggbug/176639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-29 18:52 <a href="http://www.cppblog.com/jianc/archive/2012/05/29/176639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HOOK CreateProcess没什么作用</title><link>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 24 May 2012 07:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/176027.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/24/176027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/176027.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/176027.html</trackback:ping><description><![CDATA[本来以为, 对CreateProcessA和CreateProcessW进行HOOK, 就可以对进程的打开做一到防线, 比如, 阻止某某文件运行<br />但是发现没什么作用, 看了一下, kernel32.dll确实是导出了CreateProcessA和CreateProcessW, 但估计这两个只是转发函数, 其实调用的是NTDLL.DLL里面的ZwCreateProcess或ZwCreateProcessEx<br /><img src ="http://www.cppblog.com/jianc/aggbug/176027.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-24 15:59 <a href="http://www.cppblog.com/jianc/archive/2012/05/24/176027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC对话框工程, theApp对象的析构</title><link>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 23 May 2012 06:23:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/175894.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/23/175894.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/175894.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/175894.html</trackback:ping><description><![CDATA[一开始, 我不清楚某某原因, 我在继承自CWinApp的app类中添加一个虚函数<div>virtual int ExitInstance();<br /><br />然后, 当我在对话框工程退出的时候, 发现这个ExitInstance方法并没有被调用, 我就有些糊涂, baidu+google, ...<br /><br />然后, 我就想, 我添加一个app类的析构方法算了, 但发现这个析构函数还是诡异的没被调用...<br /><br />theApp原本是一个全局对象, 它的构造和析构原本就是CRT库来处理的<br /><br />后来发现, 只要在theApp对象的成员InitInstance方法返回TRUE(默认是返回FALSE)就可以成功的调用ExitInstance和析构函数了<br /><br />ok, 诡异的InitInstance返回FALSE后, 就不会调用theApp对象的析构!</div><img src ="http://www.cppblog.com/jianc/aggbug/175894.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-23 14:23 <a href="http://www.cppblog.com/jianc/archive/2012/05/23/175894.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GDI Plus库使用基础</title><link>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 17 May 2012 05:19:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/175197.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/17/175197.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/175197.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/175197.html</trackback:ping><description><![CDATA[vc6使用GDI Plus库要装上Platform SDK2003<br /><br />配置好库环境后, 下面写出使用GDI Plus的基本步骤:<br />1.包含头文件<br />#include &lt;gdiplus.h&gt;<br />2.使用名字空间<br />using namespace Gdiplus;<br />3.连接必要的导入库文件<br />#pragma comment(lib, "gdiplus.lib")<br />4.初始化<br /><div>ULONG_PTR m_gdiplusToken;<br /><div>GdiplusStartupInput m_gdiplusStartupInput;<br /><div>GdiplusStartup(&amp;m_gdiplusToken, &amp;m_gdiplusStartupInput, NULL);</div>5.使用GDI Plus库<br />6.用完库后, 释放操作<br /><div>GdiplusShutdown(m_gdiplusToken);</div></div></div><img src ="http://www.cppblog.com/jianc/aggbug/175197.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-17 13:19 <a href="http://www.cppblog.com/jianc/archive/2012/05/17/175197.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc6编译时候卡住?</title><link>http://www.cppblog.com/jianc/archive/2012/05/11/174560.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 11 May 2012 05:38:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/11/174560.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/174560.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/11/174560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/174560.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/174560.html</trackback:ping><description><![CDATA[经常会出现这种情况, 卡的时候, 要ctrl+shift+esc强杀进程, 真怄火!<br />
<br />
google一下, 原来只要装一下sp6补丁就好了<br />
连接地址<br />
e文版:&nbsp;&nbsp;<a href="http://download.microsoft.com/download/1/9/f/19fe4660-5792-4683-99e0-8d48c22eed74/Vs6sp6.exe">vs6sp6</a><br />
中文版:&nbsp;<a href="http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe">vs6sp6</a><img src ="http://www.cppblog.com/jianc/aggbug/174560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-11 13:38 <a href="http://www.cppblog.com/jianc/archive/2012/05/11/174560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC点击Dialog窗体可拖动</title><link>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 11 May 2012 02:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/174547.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/11/174547.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/174547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/174547.html</trackback:ping><description><![CDATA[<div>MFC创建一个可通过鼠标点击客户区拖动窗口位置的方法<br /><br />通过添加消息响应函数<br />afx_msg UINT OnNcHitTest(CPoint point);<br />添加宏<br />ON_WM_NCHITTEST()<br /><br />然后, 定义OnNcHitTest的行为即可, OnNcHitTest的代码如下:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rect;<br />&nbsp;&nbsp;&nbsp;&nbsp;GetClientRect(rect);<br />&nbsp;&nbsp;&nbsp;&nbsp;ClientToScreen(rect);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(rect.PtInRect(point))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HTCAPTION;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />}</span></div><br />首先, 发生WM_NCHITTEST消息的时候, 程序先取得客户区的窗口矩形, 这里用到GetClientRect方法得到, 由于GetClientRect取得的是相对于窗口坐标系统, 但OnNcHitTest的参数point却是相对于屏幕的坐标系统, 所以这里用到了ClientToScreen把取到的客户区矩形转成相对于屏幕的坐标, 然后用CRect类的PtInRect方法判断point是否落在这个矩形里面, 如果是, 则返回HTCAPTION(就相当于这次点击是点击标题栏), 所以, 就可以这样来拖动窗口了. 如果, OnNcHitTest直接返回HTCAPTION的话, 那么, 但用户点击非客户区的时候, 有些功能会失效, 比如点击系统的关闭按钮, 试一下就会发现这个按钮无效了; ok, 如果点击的是非客户端, 者直接返回CDialog::OnNcHitTest(point), 这就是按默认处理了.<br /><br />以上的这个方法比较麻烦, 其实可以更简单一点, 只要先调用父类的OnNcHitTest(point), 取得返回值, 在判断是不是HTCLIENT, 如果是, 则返回HTCAPTION, 否则直接返回父类OnNcHitTest(point)的返回值就ok了, 修改后如下:<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: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(HTCLIENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;uRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HTCAPTION;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;uRet;<br />}</span></div><br />再简化一下, 就成这样子:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">UINT&nbsp;CTimerDlg::OnNcHitTest(CPoint&nbsp;point)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;UINT&nbsp;uRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CDialog::OnNcHitTest(point);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;(HTCLIENT&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;uRet)&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;HTCAPTION&nbsp;:&nbsp;uRet;<br />}</span></div><br /><br /><br /></div><img src ="http://www.cppblog.com/jianc/aggbug/174547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-11 10:59 <a href="http://www.cppblog.com/jianc/archive/2012/05/11/174547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>可等待计时器内核对象</title><link>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 10 May 2012 12:38:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/174491.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/10/174491.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/174491.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/174491.html</trackback:ping><description><![CDATA[<div>之前学习win32 platform sdk编程的时候, 有学到一个计时器的东西, 那个挺简单的, 就是调用SetTimer创建一个基于某个窗口回调的计时器, 既间隔时间使窗口收到WM_TIMER消息, 或间隔时间, 调用我们自己定义的一个回调函数.<br />创建可等待计时器内核对象, 可以实现类似功能, 现在, 下边给出如何使用可等待计时器内核对象<br /><div>1.CreateWatchDogTimer</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: #000000; ">HANDLE&nbsp;CreateWatchDogTimer(<br />&nbsp;&nbsp;LPCWSTR&nbsp;pszWatchDogName,<br />&nbsp;&nbsp;DWORD&nbsp;dwPeriod,<br />&nbsp;&nbsp;DWORD&nbsp;dwWait,<br />&nbsp;&nbsp;DWORD&nbsp;dwDfltAction,<br />&nbsp;&nbsp;DWORD&nbsp;dwParam,<br />&nbsp;&nbsp;DWORD&nbsp;dwFlags<br />);</span></div><br /><br />2.SetWaitableTimer<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: #000000; ">BOOL&nbsp;WINAPI&nbsp;SetWaitableTimer(<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;hTimer,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;LARGE_INTEGER</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDueTime,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;lPeriod,<br />&nbsp;&nbsp;__in_opt&nbsp;&nbsp;PTIMERAPCROUTINE&nbsp;pfnCompletionRoutine,<br />&nbsp;&nbsp;__in_opt&nbsp;&nbsp;LPVOID&nbsp;lpArgToCompletionRoutine,<br />&nbsp;&nbsp;__in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;fResume<br />);</span></div><br /><br />CreateWatchDogTimer函数就是创建一个可等待事件内核对象<br />SetWaitableTimer函数就是设置内核对象的触发时间和时间间隔<br /><br />废话不多说了, 这里直接上代码<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CDialogDemoDlg::OnBtnCreateTimer()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;st;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wYear&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2012</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wDay&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wDayOfWeek&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wHour&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">20</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMilliseconds&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMinute&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">16</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wMonth&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;st.wSecond&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;localft;<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;utc;<br />&nbsp;&nbsp;&nbsp;&nbsp;SystemTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">st,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">localft);<br />&nbsp;&nbsp;&nbsp;&nbsp;LocalFileTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">localft,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">utc);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;LARGE_INTEGER&nbsp;liUTC;<br />&nbsp;&nbsp;&nbsp;&nbsp;liUTC.LowPart&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;utc.dwLowDateTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;liUTC.HighPart&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;utc.dwHighDateTime;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;m_Timer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateWaitableTimer(NULL,&nbsp;FALSE,&nbsp;NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetWaitableTimer(m_Timer,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">liUTC,&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1000</span><span style="color: #000000; ">,&nbsp;NULL,&nbsp;NULL,&nbsp;FALSE);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;CDialogDemoDlg::ThreadProc2(CDialogDemoDlg</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;pDlg)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;WaitForSingleObject(pDlg</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">m_Timer,&nbsp;INFINITE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(WAIT_OBJECT_0&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AfxMessageBox(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">可等待事件内核对象触发!</span><span style="color: #000000; ">"</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</span></div><br /><br />ThreadProc2是一个线程, 当时间一到, WaitForSingleObject就会返回, 因为这里创建的是一个自动复位内核对象, 说以WaitForSingleObject返回是会自动把内核对象复位, 这里为演示, 写了个死循环, 所以, 下一次调用WaitForSingleObject时, 如果时间未到, 线程任然会被挂起.<br />具体用法细节, MSDN<br />参考: windows核心编程</div><img src ="http://www.cppblog.com/jianc/aggbug/174491.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-10 20:38 <a href="http://www.cppblog.com/jianc/archive/2012/05/10/174491.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC非模态对话框销毁</title><link>http://www.cppblog.com/jianc/archive/2012/05/07/173914.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Mon, 07 May 2012 09:00:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/05/07/173914.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/173914.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/05/07/173914.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/173914.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/173914.html</trackback:ping><description><![CDATA[<div>非模态对话框需要重载OnCanel方法, 并调用DestroyWindow, 且不能调用基类的OnCanel<br />重载PostNcDestroy, 需要delete掉this指针</div><br /><div>// Overrides<br />&nbsp;&nbsp; &nbsp;// ClassWizard generated virtual function overrides<br />&nbsp;&nbsp; &nbsp;//{{AFX_VIRTUAL(CDlgTest)<br />&nbsp;&nbsp; &nbsp;protected:<br />&nbsp;&nbsp; &nbsp;virtual void DoDataExchange(CDataExchange* pDX);&nbsp;&nbsp;&nbsp; // DDX/DDV support<br />&nbsp;&nbsp; &nbsp;<span style="color: red;">virtual void PostNcDestroy();</span><br />&nbsp;&nbsp; &nbsp;//}}AFX_VIRTUAL<br /><br />// Implementation<br />protected:<br /><br />&nbsp;&nbsp; &nbsp;// Generated message map functions<br />&nbsp;&nbsp; &nbsp;//{{AFX_MSG(CDlgTest)<br />&nbsp;&nbsp; &nbsp;<span style="color: red;">virtual void OnOK();</span><br /><span style="color: red;">&nbsp;&nbsp; &nbsp;virtual void OnCancel();</span><br />&nbsp;&nbsp; &nbsp;//}}AFX_MSG<br /><br /><br /><div>void CDlgTest::OnOK() <br />{<br />&nbsp;&nbsp; &nbsp;// TODO: Add extra validation here<br />}<br /><br />void CDlgTest::OnCancel() <br />{<br />&nbsp;&nbsp; &nbsp;DestroyWindow();<br />}<br /><br />void CDlgTest::PostNcDestroy() <br />{<br />&nbsp;&nbsp; &nbsp;// TODO: Add your specialized code here and/or call the base class<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;CDialog::PostNcDestroy();<br />&nbsp;&nbsp; &nbsp;delete this;<br />}</div><br /><br /></div><img src ="http://www.cppblog.com/jianc/aggbug/173914.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-05-07 17:00 <a href="http://www.cppblog.com/jianc/archive/2012/05/07/173914.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用ATL写COM程序</title><link>http://www.cppblog.com/jianc/archive/2012/04/29/173106.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sat, 28 Apr 2012 18:20:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/29/173106.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/173106.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/29/173106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/173106.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/173106.html</trackback:ping><description><![CDATA[以前看COM技术内幕, 然后跟着书上代码一步一步敲到IDE上编译, 就为实现一个简单的接口, 都好生麻烦T_T<br />今天没事, 看了下ATL(Active Template Library), 跟着网上的入门学习资料自己照猫画虎, 结果一下子就ok了, 编译好, 在创建一个test工程去调用这个组件的接口函数, 一切顺利.<br />ps:以后用ATL写COM组件, 爽歪歪<br />ps:有空把COM技术内幕看完<br /> <img src ="http://www.cppblog.com/jianc/aggbug/173106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-29 02:20 <a href="http://www.cppblog.com/jianc/archive/2012/04/29/173106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>修改文件的时间DEMO</title><link>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 27 Apr 2012 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/172954.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/27/172954.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/172954.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/172954.html</trackback:ping><description><![CDATA[无事, 直接上代码<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">windows.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">iostream</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;argc,&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FILETIME&nbsp;fTm;<br />&nbsp;&nbsp;&nbsp;&nbsp;SYSTEMTIME&nbsp;sysTm;<br />&nbsp;&nbsp;&nbsp; HANDLE&nbsp;hFile;<br />&nbsp;&nbsp;&nbsp; hFile&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;CreateFile(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">d:/test.txt</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;GENERIC_READ&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;GENERIC_WRITE,&nbsp;FILE_SHARE_READ,&nbsp;NULL,&nbsp;OPEN_EXISTING,&nbsp;FILE_ATTRIBUTE_ARCHIVE,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(INVALID_HANDLE_VALUE&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;hFile)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">no</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;GetLocalTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sysTm);<br />&nbsp;&nbsp;&nbsp;&nbsp;sysTm.wYear&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2013</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp; SystemTimeToFileTime(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">sysTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm);<br />&nbsp;&nbsp;&nbsp; BOOL&nbsp;bRet&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;SetFileTime(hFile,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">fTm);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ret&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetLastError();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(bRet)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">ok</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp; </span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><br />主要调用SystemTimeToFileTime<br /><img src ="http://www.cppblog.com/jianc/aggbug/172954.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-27 19:45 <a href="http://www.cppblog.com/jianc/archive/2012/04/27/172954.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dll中开启共享数据段</title><link>http://www.cppblog.com/jianc/archive/2012/04/24/172630.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 24 Apr 2012 09:35:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/24/172630.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/172630.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/24/172630.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/172630.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/172630.html</trackback:ping><description><![CDATA[dll共享数据的一个方法, 可以在dll工程源文件里面这样写:<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">#pragma&nbsp;data_seg(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">.DataSegName</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />
</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;ifoo;<br />
</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;cfoo[</span><span style="color: #000000; ">1024</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #000000; ">"</span><span style="color: #000000; ">test</span><span style="color: #000000; ">"</span><span style="color: #000000; ">};<br />
</span><span style="color: #008000; ">//...</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">#pragma&nbsp;data_seg()<br />
</span></div>
然后, dll工程里创建一个def文件, def文件写上:<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: #000000; ">SECTIONS:</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp; .</span><span style="color: #000000; ">DataSegName</span><span style="color: #000000; "> READ&nbsp;WRITE&nbsp;SHARE<br />
</span></div>
.DataSegName就是节表的名字, 这里的PE文件中创建一个新节表, 然后def文件指明这个节表为共享节表, 即, 进程在加载这个dll文件的时候, 对这个节表进行直接映射, 而不是映射一份拷贝副本<br />
这样, 编译好工程后, 但这个dll文件被加载进进程时候, 不通进程就可以通过这个共享数据节表进行通讯了<br />
<br />
ps:之前用指令<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->#pragma comment(linker, "/section:.DataSegName, RWS")</div>
而不用def申明, 但这样却是不能对.DataSegName节进行数据共享, 不是很明白<br />
<br />
这不就是对编译的时候, 给link.exe程序传递一个参数而已么?<br />
link /dll /sections:.DataSegName ......<img src ="http://www.cppblog.com/jianc/aggbug/172630.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-24 17:35 <a href="http://www.cppblog.com/jianc/archive/2012/04/24/172630.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>随笔1</title><link>http://www.cppblog.com/jianc/archive/2012/04/03/169905.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Mon, 02 Apr 2012 17:35:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/03/169905.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169905.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/03/169905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169905.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169905.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 程序员, 好像一直都需要学习似的. 我的想法就比较简单, 想学好技术, 出来找份好的工作. 嗯, 所以我根据自己的爱好, 就把大部分精力投了进去学习学习, ...从高三毕业开始学, 一直到现在大三快毕业了, 自认为比较"努力的"在学编程技术.<br />&nbsp;&nbsp;&nbsp;&nbsp; 但是呢, 梦想是美好的, 现实是残酷的. 在网上, 跟一些同样搞程序的人一起交流, 发现我太幼稚了, 学识太浅薄了; 工作上, 很简单的项目也给我莫大的压力; ...呵呵, 是不是我比较笨? 也许吧, 不过我比较勤奋, 这是我的优点. 所以, 我走了很多很多的弯路, --一直在学习, 但是进步缓慢(也许是我太浮躁了吧, 有进步就应该窃喜了, 不过上了社会, 还是鸭梨山大啊).<br />&nbsp;&nbsp;&nbsp; 很多时候, 看书都看不懂. 现在我懂了, 不是我太笨了, 是因为有些基础还没打好. 就因为这样, 学习方法不对头, 导致了我浪费了好多时间. 我太2了, 学习要循序渐进嘛, 就好比一个没碰过电脑的人, 叫他一开始就去学mfc, 那是不可能的. 而我呢, 这道理是懂得的, 有时候做事却没去想这什么道理, 以为想学, 有书可以学, 就行了. 结果看了书, 碰了一脸灰, 还把自己的信心给磨灭了:太难了, 怎么看都看不懂, 再网上跟一些网友交流, 靠, 他们都能看懂, 我自卑啊~~<br />&nbsp;&nbsp;&nbsp; 现在我明白了, 那是我还有些基础没学过, 但他们已经学扎实了. 所以, 经过一些天的基础学习, 我再来学那些以前看似很难的东西, 现在学起来就轻松多了.<br />&nbsp;&nbsp;&nbsp; (咳...哥文笔不好, 不会写作, 以上说的语无伦次, 纯当自己练笔作文了, 希望以后能够写的好一点, 句子看得通顺一些......睡觉了, 88) <img src ="http://www.cppblog.com/jianc/aggbug/169905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-03 01:35 <a href="http://www.cppblog.com/jianc/archive/2012/04/03/169905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>搜索MessageBox窗口的显示消息</title><link>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Sun, 01 Apr 2012 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169786.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/04/01/169786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169786.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169786.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: #000000; ">BOOL&nbsp;CALLBACK&nbsp;EnumWindowsProc(HWND&nbsp;hwnd,&nbsp;LPARAM&nbsp;lParam)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;szBuf[</span><span style="color: #000000; ">4096</span><span style="color: #000000; ">];<br />&nbsp;&nbsp;&nbsp;&nbsp;GetClassName(hwnd,&nbsp;szBuf,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(szBuf));<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;str&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;szBuf;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">str.compare(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">#32770</span><span style="color: #000000; ">"</span><span style="color: #000000; ">))<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HWND&nbsp;hSubWnd&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetDlgItem(hwnd,&nbsp;</span><span style="color: #000000; ">0xffff</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(hSubWnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;len&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;GetWindowText(hSubWnd,&nbsp;szBuf,&nbsp;</span><span style="color: #0000FF; ">sizeof</span><span style="color: #000000; ">(szBuf));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">yes:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">szBuf&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;TRUE;<br />}<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;EnumWindows(EnumWindowsProc,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />}</span></div><img src ="http://www.cppblog.com/jianc/aggbug/169786.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-04-01 14:47 <a href="http://www.cppblog.com/jianc/archive/2012/04/01/169786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记19 多继承和虚拟继承</title><link>http://www.cppblog.com/jianc/archive/2012/03/30/169532.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 30 Mar 2012 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/30/169532.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169532.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/30/169532.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169532.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169532.html</trackback:ping><description><![CDATA[<span> </span><div><span style="background-color: #ffffff;"></span><span>1.虚拟继承 --继承了多个基类实例, 但只需要一份单独的共享实例</span><br /><span>2.对于一个类的基类的数目, c++没有限制(可以多继承)</span><br /><span>&nbsp;&nbsp; 两个基类是最常见的, 一个基类常常用于表示一个共有抽象接口, 第二个基类提供是有的实现</span><br /><span>&nbsp;&nbsp; 从第三个或更多个直接基类继承而来的派生类遵循mixin-based设计风格</span><br /><span>3.基类构造函数被调用的顺序以派生表中声明的顺序为准</span><br /><span>4.在多继承下, 派生类可以从两个或者更多个基类中继承同名的成员 --直接访问是二义的, 将导致编译时刻错误, 所以要显示指明调用哪个基类的哪个成员 Base::member</span><br /><span>5.public派生被称为类型继承(type inheritance) --派生类是基类的子类型</span><br /><span>&nbsp;&nbsp; 提供了较一般的基类的一种特化</span><br /><span>6.private派生被称为实现继承(implementation hinheritance) --派生类不直接支持基类的公有接口, 提供了自己的公有接口, 重用基类的实现</span><br /><span>&nbsp;&nbsp; private基类放映了一种"并非基于子类型关系"的继承形式, 基类的整个公有接口在派生类中变成private</span><br /><span>7.对于is-a子类型关系来说, public继承是一个很有利的机制</span><br /><span>8.has-a关系一般由组合(composition)而不是继承来支持 --使一个类称为另一个类的成员</span><br /><span>&nbsp;&nbsp; a:如果我们希望改写一个类的虚拟函数, 则必须使用私有继承而不是使用组合</span><br /><span>&nbsp;&nbsp; b:如果我们希望一个类能够引用"一个包含多种可能类型的层次结构"中的一个类, 那么就必须通过引用使用组合</span><br /><span>&nbsp;&nbsp; c:如果只是希望简单的重用实现, 则按值组合比继承更好</span><br /><span>&nbsp;&nbsp; d:如果希望对象的迟缓型分配, 按引用(使用一个指针)组合通常是一个不想的设计选择</span><br /><span>9.免除(exempting)个别成员的私有继承影响</span><br /><span>&nbsp;&nbsp; 以私有方式继承, 基类的所有protected和public成员全被继承为子类的私有成员</span><br /><span>&nbsp;&nbsp; 类设计者可以针对基类的个别成员, 是其免除非公有派生的影响:</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CSub: private CBase {</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public:</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using CBase::Member;</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };</span><br /><span>&nbsp;&nbsp; 免除个别成员的另一个原因是允许后续的派生类访问私有基类的protected成员</span><br /><span>&nbsp;&nbsp; 派生类只能将继承得到的成员恢复到原来的访问级别, 该访问级别不能比基类中原来指定的级别更严格或更不严格</span><br /><span>10.protected继承 --基类的所有公有成员都成为派生类的protected成员</span><br /><span>11.对象组合有两种形式</span><br /><span>&nbsp;&nbsp; a:按值组合(Composition by value)</span><br /><span>&nbsp;&nbsp; b:按引用组合(Composttion by reference)</span><br /><span>12.虚拟继承(virtual inheritance) --在虚拟继承下, 只有一个共享的基类子对象被继承, 而无论该基类在派生层次中出现多少次</span><br /><span>&nbsp;&nbsp; 共享的基类子对象被称为虚拟基类(vitual base class)</span><br /><span>&nbsp;&nbsp; 在虚拟继承下, 基类子对象的复制及由此引起的二义性都被取消了</span><br /><span>13.虚拟继承的语法:</span><br /><span>&nbsp;&nbsp;&nbsp; CSub: public virtual CBase1, public virtual CBase2 {...};</span><br /><span>&nbsp;&nbsp; virtual 和 public的顺序不重要<br /><br /><br /></span></div><img src ="http://www.cppblog.com/jianc/aggbug/169532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-30 15:49 <a href="http://www.cppblog.com/jianc/archive/2012/03/30/169532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记18 类继承和子类型</title><link>http://www.cppblog.com/jianc/archive/2012/03/30/169501.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 30 Mar 2012 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/30/169501.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169501.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/30/169501.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169501.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169501.html</trackback:ping><description><![CDATA[<span> </span><div><span style="background-color: #ffffff;"></span><span>1.继承(inheritance)</span><br /><span>2.c++通过类派生(class derivation)的机制来支持继承</span><br /><span>3.基类(base class)</span><br /><span>4.派生类(derived class)</span><br /><span>5.基类和派生类实例的集合称为类继承层次结构(hierarchy)</span><br /><span>6.如果基类和派生类共享相同的共有接口, 则派生类被称做基类的子类型(subtype)</span><br /><span>7.基类指针或引用可以直接引用其任何派生的类, 多态(polymorphism)</span><br /><span>8.在运行时刻需要解析出被调用的函数, 这个解析过程被称为动态绑定(dynamic bindng) --缺省情况下, 函数实在编译时刻被静态解析的</span><br /><span>9.c++中, 通过一种被称为虚拟函数(virtual function)的机制来支持动态绑定, 通过集成和动态绑定, 子类型多态性为面向对象的程序设计提供了基础</span><br /><span>10.面向对象的程序设计提供了一种方案, 把类型解析的负担从程序员的身上转移到编译器上</span><br /><span>11.类继承层次结构的主要好处是, 我盟可以针对抽象基类的共有接口进程编程, 而不是针对组成继承层次的个别类型</span><br /><span>&nbsp;&nbsp;&nbsp; 用户代码可以不受语言变化的影响 --多态和动态绑定</span><br /><span>12.在c++中, 多态性只存在于子类继承层次中 --void*型的指针可以被描述为多态, 但是语言本身并没有显示的支持他们, 必须由程序员自己来管理</span><br /><span>&nbsp;&nbsp;&nbsp; c++语言通过几种方式支持多态性</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过一个隐式转换, 从"派生类指针或引用"转到"其共有基类类型的指针或引用"</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过虚拟函数的机制</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过dynamic_cast和typeid操作符</span><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(SubClass* pSub = dynamic_cast&lt;SubClass*&gt;(pObj)) ...</span><br /><span>13.抽象基类(abstract base class)</span><br /><span>14.实体基类(concrete base class)</span><br /><span>15.纯虚拟函数(pure virtual function)</span><br /><span>16.覆盖(override)</span><br /><span>17.c++语言为我们提供了一种语法结构, 通过它可以指明, 一个虚拟函数只是提供了一个可以被子类改写的接口</span><br /><span>18.传递给缺省函数的值不是在运行时刻决定, 而是在编译时刻根据被调用函数的对象的类型决定</span><br /><span>19.虚拟析构函数 --主要是为了能够用delete销毁基类的时候也能够保证调用派生类的析构函数, 要不然它只是调用基类的析构函数而已<br /><br /><br /></span></div><img src ="http://www.cppblog.com/jianc/aggbug/169501.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-30 11:59 <a href="http://www.cppblog.com/jianc/archive/2012/03/30/169501.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记17 类模板</title><link>http://www.cppblog.com/jianc/archive/2012/03/29/169443.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 29 Mar 2012 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/29/169443.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/169443.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/29/169443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/169443.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/169443.html</trackback:ping><description><![CDATA[<div><span>1.队列(queue) --专门用于对象集合的数据结构, 对象被加入到队列的尾部, 而从队列的顶部被删除(first in first out FIFO)</span><br /><span>2.位单个类型提供手工生成的拷贝是一个无休止的过程, 也是一个无限复杂的维护过程</span><br /><span>3.模板参数表(template parameter list) --template&lt;xxx&gt; xxx就是模板参数表</span><br /><span>4.模板的类型参数(type parameter)由关键字class或关键字typename及其后的表示符构成</span><br /><span>5.每个模板参数前面都必须有关键字class或typename</span><br /><span>6.模板非类型参数(nontype parameter)由一个普通参数声明构成, 一个非类型参数只是该参数代表了一个潜在的值, 而这个值又代表类模板定义中的一个参量:</span><br /><span>&nbsp;&nbsp;&nbsp; template&lt;class Type, int size = 1024&gt;</span><br /><span>&nbsp;&nbsp;&nbsp; class Buffer;</span><br /><span>&nbsp;&nbsp;&nbsp; //如果模板实例的名字没有指定Buffer的大小, 则实例化Buffer的大小是1024</span><br /><span>7.类型转换的过程被称为模板实例化(template instantiation)</span><br /><span>&nbsp;&nbsp;&nbsp; 从通用的类模板定义中生成类的过程</span><br /><span>8.模板参数的缺省值</span><br /><span>&nbsp;&nbsp;&nbsp; template&lt;class Type = string, int size&gt;</span><br /><span>&nbsp;&nbsp;&nbsp; class Buffer;</span><br /><span>9.类模板成原函数可以再类模板的定义中定义, 该成员函数是inline成员函数; 也可以定义在类模板定义之外</span><br /><span>10.c++的模板编译模式(template compilation model)</span></div><img src ="http://www.cppblog.com/jianc/aggbug/169443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-29 17:20 <a href="http://www.cppblog.com/jianc/archive/2012/03/29/169443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记16 重载操作符和用户定义转换</title><link>http://www.cppblog.com/jianc/archive/2012/03/21/168495.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 21 Mar 2012 06:15:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/21/168495.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/168495.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/21/168495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/168495.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/168495.html</trackback:ping><description><![CDATA[<p><span>1.做操作数是该类类对象是, 才会考虑使用类成员重载操作符</span><br /><span>2.c++要求, 赋值(=), 下标([]), 调用(()), 和成员访问箭头(-&gt;)操作符必须被定义稳类成员操作符, 任何把这些操作符定义为名字空间成员的定义都会被</span></p>
<p><span>标记为编译时刻错误</span><br /><span>3.c++预定义可重载的操作符:</span><br /><span>&nbsp;&nbsp; + - * / % ^ &amp; | ~</span><br /><span>&nbsp;&nbsp; ! , = &lt; &gt; &lt;= &gt;= ++ --</span><br /><span>&nbsp;&nbsp; &lt;&lt; &gt;&gt; == != &amp;&amp; || += -= /=</span><br /><span>&nbsp;&nbsp; %= ^= &amp;= |= *= &lt;&lt;= &gt;&gt;= [] ()</span><br /><span>&nbsp;&nbsp; -&gt; -&gt;* new new[] delete delete[]</span><br /><span>4.对于内置类型的操作符, 它的预定义意义不能被改变</span><br /><span>5.预定义的操作符优先级不能被改变</span><br /><span>6.除了operator()外, 对其他重载操作符提供缺省实参都是非法的</span></p><img src ="http://www.cppblog.com/jianc/aggbug/168495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-21 14:15 <a href="http://www.cppblog.com/jianc/archive/2012/03/21/168495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记15 类的初始化赋值和析构</title><link>http://www.cppblog.com/jianc/archive/2012/03/21/168484.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 21 Mar 2012 05:04:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/21/168484.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/168484.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/21/168484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/168484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/168484.html</trackback:ping><description><![CDATA[<p align="justify">
<br />
<span>1.缺省情况下, 用一个类的对象初始化另一个对象, 或者向该类另一个对象赋值, 都由缺省的按成员语义(default memberwise semantics)支持</span><br />
<span>&nbsp;&nbsp; 在某些情况下, 对类的安全性和处理正确性是不够的, 需要类设计者提供特殊的拷贝构造函数(copy constructor)和拷贝赋值操作符(copy assignment </span></p>
<p><span>operator)的定义</span><br />
<span>2.new类对象 --只有new表达式成功的申请到空间内存, 构造函数才会被调用</span><br />
<span>3.构造函数定义为inline时, 创建对象是会在调用点展开构造函数</span><br />
<span>4.成员初始化列表(member initialization list)</span><br />
<span>5.构造函数不能用const或volatile关键字来声明</span><br />
<span>&nbsp;&nbsp; 一个const类对象在"从其构造函数完成到析构函数开始"这段时间内才被认为是const, volatile类对象也一样</span><br />
<span>6.explicit修饰符通知编译器不要提供隐式转换</span><br />
<span>&nbsp;&nbsp; void print(const CTest &amp;test);</span><br />
<span>&nbsp;&nbsp; //...</span><br />
<span>&nbsp;&nbsp; print("oops");&nbsp; //这种调用会把"oops"转换成一个CTest对象</span><br />
<span>&nbsp;&nbsp; 缺省情况下, 单参数构造函数(或者有多个参数, 除了第一个参数外, 其他都有缺省实参)被用作转换符</span><br />
<span>&nbsp;&nbsp; 无意的隐式类转换, 是很难跟踪的错误!, 关键字explicit被引入到标准c++中, 以帮助我们抑制这种不受欢迎的编译辅助行为</span><br />
<span>&nbsp;&nbsp; explicit只能被应用在构造函数上</span><br />
<span>7.缺省构造函数是不需要用户指定实参就能够被调用的构造函数, --并不意味着它不能接受实参, 只意味着构造函数的每个参数都有一个缺省值与之关联</span><br />
<span>8.限制对象创建 --把相关构造函数放到非公有访问区内, 从而限制或显示禁止某些形式的对创建动作</span><br />
<span>&nbsp;&nbsp; 在实际的c++程序中, 非公有的构造函数主要用处是:</span><br />
<span>&nbsp;&nbsp;&nbsp; 防止用一个类对象想该类另一个对象做拷贝</span><br />
<span>&nbsp;&nbsp;&nbsp; 指出只有当一个类在继承层次中被用作基类, 而不能直接被应用程序操纵时, 构造函数才能被调用</span><br />
<span>9.拷贝构造函数 --用一个类对象初始化该类的另一个对象被称为缺省按成员初始化(default memberwise initialization)</span><br />
<span>&nbsp;&nbsp; 一个类对象想该类的另一个对象作拷贝是通过依次拷贝每个非静态数据成员来实现</span><br />
<span>&nbsp;&nbsp; 类设计者可以通过提供特殊的拷贝构造函数(copy constructor)来改变缺省的行为</span><br />
<span>&nbsp;&nbsp; 拷贝构造函数不一定是const, 但它却必须是引用</span><br />
<span>10.无论何时, 当在一个函数内删除一个独立的堆对象时, 最好使用auto_ptr类对象而不是一个实际的指针</span><br />
<span>&nbsp;&nbsp; 如果delete表达式失败, 如一个异常被抛出, 会到时内存泄露(异常抛出, 跳过了delete操作?), 不会调用析构函数</span><br />
<span>&nbsp;&nbsp; 所以建议用auto_ptr智能指针</span><br />
<span>11.对于在堆中分配的类对象数组的元素, 我们没有办法提供一组显示的值来做初始化, 如果细化支持通过new表达式分配数组, 则类必须提供一个缺省的构</span></p>
<p><span>造函数, 或不提供构造函数</span><br />
<span>12.用一个类对象初始化另一个类对象, 称为按成员初始化(default memberwise initialization)</span><br />
<span>&nbsp;&nbsp;&nbsp; 发生在 用一个类对象显示的初始化另一个对象</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把一个类对象作为实参传递给一个函数</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把一个类对象作为一个函数的返回值传递回来</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非空顺序容器类型的定义</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把一个类对象插入到一个容器类型中</span><br />
<span>13.成员类对象初始化</span><br />
<span>14.缺省按成员赋值(default memberwise assignment) --用一个类对象向该类的另一个对象的赋值操作</span><br />
<span>&nbsp;&nbsp;&nbsp; 用隐式的拷贝赋值操作符</span><br />
<span>&nbsp;&nbsp;&nbsp; 一般来所, 如果缺省的按成员初始化对于一个类不合适, 则缺省的按成员赋值也不合适</span><br />
<span>&nbsp;&nbsp;&nbsp; 通过提供一个现实的拷贝赋值操作符的实例, 可以改变缺省的按成员赋值</span><br />
<span>&nbsp;&nbsp;&nbsp; 注意要防止一个类对象向自己赋值 --对于"先释放与该对象当前相关的资源, 以便分配与被拷贝对象相关资源"这样的拷贝赋值操作符, 拷贝自身尤其不</span></p>
<span>合适</span><br />
<span>&nbsp;&nbsp;&nbsp; 当一个类对象被赋值给该类的另一个对象是:</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a检查该类, 判断是否提供了一个现实的拷贝赋值操作符</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b如果是, 检查访问权限, 判断是否可以被调用</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c如果不能被调用, 编译错误, 否则执行这个调用</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d如果该类没有提供显示的拷贝赋值操作符, 则执行按缺省成员赋值</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e在缺省按成员赋值下, 每个内置类型或复合类型的数据成员被赋值给相应的成员</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f对于每个类成员对象, 递归执行a到f步, 知道所有内置或复合类型的数据成员都被赋值</span><br />
<span>&nbsp;&nbsp;&nbsp; 如果希望完全禁止按成员拷贝的行文, 将操作符声明为private并且不提供实际定义即可</span><br />
<span>&nbsp;&nbsp;&nbsp; 一般来说, 应该将拷贝构造函数和拷贝赋值操作视为一个个体单元</span><br />
<span>15.C++语言不能有效地返回一个类对象, 这被视为c++语言的一个重大缺陷</span><br />
<span>16.c++类对象的初始化总是比赋值更有效</span>
<p>&nbsp;</p>
<p align="justify">&nbsp;</p>
<img src ="http://www.cppblog.com/jianc/aggbug/168484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-21 13:04 <a href="http://www.cppblog.com/jianc/archive/2012/03/21/168484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是尾递归?</title><link>http://www.cppblog.com/jianc/archive/2012/03/21/168475.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Wed, 21 Mar 2012 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/21/168475.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/168475.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/21/168475.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/168475.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/168475.html</trackback:ping><description><![CDATA[<span><a href="http://www.cnblogs.com/JeffreyZhao/archive/2009/03/26/tail-recursion-and-continuation.html"><span>http://www.cnblogs.com/JeffreyZhao/archive/2009/03/26/tail-recursion-and-continuation.html</span></a></span><br />
<a href="http://fleurer-lee.com/lyah/recursion.htm"><span>http://fleurer-lee.com/lyah/recursion.htm</span></a>
<img src ="http://www.cppblog.com/jianc/aggbug/168475.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-21 11:31 <a href="http://www.cppblog.com/jianc/archive/2012/03/21/168475.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC多线程</title><link>http://www.cppblog.com/jianc/archive/2012/03/20/168426.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 20 Mar 2012 12:02:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/20/168426.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/168426.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/20/168426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/168426.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/168426.html</trackback:ping><description><![CDATA[<p><span>mfc下多线程编程</span></p>
<p><span>1.mfc支持两种线程</span><br />
<span>&nbsp;&nbsp; 用户界面线程</span><br />
<span>&nbsp;&nbsp; 工作线程</span><br />
<span>2.mfc中所有线程都是由CWinThread对象表示</span><br />
<span>&nbsp;&nbsp;&nbsp; CWinThread是用户接口线程的基类, CWinApp就是从CWinThread派生出来的</span><br />
<span style="background-color: transparent;">&nbsp;&nbsp;&nbsp; 在写用户接口线程时, 也要从CWinThread类派生出自己的线程类</span><br />
<span>&nbsp;&nbsp;&nbsp; 可以调用AfxBeginThread函数, 会创建CWinThread对象</span><br />
<span>3.编写是想工作线程的控制函数, 控制函数的原型:</span><br />
<span>&nbsp;&nbsp;&nbsp; UINT ControlFunctionName(LPVOID pParam); //线程回调</span><br />
<span>4.线程调用AfxBeginThread函数就可以创建新的线程</span><br />
<span>5.创建并启动工作线程:</span><br />
<span>&nbsp;&nbsp;&nbsp; CWinThread* AfxBeginThread(</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AFX_THREADPROC pfnThreadProc,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPVOID pParam,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nPriority = THREAD_PRIORITY_NORMAL,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT nStackSize = 0,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WORD dwCreateFlags = 0,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);</span><br />
<span>6.AfxEndThread终止线程</span><br />
<span>7.创建用户界面线程</span><br />
<span>&nbsp;&nbsp;&nbsp; 从CWinThread类派生出自己的线程类</span><br />
<span>&nbsp;&nbsp;&nbsp; 改造这个类</span><br />
<span>&nbsp;&nbsp;&nbsp; 启动用户界面</span><br />
<span>8.基类的一些成员函数:</span><br />
<span>&nbsp;&nbsp;&nbsp; ExitInstance, 当线程退出是, 会调用执行清理工作</span><br />
<span>&nbsp;&nbsp;&nbsp; InitInstance, 执行线程类实例初始化, 子类必须重写</span><br />
<span>&nbsp;&nbsp;&nbsp; OnIdle, 执行线程特定空闲时间处理</span><br />
<span>&nbsp;&nbsp;&nbsp; PreTranslateMessage, 过滤消息</span><br />
<span>&nbsp;&nbsp;&nbsp; Run, 执行线程函数</span><br />
<span>9.AfxBeginThread函数的另一个重载原型:(界面线程)</span><br />
<span>&nbsp;&nbsp;&nbsp; CWinThread* AfxBeginThread(</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRuntimeClass* pThreadClass,&nbsp; //用RUNTIME_CLASS宏将线程类指针转换为指向CRuntimeClass对象指针</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int nPriority = THREAD_PRIORITY_NORMAL,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UINT nStackSize = 0;</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD dwCreateFlags = 0,</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL</span><br />
<span>&nbsp;&nbsp;&nbsp; );</span><br />
<span>10.终止线程</span><br />
<span>&nbsp;&nbsp;&nbsp; 正常终止线程 VOID PostQuitMessage(int nExitCode);</span><br />
<span>&nbsp;&nbsp;&nbsp; 提前终止线程 在线程内调用AfxEndThread函数 VOID AfxEndThread(UINT nExitCode);</span><br />
<span>11.线程同步技术</span><br />
<span>&nbsp;&nbsp;&nbsp; 信号量 --限制使用共享资源的线程数目</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CSemaphore g_Sem(5, 5); 时间内最多只有5个线程能共享资源, 还初始开始时没有线程获得信号资源</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一旦线程访问共享资源, 信号量计数器就减1, 若变为0, 则下来对资源的访问就会被拒绝, 知道持有的资源线程释放了资源的持有权</span><br />
<span>&nbsp;&nbsp;&nbsp; 互斥对象 --内核对象</span><br />
<span>&nbsp;&nbsp;&nbsp; 临界区 --用户模式对象 弄不好就容易出现死锁, 不过用起来很简单, 只有4个API</span><br />
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InitializeCriticalSection, EterCreiticalSection, LeveCriticalSection, DeleteCriticalSection</span><br />
<span>&nbsp;&nbsp;&nbsp; 事件对象 --内核对象 分收工重置对象和自动重置对象</span></p>
<p><font style="background-color: #cce8cf" color="#000000" face="Verdana"></font>&nbsp;</p>
<p><font style="background-color: #cce8cf" color="#000000" face="Verdana"><br />
</font>&nbsp;</p><img src ="http://www.cppblog.com/jianc/aggbug/168426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-20 20:02 <a href="http://www.cppblog.com/jianc/archive/2012/03/20/168426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>lua基础知识</title><link>http://www.cppblog.com/jianc/archive/2012/03/16/168084.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 16 Mar 2012 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/16/168084.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/168084.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/16/168084.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/168084.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/168084.html</trackback:ping><description><![CDATA[<span>lua脚本基础</span><br />
<span>1.界面的编写很大一部分可以通过脚本来实现, 可以修改加脚本而不必重新编译程序, 可以节省界面设计的时间</span><br />
<span>2.lua脚本设计目的是为了嵌入应用程序中, 为应用程序提供灵活的扩展功能</span><br />
<span>3.lua脚本可以被c/c++调用, 也可以调用c/c++的函数, 也可以代替xml, ini等文件, 容易理解和维护</span><br />
<span>4.lua由标准c编写而成, 解释器不过200k, 在目前所有脚本引擎中, lua的速度最快, 是作为嵌入式脚本的最佳选择</span><br />
<span>5.lua_open() 返回一个指向lua解释器的一个指针</span><br />
<span>6.luaL_openlibs() 装载lua库, 提供了一些简单的函数, 如print</span><br />
<span>7.luaL_dofile() 执行脚本</span><br />
<span>8.lua_close() 关闭lua</span><br />
<span>9.相关头文件:</span><br />
<span>&nbsp;&nbsp;&nbsp; #include "lua.h"</span><br />
<span>&nbsp;&nbsp;&nbsp; #include "lualib.h"</span><br />
<span>&nbsp;&nbsp;&nbsp; #include "lauxlib.h"</span><br />
<span>&nbsp;&nbsp;&nbsp; #pragma comment(lib, "lua5.1.lib") //5.1版本的lua库</span><br />
<span>&nbsp;&nbsp;&nbsp; lua_State* L; //lua解释器指针</span><br />
<span>&nbsp;&nbsp;&nbsp; L = lua_open(); //初始化lua</span><br />
<span>&nbsp;&nbsp;&nbsp; luaL_openlibs(L); //载入lua基本库</span><br />
<span>&nbsp;&nbsp;&nbsp; luaL_dofile(L, "test.lua"); //执行脚本</span><br />
<span>&nbsp;&nbsp;&nbsp; lua_close(L); //清除lua</span><br />
<span>10.解释器加载lua脚本程序库: dofile("test.lua")</span><br />
<span>&nbsp;&nbsp; 然后就可以执行test.lua里面的函数了</span><br />
<span>11.lua_getglobal(L, "add"); //lua库的add全局函数</span><br />
<span>&nbsp;&nbsp;&nbsp; luapushnumber(L, x); //将x压栈</span><br />
<span>&nbsp;&nbsp;&nbsp; luapushnumber(L, y); //将y压栈</span><br />
<span>&nbsp;&nbsp;&nbsp; lua_call(L, 2, 1); //调用前面的add函数, 2个参数, 1个返回值</span><br />
<span>&nbsp;&nbsp;&nbsp; int ret = (int)lua_tonumber(L, -1); //取得返回值</span><br />
<span>&nbsp;&nbsp;&nbsp; lua_pop(L, 1); //弹出栈</span><br />
<span>12.lua的注释:</span><br />
<span>&nbsp;&nbsp;&nbsp; 单行注释: 从"--"到行末</span><br />
<span>&nbsp;&nbsp;&nbsp; 多行注释: 从"--[["到"]]", 当重新启用这段代码时</span><br />
<span>&nbsp;&nbsp;&nbsp; 技巧:</span><br />
<span>&nbsp;&nbsp;&nbsp; --[[</span><br />
<span>&nbsp;&nbsp;&nbsp; 语句</span><br />
<span>&nbsp;&nbsp;&nbsp; --]]</span><br />
<span>&nbsp;&nbsp;&nbsp; 这样注释后, 只要在"--[["前加一个"-", 那么语句就可以执行了</span><br />
<span>13.lua io输入:</span><br />
<span>&nbsp;&nbsp;&nbsp; a = io.read("*number") --read a number</span><br />
<span>14.lua中唯一一种数据结构 table</span><br />
<span>15.进入lua交互模式, 执行os.exit()时退出交互模式</span><br />
<span>&nbsp;&nbsp;&nbsp; C:\&gt;lua</span><br />
<span>&nbsp;&nbsp;&nbsp; Lua 5.1.4&nbsp; Copyright (C) 1994-2008 Lua.org, PUC-Rio</span><br />
<span>&nbsp;&nbsp;&nbsp; &gt; os.exit()</span><br />
&nbsp;&nbsp;&nbsp; <br />
<span>&nbsp;&nbsp;&nbsp; C:\&gt;</span><br />
<span>16.用lua -i参数来执行lua解释器时, 运行完lua程序后将进入交互式模式</span><br />
<span>&nbsp;&nbsp; -i对于调试收工测试尤为有用</span><br />
<span>&nbsp;&nbsp; 用lua -e参数, 可以直接在命令行中输入代码:</span><br />
<span>&nbsp;&nbsp;&nbsp; C:\&gt;lua -e "print(math.sin(12))"</span><br />
<span>&nbsp;&nbsp;&nbsp; -0.53657291800043</span><br />
<span>&nbsp;&nbsp; 用lua -l 可以加载库文件:</span><br />
<span>&nbsp;&nbsp;&nbsp; lua -i -l a -e "x = 10" --命令行下加载库a, 执行x=10操作, 执行完后进入交互模式</span><br />
<span>&nbsp;&nbsp; 只要定义了一个名为"_PROMPT"的全局变量, 解释器就会用它的值作为交互模式的命令提示符</span><br />
<span>&nbsp;&nbsp;&nbsp; lua -i -e "_PROMPT=' lua&gt;'"</span><br />
<span>17.lua的保留字 --关键字:</span><br />
<span>&nbsp;&nbsp; and break do else elseif</span><br />
<span>&nbsp;&nbsp; end false for function if</span><br />
<span>&nbsp;&nbsp; repeat return then true until</span><br />
<span>&nbsp;&nbsp; while</span><br />
<span>18.全局变量不需要声明, 只需要将一个值赋予一个全局变量就可以创建了, 在lua中访问一个未初始化的变量不会出错, 结果是一个nil值</span><br />
<span>&nbsp;&nbsp; 要删除一个变量, 可以把这个变量赋值为nil</span><br />
<span>19.在交互模式中, 如果要打印任何表达式的值, 可以用等号开头, 并跟随一个表达式:</span><br />
<span>&nbsp;&nbsp;&nbsp; = math.sin(3)</span><br />
<span>20.lua有8中基础的类型</span><br />
<span>&nbsp;&nbsp; nil(空) boolean(布尔) number(数字) string(字符串)</span><br />
<span>&nbsp;&nbsp; userdata(自定义类型) function(函数) thread(线程)</span><br />
<span>&nbsp;&nbsp; table(表)</span><br />
<span>&nbsp;&nbsp; 函数与type可以根据一个值返回其类型的名称</span><br />
<img src ="http://www.cppblog.com/jianc/aggbug/168084.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-16 16:16 <a href="http://www.cppblog.com/jianc/archive/2012/03/16/168084.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记14 类</title><link>http://www.cppblog.com/jianc/archive/2012/03/13/167774.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 13 Mar 2012 06:20:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/13/167774.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167774.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/13/167774.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167774.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167774.html</trackback:ping><description><![CDATA[<p><span>1.c++类 --用户定义的类型(user-defined type, UDT)</span><br />
<span>2.信息隐藏(information hiding)</span><br />
<span>3.除了静态数据成员外, 数据成员不能在类中被显示地初始化</span><br />
<span>4.一个成员函数只能重载自己类的其他成员函数</span><br />
<span>5.数据隐藏的优点:</span><br />
<span>&nbsp;&nbsp;&nbsp; 如果数据的访问属性是私有的, 则一般除了类的共有接口, 不能直接访问私有成员</span><br />
<span>&nbsp;&nbsp;&nbsp; 如果数据的访问属性是共有的, 则任何地方都可以直接访问这个数据成员</span><br />
<span>&nbsp;&nbsp;&nbsp; 但是, 如果类的实现变动了, 即那个成员改变了, 那么, 如果这个成员是私有的, 但共有接口没改变, 则不需要修改使用这个类的代码</span><br />
<span>&nbsp;&nbsp;&nbsp; 如果这个成员是共有的, 那么, 直接访问这个成员的任何代码都需要做相应的改变了</span><br />
<span>&nbsp;&nbsp;&nbsp; --所以, 数据封装性自有它的优点</span><br />
<span>6.访问限定符(access specifier) public, private, protected</span><br />
<span>7.在某些情况下, 允许某个函数而不是整个程序可以访问类的私有成员, 这样做会比较方便, 友元(friend)机制允许一个类授权其他的函数访问他的非公有</span><br />
<span>成员</span><br />
<span>8.友元声明以关键字friend开头, 只能出现在类的声明中</span><br />
<span>9.因为只有当一个类的类体已经完整时, 它才被视为已经被定义, 所以一个类不能有自身类型的数据成员, 但可以用指向自身类型的指针或引用作为数据成</span></p>
<p><span>员</span><br />
<span>10.类的定义不会引起存储区分配, 只有当定义一个类的对象时, 系统才会分配存储区</span><br />
<span>11.每个类成员函数的拷贝只有一份</span><br />
<span>12.把一个成员函数声明为const可以保证这个成员函数不修改类的数据成员, 但是, 如果该类含有指针, 那么在const成员函数中就能修改指针所指的对象, </span></font></p>
<p><span>编译器不会检测为错误, 这常常令c++初学者吃惊</span><br />
<span>13.为了允许修改一个类的数据成员, 即使它是一个const对象的数据成员, 我们也可以把改数据成员声明为mutable(易变的). mutable数据成员永远不会是</span></p>
<p><span>const成员, mutable成员中可以被更新</span><br />
<span>14.每个类成员函数都含有一个指向被调用对象的指针, 这个指针被称为this:</span><br />
<span>&nbsp;&nbsp;&nbsp; 在非const成员函数中, 它的类型是指向该类类型的指针</span><br />
<span>&nbsp;&nbsp;&nbsp; 在const成员函数中, 是指向const类类型的指针</span><br />
<span>&nbsp;&nbsp;&nbsp; 在volatile成员函数中, 是指向volatile类类型的指针</span><br />
<span>15.类的静态成员被当做该类类型的全局对象, 对于非静态成员, 每个类对象都有自己的拷贝, 而静态数据成员对每个类类型只有一个拷贝, 静态数据成员只</span></p>
<p><span>有一份, 该类类型对所有对象共享访问</span><br />
<span>16.同全局对象相比, 使用静态数据成员有两个优势:</span><br />
<span>&nbsp;&nbsp;&nbsp; 静态数据成员没有进入程序的全局名字空间</span><br />
<span>&nbsp;&nbsp;&nbsp; 可以实现信息隐藏, 静态成员可以是private成员, 而全局对象不能</span><br />
<span>17.静态数据成员的类型可以是其他所属类, 而非static数据成员只能被声明为该类的对象的指针或引用</span><br />
<span>18.静态数据成员可以被作为类成员函数的缺省实参, 而非static成员不能</span><br />
<span>19.静态成员函数的声明除了在类体中的函数声明加上关键字static, 以及不能声明为const或volatile之外, 与非静态成员函数相同, 出现在类体外的函数</span></p>
<p><span>定义不能指定关键字static</span><br />
<span>20.静态成员没有this指针</span><br />
<span>21.类成员的指针必须总是通过特定的对象或指向该类类型的对象的指针来访问</span><br />
<span>&nbsp;&nbsp;&nbsp; 针对类对象和引用的.*</span><br />
<span>&nbsp;&nbsp;&nbsp; 针对指向类对象的指针的-&gt;*</span><br />
<span>22.定义一个成员函数指针需要制定函数返回类型, 参数表和类:</span><br />
<span>&nbsp;&nbsp;&nbsp; int (CTest::*)();</span><br />
<span>&nbsp;&nbsp;&nbsp; int (CTest::*pmf)() = &amp;CTest::test;</span><br />
<span>&nbsp;&nbsp;&nbsp; pmf = &amp;CTest::test2;</span><br />
<span>23.静态类成员属于该类的全局对象和函数</span><br />
<span>24.联合:一种节省空间的类</span><br />
<span>&nbsp;&nbsp;&nbsp; 使用union是危险的, 通过一个不适当的数据成员以为的获取到当前存储在union中的值]</span><br />
<span>25.c++标准库提供了一个bitset类模板, 它可以辅助操作位的集合, 在可能的情况下, 应尽可能使用它来取代位域</span><br />
<span>26.一个类可以在另一个类中定义, 这样的类被称为嵌套类(nested class)</span><br />
<span>&nbsp;&nbsp;&nbsp; 嵌套类是其外围类的一个成员</span><br />
<span>27.类也可以定义在函数体内, 这样的类被称为局部类(local class)</span><br />
<span>&nbsp;&nbsp;&nbsp; 局部类的成员函数必须被定义在类定义中, 这就把局部类的成员函数的复杂性限制在几行代码中</span><br />
<br />
<br />
</p><img src ="http://www.cppblog.com/jianc/aggbug/167774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-13 14:20 <a href="http://www.cppblog.com/jianc/archive/2012/03/13/167774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记13 泛型算法</title><link>http://www.cppblog.com/jianc/archive/2012/03/13/167758.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Tue, 13 Mar 2012 01:45:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/13/167758.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167758.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/13/167758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167758.html</trackback:ping><description><![CDATA[<span>1.copy() 算法把一堆iterator当做前两个实参, 用它们标记出要拷贝的元素范围, 第三个实参是一个iterator, 它标记了被拷贝元素将要放置的起始位置, back_inserter被称为iterator适配器: 它使得元素被插入到作为实参的vector的尾部</span><br />
<span>2.unique()随然去掉了容器中的重复值, 但是只去掉相邻的重复值, 因此可以先对容器进行sort()排序</span><br />
<img src ="http://www.cppblog.com/jianc/aggbug/167758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-13 09:45 <a href="http://www.cppblog.com/jianc/archive/2012/03/13/167758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记12 异常处理</title><link>http://www.cppblog.com/jianc/archive/2012/03/12/167709.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Mon, 12 Mar 2012 03:55:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/12/167709.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167709.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/12/167709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167709.html</trackback:ping><description><![CDATA[<p>1.c++的异常处理机制被称为不可恢复的(nonresumptive)<br />2.栈展开(stack unwinding)<br />&nbsp;&nbsp;&nbsp; 如果找到一个catch子句, 则该异常被处理, 如果没有找到catch子句, 则在主调函数继续查找<br />&nbsp;&nbsp;&nbsp; 这个过程沿着潜逃函数调用链向上继续, 直到找到该异常的catch子句.<br />3.重新抛出(rethow)<br />&nbsp;&nbsp;&nbsp; throw; //rethrow语句只能出现在catch子句飞复合语句中<br />&nbsp;&nbsp;&nbsp; 被抛出的异常就是原来的异常对象<br />4.把catch子句中的异常对象声明为引用, 免去了对象的内存拷贝, 又可以确保应用在catch子句中的异常对象上的修改操作, 能够反映到被重新抛出的异常</p>
<p>对象上<br />5.catch-all<br />&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; catch(...) {} //catch-all格式<br />6.catch子句被检查的顺序与它们在try块之后出现的顺序相同, 一旦找到了一个匹配, 则后续的catch子句将不再检查<br />7.异常规范(exception specification)<br />&nbsp;&nbsp;&nbsp; void foo() throw(Object); //这种声明就是异常规范<br />&nbsp;&nbsp;&nbsp; 异常声明是函数接口的一部分<br />8.异常规范不允许重被抛出的异常类型到异常规范制定的类型之间的转换:<br />&nbsp;&nbsp;&nbsp; void foo() throw(string) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw "exception";&nbsp; //不允许从const char* 到string的转换, 此时调用unexpected()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw string("exception"); //可以<br />&nbsp;&nbsp;&nbsp; }<br /></p><br /><br /><img src ="http://www.cppblog.com/jianc/aggbug/167709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-12 11:55 <a href="http://www.cppblog.com/jianc/archive/2012/03/12/167709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记11 函数模板</title><link>http://www.cppblog.com/jianc/archive/2012/03/12/167706.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Mon, 12 Mar 2012 02:55:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/12/167706.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167706.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/12/167706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167706.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167706.html</trackback:ping><description><![CDATA[<p><span>1.关键字template总是放在模板的定义与声明的最前面, 后面是用逗号分隔的模板参数列表(template parameter list), 参数表不能为空</span><br />
<span>2.模板非类型参数是由一个普通的参数声明构成, 代表一个潜在的值:</span><br />
<span>&nbsp;&nbsp;&nbsp; template &lt;typename Type, int size&gt;</span><br />
<span>&nbsp;&nbsp;&nbsp; Type min(Type (&amp;arr)[size]);</span><br />
<span>&nbsp;&nbsp;&nbsp; //当函数模板min()被实例化时, size的值会被一个编译时刻已知的常量值代替</span><br />
<span>3.类型和值的替换过程被称为模板的实例化(template instantiation)</span><br />
<span>4.c++支持两种模板编译模式:</span><br />
<span>&nbsp;&nbsp;&nbsp; 包含模式(Inclusion Model)</span><br />
<span>&nbsp;&nbsp;&nbsp; 分离模式(Separation Model)</span></p>
<p><span>&nbsp;&nbsp;&nbsp; 包含编译模式下, 在每个模板被实例化的文件中包含函数模板的定义, 并且往往把定义放在头文件中, 向对内联函数左那样</span><br />
<span>&nbsp;&nbsp;&nbsp; --缺点: 函数模板体(body)描述了实现细节</span><br />
<span>&nbsp;&nbsp;&nbsp; 分离编译模式下, 函数模板声明放在头文件中, 函数模板定义放在cpp文件里</span></p>
<p><span>&nbsp;&nbsp;&nbsp; //.h</span><br />
<span>&nbsp;&nbsp;&nbsp; template &lt;typename Type&gt; Type min(Type t1, Type t2);</span></p>
<p><span>&nbsp;&nbsp;&nbsp; //.cpp</span><br />
<span>&nbsp;&nbsp;&nbsp; export template &lt;typename Type&gt;</span><br />
<span>&nbsp;&nbsp;&nbsp; Type min(Type t1, Type t2) { /* ... */ }</span></p>
<p><span>&nbsp;&nbsp;&nbsp; //关键字 export! 可导出的模板</span><br />
<span>&nbsp;&nbsp;&nbsp; //并不是所有的编译器都支持分离模式</span></p>
<img src ="http://www.cppblog.com/jianc/aggbug/167706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-12 10:55 <a href="http://www.cppblog.com/jianc/archive/2012/03/12/167706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>即时练习</title><link>http://www.cppblog.com/jianc/archive/2012/03/09/167484.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 09 Mar 2012 05:53:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/09/167484.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167484.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/09/167484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167484.html</trackback:ping><description><![CDATA[<br />
<h3>stl 找出数组的最小值:</h3>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />template</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;Type,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;size</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" />Type&nbsp;getMin(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;Type&nbsp;(</span><span style="color: #000000">&amp;</span><span style="color: #000000">arr)[size])<br /><img id="Codehighlighter1_170_288_Open_Image" onclick="this.style.display='none'; Codehighlighter1_170_288_Open_Text.style.display='none'; Codehighlighter1_170_288_Closed_Image.style.display='inline'; Codehighlighter1_170_288_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_170_288_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_170_288_Closed_Text.style.display='none'; Codehighlighter1_170_288_Open_Image.style.display='inline'; Codehighlighter1_170_288_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_170_288_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_170_288_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Size:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;size&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">Type</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;vec(arr,&nbsp;arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;size);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;sort(vec.begin(),&nbsp;vec.end());<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;vec[</span><span style="color: #000000">0</span><span style="color: #000000">];<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])<br /><img id="Codehighlighter1_324_409_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_409_Open_Text.style.display='none'; Codehighlighter1_324_409_Closed_Image.style.display='inline'; Codehighlighter1_324_409_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_324_409_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_324_409_Closed_Text.style.display='none'; Codehighlighter1_324_409_Open_Image.style.display='inline'; Codehighlighter1_324_409_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_324_409_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_324_409_Open_Text"><span style="color: #000000">{<br /><img id="Codehighlighter1_339_363_Open_Image" onclick="this.style.display='none'; Codehighlighter1_339_363_Open_Text.style.display='none'; Codehighlighter1_339_363_Closed_Image.style.display='inline'; Codehighlighter1_339_363_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_339_363_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_339_363_Closed_Text.style.display='none'; Codehighlighter1_339_363_Open_Image.style.display='inline'; Codehighlighter1_339_363_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;arr[]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_339_363_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_339_363_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;getMin(arr)&nbsp;</span><span style="color: #000000">&lt; &lt;</span><span style="color: #000000">endl;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div><br /><br />
<h3>stl删除重复数据</h3>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">vector</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iterator</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br />template</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;Type</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;display(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">Type</span><span style="color: #000000">&gt;&amp;</span><span style="color: #000000">&nbsp;vec)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #000000">Type</span><span style="color: #000000">&gt;</span><span style="color: #000000">::const_iterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vec.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(iter&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;vec.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">iter&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;Len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">12</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;arr[Len]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">};<br />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;vec(arr,&nbsp;arr&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Len);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sort(vec.begin(),&nbsp;vec.end());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;display(vec);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;iterBegin&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;vec.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;iterEnd&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;unique(vec.begin(),&nbsp;vec.end());&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">去掉重复的</span><span style="color: #008000"><br /></span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;display(vec);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(iterBegin&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;iterEnd)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">iterBegin&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterBegin</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}</span></div>
<p>&nbsp;<br /></p>
<h3>map字符检索</h3>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">map</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">algorithm</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;argc,&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">argv[])<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;mObj;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;str;<br />&nbsp;&nbsp;&nbsp;&nbsp;cin&nbsp;</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">&nbsp;str;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;str.size();&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(mObj.count(str[i]))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mObj[str[i]]</span><span style="color: #000000">++</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mObj.insert(map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">::value_type(str[i],&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;map</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">char</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator&nbsp;iter&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;mObj.begin();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(iter&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;mObj.end())<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">first&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">iter</span><span style="color: #000000">-&gt;</span><span style="color: #000000">second&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">iter;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}<br /></span></div>
<p>&nbsp;</p> <img src ="http://www.cppblog.com/jianc/aggbug/167484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-09 13:53 <a href="http://www.cppblog.com/jianc/archive/2012/03/09/167484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记10 函数重载(待更新)</title><link>http://www.cppblog.com/jianc/archive/2012/03/09/167474.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 09 Mar 2012 03:59:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/09/167474.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167474.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/09/167474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167474.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167474.html</trackback:ping><description><![CDATA[1.函数的返回值类型不足以区分两个重载函数<br />2.链接提示符extern "C"只能指定重载函数集中的一个函数<br />&nbsp;&nbsp;&nbsp; --因为重载函数时, 需要c++的名字改编功能, 才能区分不同的函数, 而extern "C"是指明了不要进行名字改编<br />//其他细节回头再看<br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/jianc/aggbug/167474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-09 11:59 <a href="http://www.cppblog.com/jianc/archive/2012/03/09/167474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记9 域和生命期</title><link>http://www.cppblog.com/jianc/archive/2012/03/09/167473.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Fri, 09 Mar 2012 03:40:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/09/167473.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167473.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/09/167473.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167473.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167473.html</trackback:ping><description><![CDATA[<p>1.上下文(context)<br />
2. 全局域内的函数声明将引入全局函数(global function)<br />
3.全局域内的变量将引入全局对象(global object)<br />
4.生命期(lifetime)<br />
5.函数声明(declaration) 指定了该函数的名字以及函数的返回类型和参数列表<br />
6.函数定义(definition)还为函数提供了函数体<br />
7.extern为声明但不定义一个对象提供了一种方法. --承诺了该对象会在其他地方被定义<br />
&nbsp;&nbsp;&nbsp; extern 声明不会引起内存被分配<br />
8.c++中有一种机制, 通过它可以把函数参数的类型和数目编码在函数名中, 改机制叫做类型安全链接(type-safe-linkage)<br />
9.不同文件中出现同一对象或函数声明的其他类型不匹配情况, 在编译或链接时可能不会被捕捉到, 因为编译器一次只能处理一个文件, 他不能很容易地检</p>
<p>查到文件之间的类型违例, 这些类型违例可能是程序严重错误的根源<br />
10.头文件为所向extern对象声明, 函数声明以及inline函数定义提供了一个集中的位置: 这被称作声明的局部化(localization)<br />
11.头文件提供了两个安全保证<br />
&nbsp;&nbsp;&nbsp; 保证所有文件都包含同一个全局对象或函数的同一份声明<br />
&nbsp;&nbsp;&nbsp; 如果需要修改声明, 则只需要改变一个头文件<br />
&nbsp;&nbsp;&nbsp; --只在本cpp用的全局函数, 该不该定义在头文件里面?<br />
12.局部对象(local object)<br />
&nbsp;&nbsp; 自动对象(automatic object)&nbsp; --程序运行栈<br />
&nbsp;&nbsp; 寄存器对象(register object) --如果所选择的变量被频繁使用, 则寄存器变量可以提高函数的执行速度<br />
&nbsp;&nbsp; 局部静态对象(local static object)<br />
13.当一个自动变量的地址呗存储在一个生命期长与它的指针时, 该指针被称为空悬指针(dangling pointer)<br />
14.动态分配的对象被分配在程序的空闲存储区(free store)的可用内存池中<br />
15.new表达式失败时, 通常会抛出bad_alloc异常<br />
16.应用delete表达式失败, 使内存无法返回空闲存储区, 称作内存泄露(memory leak)<br />
17.对用一内存应用了两次delete表达式, 通常发生在两个指针指向同一个动态分配对象的时候, 这是一个很难跟踪的问题<br />
18.在对象被释放后读写该对象, 这常常会发生, 因为delete表达式应用的指针没有被设置为0<br />
19.为帮助程序员更好地管理动态分配的内存, c++库提供了auto_ptr类类型的支持 --智能指针<br />
20.auto_ptr类模板头文件&lt;memory&gt;<br />
&nbsp;&nbsp;&nbsp; auto_ptr&lt;int&gt;pi(new int(1024));<br />
&nbsp;&nbsp;&nbsp; //pi是局部智能指针, 当pi生命期结束时候, 会自动释放pi指向的堆空间<br />
&nbsp;&nbsp;&nbsp; 为了判断auto_ptr对象是否指向了一个对象, 可以用操作get()返回auto_ptr对象内部的底层指针<br />
&nbsp;&nbsp;&nbsp; if(p_auto_int.get() != 0 &amp;&amp; *p_auto_int != 1024) { ... }<br />
21.在某些情况下, 小细节会积聚成可怕的性能瓶颈, 这些细节不应该烦扰那些试图为整个程序提供解决方案的人, 但是这些细节是有经验的程序员应该考虑<br />
的<br />
22.定位new表达式<br />
&nbsp;&nbsp;&nbsp; new表达式可以允许程序员要求将对象创建在已经被分配好的内存中, 这种形式的new表达式被称为定位new表达式(placement new expression)<br />
&nbsp;&nbsp;&nbsp; new (place_address) type -specifier<br />
&nbsp;&nbsp;&nbsp; place_address必须是个指针<br />
&nbsp;&nbsp;&nbsp; 头文件&lt;new&gt;<br />
&nbsp;&nbsp;&nbsp; byte *mem = new byte[4096]; //这个是自定义内存池?<br />
&nbsp;&nbsp;&nbsp; char *tmp = new(mem) char; //在内存池分配一个char来用?<br />
&nbsp;&nbsp;&nbsp; delete [] mem;</p>
<img src ="http://www.cppblog.com/jianc/aggbug/167473.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-09 11:40 <a href="http://www.cppblog.com/jianc/archive/2012/03/09/167473.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记8 函数</title><link>http://www.cppblog.com/jianc/archive/2012/03/08/167436.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 08 Mar 2012 12:22:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/08/167436.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167436.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/08/167436.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167436.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167436.html</trackback:ping><description><![CDATA[1.运行栈(run-time stack)<br />
2.按值传递(pass-by-value)<br />
3.某些情况下, 编译器自动将按值返回转换到按引用返回, 该优化称为命名返回值优化(named return value optimization)<br />
4.直接或间接调用自己的函数被称为递归函数(recursive function)<br />
5.inline指示对编译器来说只是一个建议, 编译器可以选择忽略该建议<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<img src ="http://www.cppblog.com/jianc/aggbug/167436.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-08 20:22 <a href="http://www.cppblog.com/jianc/archive/2012/03/08/167436.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++Primer 读书笔记7 抽象容器类型</title><link>http://www.cppblog.com/jianc/archive/2012/03/08/167416.html</link><dc:creator>jianc</dc:creator><author>jianc</author><pubDate>Thu, 08 Mar 2012 09:06:00 GMT</pubDate><guid>http://www.cppblog.com/jianc/archive/2012/03/08/167416.html</guid><wfw:comment>http://www.cppblog.com/jianc/comments/167416.html</wfw:comment><comments>http://www.cppblog.com/jianc/archive/2012/03/08/167416.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/jianc/comments/commentRss/167416.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/jianc/services/trackbacks/167416.html</trackback:ping><description><![CDATA[<p>1.顺序容器(sequence container) --拥有由单一类型元素组成的一个有序集合<br />
&nbsp;&nbsp; list, vector, deque<br />
2.关联容器(associative container) --支持查询一个元素是否存在, 并且可以有效地获取元素<br />
&nbsp;&nbsp; map, set, multimap, multiset<br />
3.容器的容量 --在容器下一次需要增长自己之前能够被加入到容器中的元素的总数(容量只与连续存储的容器相关:vector, deque, string. 而list不要求</p>
<p>容量)<br />
4.capacity()操作 --求一个容器的容量<br />
5.容器的长度 --容器当前拥有元素的个数<br />
6.size()操作 --求一个容器的长度<br />
7.数据类型越复杂, vector的效率就越低<br />
8.reserve()操作 --允许程序员将容器的容量设置成一个现实指定的值<br />
9.迭代器(iterator) --提供了一种一般化的方法, 对顺序或关联容器类型中的每个元素进行连续访问<br />
10.每个容器类型都提供了一个begin()和一个end()成员函数<br />
11.begin()返回一个iterator, 指向容器的第一个元素<br />
12.end()返回一个iterator, 指向容器的末元素的下一个位置<br />
13.出了iterator类型, 每个容器还定义了一个const iterator类型, 对于遍历const容器是必需的<br />
14.iterator算术论算只适用于vector或deque, 而不适用与list, 因为ielist的元素在内存中不是连续存储的<br />
15.string.find_first_of()查找与被搜索字符串中任意一个字符相匹配的第一次出现, 并返回它的索引位置<br />
16.string.substr()生成string对象的字串的一个拷贝<br />
17.string.rfind()查找最后的指定字串出现的索引<br />
18.string.find_first_not_of()查找第一个不与要搜索字符串的任意字符相匹配的字符<br />
19.string.find_last_of()查找字符串中的"与搜索字符串任意元素相匹配"的最后一个字符<br />
20.string.find_last_not_of()查找字符串中的"与搜索字符串任意字符全不匹配"的最后一个字符<br />
21.string.erase(pos, num)操作去掉字符串中的指定串, pos表示位置, num表示去掉的长度<br />
22.&lt;locale&gt;ctype类, 封转了标准c库函数的功能及一组非成员函数<br />
23.string.compare(pos, num, str); 比较pos位置的后面num个字符是否为str<br />
24.string.insert(pos, newstring); pos表示要插入的位置, newstring表示要插入的字符串<br />
25.string.assign(); 字符串拷贝<br />
26.string.append(); 字符串拼接<br />
27.string.swap(); 交换两个字符串<br />
28.string.at(); 对字符的下标索引操作, 有对索引值范围检测, 下标越界时抛出out_of_range异常<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char ch = st.at(index);<br />
&nbsp;&nbsp; } catch(std::out_of_range) { ... }<br />
29.string.replace(pos, num, newstring); 用newstring代替pos后面num个字符子串<br />
30.map 也叫关联数组(associative array) 键/值对 key/value<br />
&nbsp;&nbsp;&nbsp; 键用来索引map, 值用作存储和检索的数据<br />
&nbsp;&nbsp;&nbsp; map对象定义, 至少要指明键和值的类型, 如:<br />
&nbsp;&nbsp;&nbsp; map&lt;string, int&gt; word_count;<br />
31.map的数据录入<br />
&nbsp;&nbsp;&nbsp; map&lt;string, string&gt; str_str;<br />
&nbsp;&nbsp;&nbsp; str_str[string("one")] = string("1"); //这种效率比较低<br />
&nbsp;&nbsp;&nbsp; str_str.insert(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;string, string&gt;::value_type("two", "2")<br />
&nbsp;&nbsp;&nbsp; );&nbsp; //这种效率高<br />
32.查找并获取map中的元素<br />
&nbsp;&nbsp;&nbsp; 最简单的方法:<br />
&nbsp;&nbsp;&nbsp; value = mapObj[key];<br />
&nbsp;&nbsp;&nbsp; 但这样有个问题, 如果不存在key这个键, mapObj就会插入key键, 并把对应的value值为默认值, 这样得到的value是无效的<br />
&nbsp;&nbsp;&nbsp; 所以, 应该这样写<br />
&nbsp;&nbsp;&nbsp; if(mapObj.count(key))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = mapObj[key];<br />
&nbsp;&nbsp;&nbsp; 或者这样:<br />
&nbsp;&nbsp;&nbsp; map&lt;keyType, valueType&gt;::iterator iter = mapObj.find(key);<br />
&nbsp;&nbsp;&nbsp; if(iter != mapObj.end())<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = mapObj[key];<br />
33.从map中删除元素<br />
&nbsp;&nbsp;&nbsp; erase操作<br />
&nbsp;&nbsp;&nbsp; mapObj.erase(key);<br />
&nbsp;&nbsp;&nbsp; 还有两种重载方式, 详见文档</p>
<p>&nbsp;&nbsp;&nbsp; mapObj.clear(); 清空map对象所有值<br />
</p>
<p>34.set对象插入元素<br />
&nbsp;&nbsp;&nbsp; #include &lt;set&gt;<br />
&nbsp;&nbsp;&nbsp; set&lt;setType&gt; setObj;<br />
&nbsp;&nbsp;&nbsp; setObj.insert(key);<br />
35.set对象查找元素<br />
&nbsp;&nbsp;&nbsp; setObj.count(key); //1有, 0没有<br />
&nbsp;&nbsp;&nbsp; setObj.find(key); iter为setObj.end()表示没有<br />
36.multiset和multimap允许要被存储的键出现多次<br />
&nbsp;&nbsp;&nbsp; 对于multiset和multimap的迭代策略是联合使用find返回的iterator和count返回的值:<br />
&nbsp;&nbsp;&nbsp; count = mulsetObj.count();<br />
&nbsp;&nbsp;&nbsp; multiset&lt;type&gt;::iterator iter;<br />
&nbsp;&nbsp;&nbsp; iter = mulsetObj.find(key);<br />
&nbsp;&nbsp;&nbsp; for(int i = 0; i &lt; count; ++i, ++iter)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_something(*iter);<br />
&nbsp;&nbsp;&nbsp; 另一种方法是使用equal_range()返回的iterator值<br />
&nbsp;&nbsp;&nbsp; 如果这个值存在, 则第一个iterator指向该值的第一个实例, 且第二个iterator指向这个值的最后一个实例的下一个位置:<br />
&nbsp;&nbsp;&nbsp; switch(mulmapObj.count) {<br />
&nbsp;&nbsp;&nbsp; case 0: break; //不存在<br />
&nbsp;&nbsp;&nbsp; case 1: //只有一项, 用普通的find操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multimap&lt;keyType, valueType&gt;::iterator iter;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iter = mulmapObj.find(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_something(*iter);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp; default: //有许多项<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; typedef multimap&lt;keyType, valueType&gt;::iterator it;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pair&lt;it, it&gt;pos;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pos = mulmapObj.equal_range(key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(; pos.first != pos.second; pos.first++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do_somethine(*pos.first);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; //对应的, 删除的话用mulmapObj.erase(pos.first, pos.second);<br />
&nbsp;&nbsp;&nbsp; //不支持下标操作是访问multimap元素的一个限制:<br />
&nbsp;&nbsp;&nbsp; mulmapObj[key]; //错误<br />
37.栈容器(stack container)支持的操作 //头文件&lt;stack&gt;<br />
&nbsp;&nbsp; empty()<br />
&nbsp;&nbsp; size()<br />
&nbsp;&nbsp; pop()<br />
&nbsp;&nbsp; top()<br />
&nbsp;&nbsp; push(item)<br />
38.栈类型被称为容器适配器(container adapter)<br />
39.缺省情况下, 栈用容器类型deque实现, 改变这个缺省值可以这样:<br />
&nbsp;&nbsp;&nbsp; stack&lt;type, list&lt;type&gt;&gt; stackObj; //改成用容器类型list实现<br />
&nbsp;&nbsp;&nbsp; //一般是定义一个指针栈<br />
&nbsp;&nbsp;&nbsp; class CTest;<br />
&nbsp;&nbsp;&nbsp; stack&lt;CTest*&gt; ctestStack;<br />
40.标准库提供了两种风格的队列: queue(队列), priority_queue(优先级队列)<br />
&nbsp;&nbsp;&nbsp; 头文件 &lt;queue&gt;<br />
41.queue和priority_queue操作<br />
&nbsp;&nbsp; empty()<br />
&nbsp;&nbsp; size()<br />
&nbsp;&nbsp; pos()<br />
&nbsp;&nbsp; front() //只能用在一般队列<br />
&nbsp;&nbsp; back() //只能用在一般队列<br />
&nbsp;&nbsp; top()&nbsp; //只能用在优先级队列<br />
&nbsp;&nbsp; push(item)</p>
<img src ="http://www.cppblog.com/jianc/aggbug/167416.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/jianc/" target="_blank">jianc</a> 2012-03-08 17:06 <a href="http://www.cppblog.com/jianc/archive/2012/03/08/167416.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>