﻿<?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++博客-daiybh@ this-&gt;cppblog</title><link>http://www.cppblog.com/daiybh/</link><description>我的，我的，还是我的！！</description><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 15:06:23 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 15:06:23 GMT</pubDate><ttl>60</ttl><item><title>腾讯TM2008无法卸载问题--剔除Windows Installer的安装信息</title><link>http://www.cppblog.com/daiybh/archive/2010/03/19/110075.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 19 Mar 2010 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2010/03/19/110075.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/110075.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2010/03/19/110075.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/110075.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/110075.html</trackback:ping><description><![CDATA[<p>-----------------------------------------------------<br>此内为转帖 from: http://blog.163.com/chen_chb/blog/static/29602002009880512839/<br><br>今天启动腾讯TM的时候让升级，没注意点了确定，结果升级完成，TM启动失败。</p>
<p>提示&#8220;initialization failure 0x00000002&#8221;。</p>
<p>想卸载tm2008，结果找不到&#8220;tm2008 preview.msi&#8221;，无法卸载，重新安装也要先卸载，确实没办法了。</p>
<p>后来到网上找答案，终于解决。</p>
<p style="TEXT-INDENT: 2em">下载微软提供的Windows Installer清理实用工具：<a href="http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe"><u><font color=#0000ff>http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe</font></u></a>（官方说明<a href="http://support.microsoft.com/kb/290301"><u><font color=#0000ff>http://support.microsoft.com/kb/290301</font></u></a>）</p>
<p style="TEXT-INDENT: 2em">安装后在C:\Program Files\Windows Installer Clean Up下有个msicuu.exe，运行，找到TM2008，选中它，点remove，然后就可以重新安装TM2008了。</p>
<p style="TEXT-INDENT: 2em">注：实践发现，不一定会在列表里发现TM2008字眼，此时可以找是否存在[1.5.535]类似于这样的信息，若有，选中点remove即可解决。 </p>
<p style="TEXT-INDENT: 2em">然后重新安装TM2008，一切正常，OK。</p>
----------------------------------------------<br>批注：<br>使用windows Installer&nbsp; 安装的程序会在 C:\WINDOWS\Installer 留下痕迹，，<br>如果哪天手痒给删了，，估计卸载对应程序就不得行。<br>到时候使用 windows Installer 清理工具吧，，好像要 多remove 几次。。才能成功
<img src ="http://www.cppblog.com/daiybh/aggbug/110075.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2010-03-19 10:09 <a href="http://www.cppblog.com/daiybh/archive/2010/03/19/110075.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mfc 对话框程序 启动直接隐藏</title><link>http://www.cppblog.com/daiybh/archive/2009/11/20/101457.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 20 Nov 2009 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2009/11/20/101457.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/101457.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2009/11/20/101457.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/101457.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/101457.html</trackback:ping><description><![CDATA[<p>要想使 程序启动的时候直接隐藏（或者最小化到tray）有如下办法<br><br>1&nbsp; 在OnInitDialog ()中<br>&nbsp;&nbsp;&nbsp;&nbsp; SetTimer（1,100,null)<br>&nbsp;&nbsp; 在OnTimer(UINT nIDEvent) 中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( nIDEvent==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowWindow(sw_hide);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p style="MARGIN-RIGHT: 0px" dir=ltr>&nbsp;&nbsp;&nbsp; ///这种方法 会出现 程序在显示器上 闪一下的效果。。即使 timer 时间很短 ，也会有。<br><br>2 重载 WM_WINDOWPOSCHANGING<br><br>在重载函数内实现：<br>&nbsp;&nbsp;&nbsp;OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)&nbsp;<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;!m_bShowWindow)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpwndpos-&gt;flags &amp;= ~SWP_SHOWWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDialog::OnWindowPosChanging(lpwndpos);<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;// TODO: Add your message handler code here<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp; m_bShowWindow 是我的一个变量，初始值为false<br><br>&nbsp;&nbsp;// 如果 m_bShowWindow&nbsp; 一直为false ，那么程序就见不到人了。。<br>&nbsp;&nbsp; 所以应该给 True<br>&nbsp;&nbsp; 在OnInitDialog ()中<br>&nbsp;&nbsp;&nbsp;&nbsp; SetTimer（1,1000,null)<br>&nbsp;&nbsp; 在OnTimer(UINT nIDEvent) 中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( nIDEvent==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_bShowWindow&nbsp;=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillTimer(1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p>
&nbsp;//使用这种方法 程序不会闪一下。。。
<img src ="http://www.cppblog.com/daiybh/aggbug/101457.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2009-11-20 10:44 <a href="http://www.cppblog.com/daiybh/archive/2009/11/20/101457.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt] 使用svn——项目的目录布局</title><link>http://www.cppblog.com/daiybh/archive/2009/11/03/100056.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Tue, 03 Nov 2009 07:39:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2009/11/03/100056.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/100056.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2009/11/03/100056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/100056.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/100056.html</trackback:ping><description><![CDATA[转自：<a href="http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html">http://www.cnitblog.com/stomic/archive/2008/03/17/41043.html</a>

<div><span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 16px; ">Subversion有一个很标准的目录结构，是这样的。<br>比如项目是proj，svn地址为svn://proj/，那么标准的svn布局是<br><pre>svn://proj/
|
+-trunk
+-branches
+-tags
</pre>这是一个标准的布局，trunk为主开发目录，branches为分支开发目录，tags为tag存档目录（不允许修改）。但是具体这几个目录应该如何使用，svn并没有明确的规范，更多的还是用户自己的习惯。<br><br>对于这几个开发目录，一般的使用方法有两种。我更多的是从软件产品的角度出发（比如freebsd），因为互联网的开发模式是完全不一样的。<br>第一种方法，使用trunk作为主要的开发目录。<br>一般的，我们的所有的开发都是基于trunk进行开发，当一个版本/release开发告一段落（开发、测试、文档、制作安装程序、打包等）结束后，代码处于冻结状态（人为规定，可以通过hook来进行管理）。此时应该基于当前冻结的代码库，打tag。当下一个版本/阶段的开发任务开始，继续在trunk进行开发。<br>此时，如果发现了上一个已发行版本（Released Version）有一些bug，或者一些很急迫的功能要求，而正在开发的版本（Developing Version）无法满足时间要求，这时候就需要在上一个版本上进行修改了。应该基于发行版对应的tag，做相应的分支（branch）进行开发。<br>例如，刚刚发布1.0，正在开发2.0，此时要在1.0的基础上进行bug修正。<br>按照时间的顺序<br><ol><li>1.0开发完毕，代码冻结</li><li>基于已经冻结的trunk，为release1.0打tag<br>此时的目录结构为<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0　(copy from trunk)<br></li><li>2.0开始开发，trunk此时为2.0的开发版</li><li>发现1.0有bug，需要修改，基于1.0的tag做branch<br>此时的目录结构为<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; ( dev 2.0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0_bugfix (copy from tag/release_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +release_1.0　(copy from trunk)<br></li><li>在1.0 bugfix branch进行1.0 bugfix开发，在trunk进行2.0开发</li><li>在1.0 bugfix 完成之后，基于dev_1.0_bugfix的branch做release等</li><li>根据需要选择性的把dev_1.0_bugfix这个分支merge回trunk（什么时候进行这步操作，要根据具体情况）<br></li></ol>这是一种很标准的开发模式，很多的公司都是采用这种模式进行开发的。trunk永远是开发的主要目录。<br><br>第二种方法，在每一个release的branch中进行各自的开发，trunk只做发布使用。<br>这种开发模式当中，trunk是不承担具体开发任务的，一个版本/阶段的开发任务在开始的时候，根据已经release的版本做新的开发分支，并且基于这个分支进行开发。还是举上面的例子，这里面的时序关系是。<br><ol><li>1.0开发，做dev1.0的branch<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (不担负开发任务 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0 (copy from trunk)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br></li><li>1.0开发完成，merge dev1.0到trunk<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (merge from branch dev_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0 (开发任务结束，freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br></li><li>根据trunk做1.0的tag<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp; (merge from branch dev_1.0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0 (开发任务结束，freeze)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br></li><li>1.0开发，做dev2.0分支<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0 (开发任务结束，freeze)<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; +dev_2.0 （进行2.0开发）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br></li><li>1.0有bug，直接在dev1.0的分支上修复<br>此时的目录结构<br>svn://proj/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +trunk/&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +branches/<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; +dev_1.0 (1.0bugfix)<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; +dev_2.0 （进行2.0开发）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tags/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; +tag_release_1.0 (copy from trunk)<br></li><li>选择性的进行代码merge</li></ol>这其实是一种分散式的开发，当各个部分相对独立一些（功能性的），可以开多个dev的分支进行开发，这样各人/组都不会相互影响。比如dev_2.0_search和dev_2.0_cache等。但是这样merge起来就是一个很痛苦的事情。<br><br>这里要注意一下的，第六步进行选择性的merge，是可以当2.0开发结束后一起把dev_1.0（bugfix用）和dev_2.0（新版本开发用）merge回trunk。或者先把dev_1.0 merge到dev_2.0，进行测试等之后再merge回trunk。<br>这两种方法各有利弊，第一种方法是可以得到一个比较纯的dev_2.0的开发分支，而第二种方法则更加的保险，因为要测试嘛。<br><br>以上呢，就是我说的两种开发模式了，具体哪种好，并没有定论。这里大致的说一下各自的优缺点<br>第一种开发模式（trunk进行主要开发，集中式）：<br>优点：管理简单<br>缺点：当开发的模块比较多，开发人数/小团队比较多的时候，很容易产生冲突而影响对方的开发。因为所有的改动都有可能触碰对方的改动<br>第二重开发模式（分支进行主要开发，分散式）：<br>优点：各自开发独立，不容易相互影响。<br>缺点：管理复杂，merge的时候很麻烦，容易死人。<br><br>其实，这里并没有一定之规，更多的时候是两种模式结合使用。我个人来说是采用第一种方式为主，在某些情况下使用第二种方法。<br>如果你还有其他的好的方法，那么请赐教。:)</span></div><img src ="http://www.cppblog.com/daiybh/aggbug/100056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2009-11-03 15:39 <a href="http://www.cppblog.com/daiybh/archive/2009/11/03/100056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让窗体永远显示在桌面上</title><link>http://www.cppblog.com/daiybh/archive/2009/06/30/88885.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Tue, 30 Jun 2009 05:25:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2009/06/30/88885.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/88885.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2009/06/30/88885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/88885.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/88885.html</trackback:ping><description><![CDATA[<div><font face="Courier New, Courier, mono" size="-1"><div>HWND hDesktop = ::FindWindow(_T("Progman"),_T("Program Manager"));</div><div>::SetParent(this-&gt;m_hWnd,hDesktop);</div></font></div>
<img src ="http://www.cppblog.com/daiybh/aggbug/88885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2009-06-30 13:25 <a href="http://www.cppblog.com/daiybh/archive/2009/06/30/88885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt] CVSNT 用户名 密码设置方法</title><link>http://www.cppblog.com/daiybh/archive/2008/10/06/63300.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Mon, 06 Oct 2008 03:17:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/10/06/63300.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/63300.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/10/06/63300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/63300.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/63300.html</trackback:ping><description><![CDATA[<span  style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 20px; -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; "><p style="line-height: normal; ">转自：<span  style="line-height: 20px; "><a href="http://hi.baidu.com/sophiaandphilem/blog/item/b63912dff2f17e1263279851.html">http://hi.baidu.com/sophiaandphilem/blog/item/b63912dff2f17e1263279851.html</a></span></p><p style="line-height: normal; ">Note:&#160;<a href="http://book.csdn.net/bookfiles/220/10022010453.shtml" style="line-height: normal; ">http://book.csdn.net/bookfiles/220/10022010453.shtml</a>有非常好的使用介绍，详细全面。</p><p style="line-height: normal; ">安装好CVSNT后，需要用命令行设置用户，密码，否则会出现类似I/O错误的问题：<br style="line-height: normal; ">假设装在了 : C:/Program Files/CVS 中,在命令行中[cmd]中，进入这个文件夹，运行命令：<br style="line-height: normal; "><strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; ">cvs -d C:\cvsfile passwd -a giles ,</font></strong><br style="line-height: normal; ">next step ,input the password for user-giles ,restart the cvs serve ,you can use it now ...<br style="line-height: normal; ">Generally , you need to make user write the repository , so open the control panel---->Advanced -> unselect the<strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; ">&#160;All users are read&#160;<font color="#000000" style="line-height: normal; ">item ...<br style="line-height: normal; "></font></font></strong><font color="#ff0000" style="line-height: normal; "><font color="#000000" style="line-height: normal; ">Then , It is ok for you to enjoy it ..&#160;</font></font><strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; "><font color="#000000" style="line-height: normal; ">-----------------<br style="line-height: normal; ">---------------<br style="line-height: normal; ">compatibility options&#160;<br style="line-height: normal; "></font></font></strong><font color="#ff0000" style="line-height: normal; "><font color="#000000" style="line-height: normal; ">CvsNT clients 选中前三项就好，不选的话，兼容性差点，当然不会影响自己使用。</font></font></p><p style="line-height: normal; "><strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; ">cvs -d C:\cvsfile passwd -r administrator -a giles ,&#160;&#160; 这样giles用户有了管理员权限。。</font></strong></p><p style="line-height: normal; "><strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; ">最好把cvs的储存库放在C盘，不然会发生各样的诡异错误。</font></strong></p><p style="line-height: normal; "><strong style="line-height: normal; "><font color="#ff0000" style="line-height: normal; ">2. CVS Control Panel 里的 Server Settings 也需要设置， 不然有可能出现 no such domain的提示。</font></strong></p><p style="line-height: normal; ">3. 支持字符集的问题： 在建好服务器后，右键点击，在属性里面可以修改字符集。</p><p style="line-height: normal; ">4. 如果本地能连上CVS，但是局域网内另外的用户连接不上，那很可能是windows 防火墙的问题 。</p><p style="line-height: normal; ">&#160;&#160;&#160;&#160;&#160; 我们需要在防火墙的例外里面添加 CVs.exe 和 默认的 2401端口 。。</p><p style="line-height: normal; "><strong style="line-height: normal; "><font color="#0000ff" style="line-height: normal; ">好的使用习惯：</font></strong></p><p style="line-height: normal; ">1. One day ,One Commit&#160;&#160; .</p><p style="line-height: normal; ">2. Update before modifying the code.</p><p style="line-height: normal; ">3. Update before committing the code, or else you may encounter some conflicts.</p><p style="line-height: normal; ">Update 的时候，会把server中的代码和本地的代码进行merge ，而不是简单的覆盖本地代码。</p><p style="line-height: normal; ">如果commit之前不进行update，则由于CVS不允许在commit的时候自动进行merge，极有可能产生冲突。</p><p style="line-height: normal; ">一般使用update和commit就可以了。</p></span>
<img src ="http://www.cppblog.com/daiybh/aggbug/63300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-10-06 11:17 <a href="http://www.cppblog.com/daiybh/archive/2008/10/06/63300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]使用StretchBlt之前一定要用SetStretchBltMode(COLORONCOLOR)啊！！！ </title><link>http://www.cppblog.com/daiybh/archive/2008/09/28/62986.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Sun, 28 Sep 2008 06:02:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/09/28/62986.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/62986.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/09/28/62986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/62986.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/62986.html</trackback:ping><description><![CDATA[<div>近日使用StretchDIBits 发生事故 情况与转帖 一样。特此标记。</div><div>转帖地址 &#160;http://blog.vckbase.com/longest/archive/2006/11/21/23194.html</div><img src ="http://www.cppblog.com/daiybh/aggbug/62986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-09-28 14:02 <a href="http://www.cppblog.com/daiybh/archive/2008/09/28/62986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache2.2 + php5.2.5 启动失败</title><link>http://www.cppblog.com/daiybh/archive/2008/08/09/58370.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Sat, 09 Aug 2008 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/08/09/58370.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/58370.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/08/09/58370.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/58370.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/58370.html</trackback:ping><description><![CDATA[<p>apache2.2&nbsp; + php5.2.5&nbsp; <br>启动apache 时失败 报错误：<br>
<hr>
---------------------------<br>httpd.exe - 应用程序错误<br>---------------------------<br>"0x01171a76" 指令引用的 "0x020c0161" 内存。该内存不能为 "read"。
<p>&nbsp;</p>
<p><br>要终止程序，请单击&#8220;确定&#8221;。<br>要调试程序，请单击&#8220;取消&#8221;。<br>---------------------------<br>确定&nbsp;&nbsp; 取消&nbsp;&nbsp; <br>---------------------------<br>
<hr>
<br>失败原因：<br>1 php extension中使用了 php_exif.dll这个扩展（屏蔽之 可以正常启动）<br>2 细查原因 php_exif.dll依赖php_mbstring.dll 即若没使用php_mbstring.dll这个扩展也会报错。<br>3 如果扩展中有php_mbstring.dll 也会报错？？？ 不得哦，那不是真的。<br>4 在3 中的那个假设 是存在的。是因为php_exif.dll 在php_mbstring.dll之前初始化 当然会错拉。。。<br>5 所以需要让php_mbstring.dll先初始化。。改php.ini(php的配置文件) 如下<br>[PHP_MBSTRING]<br>extension=php_mbstring.dll<br>[PHP_EXIF]<br>extension=php_exif.dll<br>把php_mbstring.dll项放到php_exif.dll之前。。<br>&nbsp;-----------------------------------------------------------<br>over。<br><br><br>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/daiybh/aggbug/58370.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-08-09 11:41 <a href="http://www.cppblog.com/daiybh/archive/2008/08/09/58370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc2008 中局部代码折叠</title><link>http://www.cppblog.com/daiybh/archive/2008/08/08/58340.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 08 Aug 2008 06:45:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/08/08/58340.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/58340.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/08/08/58340.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/58340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/58340.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 使用中发现 vc2008 team System 中代码折叠只到函数，不具体到语句块的折叠。。。<br>&nbsp;&nbsp;&nbsp; 先前使用vc2008 Express Edition 的时候还有该功能，难道team就给干掉了。<br>&nbsp;&nbsp;&nbsp; 郁闷了半天，咱就是奔这个功能来的呀。。。<img src="http://www.cppblog.com/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absmiddle" border="0"><br>&nbsp;&nbsp;&nbsp; 后来在设置项里面发现了秘密。。原来team 给藏起来，一般人不给用。<br>&nbsp;&nbsp; 具体设置方式：<br>&nbsp;&nbsp; 工具(tools) -&gt; 选项(Options) -&gt; 文本编辑器(Text Editor) -&gt; C/C++ -&gt; 格式设置(Formatting) -&gt; 语句块的自动大纲显示(Automatic outlining of statement blocks)<br><hr style="width: 100%; height: 2px;">over.<br><img src ="http://www.cppblog.com/daiybh/aggbug/58340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-08-08 14:45 <a href="http://www.cppblog.com/daiybh/archive/2008/08/08/58340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转一个log4cxx的教程 出处不明</title><link>http://www.cppblog.com/daiybh/archive/2008/01/25/41875.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Fri, 25 Jan 2008 03:31:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/01/25/41875.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/41875.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/01/25/41875.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/41875.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/41875.html</trackback:ping><description><![CDATA[
<table width="100%">
<tbody>
<tr>
<td><img width="5" height="1" border="0" src=""/><br/>绿盟科技<br/>2003 年 9 月
<blockquote>
<p>log4cpp是个基于LGPL的开源项目，是基于优秀的日志处理跟踪项目Java语言的log4j移植过来的。log4j介绍的文档很多，在java领域使用的也比较广泛，而这个功能强大的库对国内的C++语言开发人员却使用的不多。这里从开发人员使用的角度介绍这个库，使开发人员用最少的代价尽快掌握这种技术。下面先简单介绍一下这个项目的优点（也是log4j的优点），然后分原理，手动使用步骤，配置文件驱动方式使用步骤，其他考虑等方面进行讨论。以下讨论基于log4cpp0.3.4b。</p>
</blockquote>
<p><a><span><span style="COLOR: #000000">0. 优点</span></span></a></p>
<div style="MARGIN-LEFT: 2em">提供应用程序运行上下文，方便跟踪调试；<br/>可扩展的、多种方式记录日志，包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等；<br/>可以动态控制日志记录级别，在效率和功能中进行调整；<br/>所有配置可以通过配置文件进行动态调整；<br/>多语言支持，包括Java（log4j），C++（log4cpp、log4cplus），C（log4c），python（log4p）等；<br/>...<br/></div>
<p><a><span><span style="COLOR: #000000">1. 原理</span></span></a></p>
<p>log4cpp有3个主要的组件：categories（类别）、appenders（附加目的地）、和 layouts（布局）。（为了方便大家理解，文中尽量使用英文原词）</p>
<p>layout类控制输出日志消息的显示样式（看起来像什么）。log4cpp当前提供以下layout格式：</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
log4cpp::BasicLayout     // 以"时间戳 优先级（priority，下文介绍）
                        // 类别（category，下文介绍）
     // NDC标签（nested diagnostic contexts 下文介绍）: 日志信息"。
              // 如：1056638652 INFO main : This is some info
log4cpp::PatternLayout  // 让用户根据类似于 C 语言 printf 函数的转换模式来指定输出格式。格式定义见代码附带文档。
log4cpp::SimpleLayout  // 以"优先级（priority） - 日志信息"格式显示。 
</code>
</pre></td>
</tr>
</tbody>
</table>
<p>appender类用来输出日志（被layout格式化后的）到一些设备上。比如文件、syslog服务、某个socket等。可以定义自己的 appender类输出日志信息到别的设备上，比如应用自身的日子处理进程、数据库等。appender和layout的关系是layout附在 appender上，appender类调用layout处理完日志消息后，记录到某个设备上。log4cpp当前提供以下appender：</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
log4cpp::IdsaAppender    // 发送到IDS或者logger, 详细见 http://jade.cs.uct.ac.za/idsa/
log4cpp::FileAppender    // 输出到文件
log4cpp::RollingFileAppender  // 输出到回卷文件，即当文件到达某个大小后回卷
log4cpp::OstreamAppender   // 输出到一个ostream类
log4cpp::RemoteSyslogAppender  // 输出到远程syslog服务器
log4cpp::StringQueueAppender  // 内存队列
log4cpp::SyslogAppender   // 本地syslog
log4cpp::Win32DebugAppender  // 发送到缺省系统调试器
log4cpp::NTEventLogAppender  // 发送到win 事件日志
</code>
</pre></td>
</tr>
</tbody>
</table>
<p>category 类真正完成记录日志功能，两个主要组成部分是appenders和priority（优先级）。优先级控制哪类日志信息可以被这个category记录，当前优先级分为：NOTSET, DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT 或 FATAL/EMERG 。每个日志信息有个优先级，每个category有个优先级，当消息的优先级大于等于category的优先级时，这个消息才会被category记录，否则被忽略。优先级的关系如下。category类和appender的关系是，多个appender附在category上，这样一个日志消息可以同时输出到多个设备上。</p>
<p>NOTSET &lt; DEBUG &lt; INFO &lt; NOTICE &lt; WARN &lt; ERROR &lt; CRIT &lt; ALERT &lt; FATAL = EMERG</p>
<p>category被组织成一个树，子category创建时优先级缺省NOTSET，category缺省会继承父category的 appender。而如果不希望这种appender的继承关系，log4cpp允许使用additivity 标签，为false时新的appender取代category的appender列表。</p>
<p>为了更好的理解上面的概念下面以手动使用方式举例。</p>
<p><a><span><span style="COLOR: #000000">2. 手动使用步骤</span></span></a></p>
<p>手动使用log4cpp的基本步骤如下：</p>
<ol>
<li>实例化一个layout 对象；</li>
<li>初始化一个appender 对象；</li>
<li>把layout对象附着在appender对象上；</li>
<li>调用log4cpp::Category::getInstance("name"). 实例化一个category对象；</li>
<li>把appender对象附到category上（根据additivity的值取代其他appender或者附加在其他appender后）。</li>
<li>设置category的优先级；</li>
</ol>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
// FileName: test_log4cpp1.cpp
// Test log4cpp by manual operation.
// Announce: use as your own risk.
// Compile : g++ -otest1 -llog4cpp test_log4cpp1.cpp
// Run     : ./test1
// Tested  : RedHat 7.2 log4cpp0.3.4b
// Author  : liqun (liqun@nsfocus.com)
// Data    : 2003-6-27

#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/BasicLayout.hh"

int main(int argc, char* argv[])
{
        // 1实例化一个layout 对象
        log4cpp::Layout* layout = 
        new log4cpp::BasicLayout();

        // 2. 初始化一个appender 对象
 log4cpp::Appender* appender = new 
              log4cpp::FileAppender("FileAppender",
              "./test_log4cpp1.log");


 // 3. 把layout对象附着在appender对象上
 appender-&gt;setLayout(layout);

 // 4. 实例化一个category对象
 log4cpp::Category&amp; warn_log = 
        log4cpp::Category::getInstance("mywarn");

 // 5. 设置additivity为false，替换已有的appender
        warn_log.setAdditivity(false);

 // 5. 把appender对象附到category上
 warn_log.setAppender(appender);

 // 6. 设置category的优先级，低于此优先级的日志不被记录
 warn_log.setPriority(log4cpp::Priority::WARN);

 // 记录一些日志
 warn_log.info("Program info which cannot be wirten");
 warn_log.debug("This debug message will fail to write");
 warn_log.alert("Alert info");

 // 其他记录日志方式
 warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
 log4cpp::Priority::PriorityLevel priority;
 bool this_is_critical = true;
 if(this_is_critical)
  priority = log4cpp::Priority::CRIT;
 else
  priority = log4cpp::Priority::DEBUG;
 warn_log.log(priority,"Importance depends on context");
 
 warn_log.critStream() &lt;&lt; "This will show up &lt;&lt; as " 
 &lt;&lt; 1 &lt;&lt; " critical message" 
 &lt;&lt; log4cpp::CategoryStream::ENDLINE;

 // clean up and flush all appenders
 log4cpp::Category::shutdown();
 return 0;
}
</code>
</pre></td>
</tr>
</tbody>
</table>
<p><a><span><span style="COLOR: #000000">3. 配置文件驱动方式使用步骤</span></span></a></p>
<p>另一个非常优秀的特征就是通过读取配置文件，确定category、appender、layout等对象。也是我们非常推荐的使用方式，可以灵活地通过配置文件定义所有地对象及其属性，不用重新编码，动态更改日志记录的策略。</p>
<p>Log4cpp主要提供了 log4cpp::PropertyConfigurator 和log4cpp::SimpleConfigurator两种机制（文件格式），但 log4cpp::SimpleConfigurator将来不再支持了，而且格式非常简单，这里就不多说明，自己看源码吧。</p>
<p>配置文件的格式和log4j的配置文件一样，是标准的java属性文件格式。下面是附带的例子配置文件：</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
# a simple test config
#定义了3个category sub1, sub2, sub1.sub2
log4j.rootCategory=DEBUG, rootAppender
log4j.category.sub1=,A1
log4j.category.sub2=INFO
log4j.category.sub1.sub2=ERROR, A2

# 设置sub1.sub2 的additivity属性
log4j.additivity.sub1.sub2=false

#定义rootAppender类型和layout属性
log4j.appender.rootAppender=org.apache.log4j.ConsoleAppender
log4j.appender.rootAppender.layout=org.apache.log4j.BasicLayout

#定义A1的属性
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.fileName=A1.log
log4j.appender.A1.layout=org.apache.log4j.SimpleLayout

#定义A2的属性
log4j.appender.A2=org.apache.log4j.ConsoleAppender
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=The message '%m' at time %d%n 
</code>
</pre></td>
</tr>
</tbody>
</table>
<p>配置文件语法如下，不是很规范，结合上面的例子，应该可以看懂。</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
  log4j / log4cpp . [category / appender].[category or appender 's name].[category or appender 's property] 
= [Appender / Layout / property's value / Priority, appender name1 [appender name2 ...]]

 [appender]
  {ConsoleAppender}
  {FileAppender} // 当appender的类型是FileAppender时，可以定义它下面的属性。
   [fileName] string foobar // 格式是：属性名 值的类型 缺省值
   [append] bool true
  {RollingFileAppender}
   [fileName]  string foobar
   [maxFileSize] num 10*1024*1024
   [maxBackupIndex] num 1
   [append] bool true
  {SyslogAppender}
   [syslogName] string syslog
   [syslogHost] string localhost
   [facility] num -1 // * 8 to get LOG_KERN, etc. compatible values. 
   [portNumber] num -1
  {IdsaAppender}
   [idsaName] string foobar
  {Win32DebugAppender}
  {NTEventLogAppender}
   [source] string foobar
   
   [threshold] string "" // 全部 
   // 如果此类型appender需要layout，必须定义此appender的下面属性
   [layout]
    {BasicLayout} 
    {SimpleLayout}
    {PatternLayout}  // 当layout的值是BasicLayout时，需要定义下面的属性。
     [ConversionPattern]
     
 [rootCategory]
 [additivity]
  [category name] bool true
  </code>
</pre></td>
</tr>
</tbody>
</table>
<p>基本使用步骤是：</p>
<ol>
<li>读取解析配置文件；</li>
<li>实例化category对象；</li>
<li>正常使用这些category对象进行日志处理；</li>
</ol>
<p>下面是个简单的使用代码，使用起来是非常方便的：</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
// FileName: test_log4cpp2.cpp
// Test log4cpp by config file.
// Announce: use as your own risk.
// Compile : g++ -llog4cpp test_log4cpp2.cpp
// Run     : ./a.out
// Tested  : RedHat 7.2 log4cpp0.3.4b
// Author  : liqun (liqun@nsfocus.com)
// Data    : 2003-6-27

#include "log4cpp/Category.hh"
#include "log4cpp/PropertyConfigurator.hh"

int main(int argc, char* argv[])
{
 // 1 读取解析配置文件
 // 读取出错, 完全可以忽略，可以定义一个缺省策略或者使用系统缺省策略
 // BasicLayout输出所有优先级日志到ConsoleAppender
    try { 
  log4cpp::PropertyConfigurator::configure("./log4cpp.conf");
 } catch(log4cpp::ConfigureFailure&amp; f) {
  std::cout &lt;&lt; "Configure Problem " &lt;&lt; f.what() &lt;&lt; std::endl;
        return -1;
    }
 
 // 2 实例化category对象
 // 这些对象即使配置文件没有定义也可以使用，不过其属性继承其父category
 // 通常使用引用可能不太方便，可以使用指针，以后做指针使用
 // log4cpp::Category* root = &amp;log4cpp::Category::getRoot();
    log4cpp::Category&amp; root = log4cpp::Category::getRoot();
 
    log4cpp::Category&amp; sub1 = 
        log4cpp::Category::getInstance(std::string("sub1"));

    log4cpp::Category&amp; sub3 = 
        log4cpp::Category::getInstance(std::string("sub1.sub2"));

 // 3 正常使用这些category对象进行日志处理。
 // sub1 has appender A1 and rootappender.
 sub1.info("This is some info");
 sub1.alert("A warning");
 
 // sub3 only have A2 appender.
 sub3.debug("This debug message will fail to write");
 sub3.alert("All hands abandon ship");
 sub3.critStream() &lt;&lt; "This will show up &lt;&lt; as " &lt;&lt; 1 &lt;&lt; " critical message" 
 &lt;&lt; log4cpp::CategoryStream::ENDLINE;
 sub3 &lt;&lt; log4cpp::Priority::ERROR 
              &lt;&lt; "And this will be an error"  
              &lt;&lt; log4cpp::CategoryStream::ENDLINE;
 sub3.log(log4cpp::Priority::WARN, "This will be a logged warning");
 
 return 0;
}
</code>
</pre></td>
</tr>
</tbody>
</table>
<p><a><span><span style="COLOR: #000000">4. 相关考虑</span></span></a></p>
<p>性能问题，可能是很多想使用log4cpp的程序员关心的问题。在参考资料2中有一段描述。结论就是log4j以及log4cpp是以性能为首要目标的；如果关闭日志记录的话，对性能影响可以忽略；打开日志记录，主要消耗是在记录动作，而不是库的管理过程；所以你尽可放心的使用。实在要深究性能的话。可以从下面方面提高：</p>
<p>输出的日志消息不要使用复杂的转换或者处理，比如： sub1.debug(string("Current num is") + i + GetCurStat()); 这种情况即使不进行日志处理，括号中的语句还是会执行。变通方法是：</p>
<table cellpadding="5" bgcolor="#CCCCCC" cellspacing="0" border="1" width="100%">
<tbody>
<tr>
<td>
<pre xml:space="preserve">
<code>
if(sub1.isDebugEnabled())
{
 sub1.debug(string("Current num is") + i + GetCurStat());
}
</code>
</pre></td>
</tr>
</tbody>
</table>
<p>安全性问题对于商业软件开发可能也是问题。可能不希望别人通过修改配置文件获取程序的调试等程序内部运行情况的日志信息。比较稳妥的方案或者是加密配置文件，运行中解密，输出到临时文件后读取；或者在发行版本里读取配置文件后，强行把低于某个优先级的category设到比较高的优先级。</p>
<p>多线程安全性问题。当前log4cpp还没有宣称自己是多线程安全的，不过其代码中大多数可能冲突的地方都增加了线程互斥控制，对多线程环境应该问题不大。但为了加入这个特性，linux下编译log4cpp时，configure请加入--with-pthreads 或者--with-omnithreads选项。Win版本已经加入对MS线程的支持。</p>
<p><a><span><span style="COLOR: #000000">5. 参考资料</span></span></a></p>
<p>1. Logging and Tracing in C++ Simplified: Traveling the Road Last Traveled by a Previously Invented Wheel<br/><a href="http://soldc.sun.com/articles/logging.html"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://soldc.sun.com/articles/logging.html</span></span></a></p>
<p>2. log4j 提供了对日志记录的控制<br/><a href="http://www-900.ibm.com/developerWorks/cn/java/jw-log4j/index.shtml"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://www-900.ibm.com/developerWorks/cn/java/jw-log4j/index.shtml</span></span></a></p>
<p>3. 使用Log4j进行日志操作<br/><a href="http://www-900.ibm.com/developerWorks/cn/java/l-log4j/index.shtml"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://www-900.ibm.com/developerWorks/cn/java/l-log4j/index.shtml</span></span></a></p>
<p>4. log4cpp主页<br/><a href="http://sourceforge.net/projects/log4cpp/"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://sourceforge.net/projects/log4cpp/</span></span></a></p>
<p>5. log4j主页<br/><a href="http://jakarta.apache.org/log4j/docs/index.html"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://jakarta.apache.org/log4j/docs/index.html</span></span></a></p>
<p>6. log4cplus主页<br/><a href="http://log4cplus.sourceforge.net/"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://log4cplus.sourceforge.net/</span></span></a></p>
<p>7. log4c主页<br/><a href="http://log4c.sourceforge.net/"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">http://log4c.sourceforge.net/</span></span></a></p>
<p><a><span><span style="COLOR: #000000">6. 关于作者</span></span></a></p>
<p>李群，关注于网络安全产品的开发、研究；软件开发过程等方面。您可以通过<a href="mailto:liqun@nsfocus.com"><span style="TEXT-DECORATION: underline"><span style="COLOR: #0000ff">liqun@nsfocus.com</span></span></a>和他联系。</p>
</td>
</tr>
</tbody>
</table>
<img src ="http://www.cppblog.com/daiybh/aggbug/41875.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-01-25 11:31 <a href="http://www.cppblog.com/daiybh/archive/2008/01/25/41875.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>记昨天</title><link>http://www.cppblog.com/daiybh/archive/2008/01/17/41310.html</link><dc:creator>daiybh</dc:creator><author>daiybh</author><pubDate>Thu, 17 Jan 2008 01:01:00 GMT</pubDate><guid>http://www.cppblog.com/daiybh/archive/2008/01/17/41310.html</guid><wfw:comment>http://www.cppblog.com/daiybh/comments/41310.html</wfw:comment><comments>http://www.cppblog.com/daiybh/archive/2008/01/17/41310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/daiybh/comments/commentRss/41310.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/daiybh/services/trackbacks/41310.html</trackback:ping><description><![CDATA[
<p>昨天早早的起床,给自己煮俩鸡蛋,洗漱完毕发现锅盖（玻璃盖）面附着一丝丝的蛋花，盛世好看。查之，一蛋已破壳。稀里哗啦 往嘴里塞之，留一完蛋在路上找一桥吃之，弃壳于身后，溜之。<br/><br/>晚上查阅邮件 发现鹰派发了封祝福的信，顿时热泪盈眶，痛哭流涕。<br/>---------------<br/>小记完毕。<img src="http://imgcache.qq.com/qzone_v4/b.gif" style="DISPLAY: none; POSITION: relative" name="paperPicArea1" height="1" width="1" id="paperPicArea1"/></p>
<img src ="http://www.cppblog.com/daiybh/aggbug/41310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/daiybh/" target="_blank">daiybh</a> 2008-01-17 09:01 <a href="http://www.cppblog.com/daiybh/archive/2008/01/17/41310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>