﻿<?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++博客-牵着老婆满街逛-随笔分类-Windows</title><link>http://www.cppblog.com/tx7do/category/18484.html</link><description>严以律己,宽以待人. 三思而后行.&lt;/br&gt;
GMail/GTalk: yanglinbo#google.com;&lt;/br&gt;
MSN/Email: tx7do#yahoo.com.cn;&lt;/br&gt;
QQ: 3 0 3 3 9 6 9 2 0 .</description><language>zh-cn</language><lastBuildDate>Thu, 04 Sep 2014 02:43:54 GMT</lastBuildDate><pubDate>Thu, 04 Sep 2014 02:43:54 GMT</pubDate><ttl>60</ttl><item><title>窗口大小控制MINMAXINFO</title><link>http://www.cppblog.com/tx7do/archive/2014/03/12/206136.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Tue, 11 Mar 2014 17:04:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2014/03/12/206136.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/206136.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2014/03/12/206136.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/206136.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/206136.html</trackback:ping><description><![CDATA[<div><strong style="color: red">转载自：</strong><a style="color: red" href="http://blog.csdn.net/sqcfj/article/details/7245568"><strong>http://blog.csdn.net/sqcfj/article/details/7245568</strong></a><br /><br />
<div style="text-align: left; text-transform: none; text-indent: 0px; margin: 20px 0px 0px; font: 14px/26px Arial; white-space: normal; letter-spacing: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px" id="article_content" class="article_content">
<p>为了控制窗口的大小，在窗口初始化时，需要用到MINMAXINFO结构体。</p>
<p><strong>结构体：</strong></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 />
--><img id="Codehighlighter1_15_122_Open_Image" onclick="this.style.display='none'; Codehighlighter1_15_122_Open_Text.style.display='none'; Codehighlighter1_15_122_Closed_Image.style.display='inline'; Codehighlighter1_15_122_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_15_122_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_15_122_Closed_Text.style.display='none'; Codehighlighter1_15_122_Open_Image.style.display='inline'; Codehighlighter1_15_122_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #000000">typedef&nbsp;</span><span style="color: #0000ff">struct</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_15_122_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_15_122_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;POINT&nbsp;ptReserved;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;POINT&nbsp;ptMaxSize;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;POINT&nbsp;ptMaxPosition;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;POINT&nbsp;ptMinTrackSize;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;POINT&nbsp;ptMaxTrackSize;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span><span style="color: #000000">&nbsp;MINMAXINFO;</span></div>
<p><strong><br />参数说明：<br /></strong>&nbsp;ptMaxSize：&nbsp;&nbsp;设置窗口最大化时的宽度、高度<br />&nbsp;ptMaxPosition：&nbsp;设置窗口最大化时x坐标、y坐标<br />&nbsp;ptMinTrackSize：&nbsp;设置窗口最小宽度、高度<br />&nbsp;ptMaxTrackSize：设置窗口最大宽度、高度<br /><br /></p>
<p><strong>实例：<br /></strong>1、在窗口类映射ON_WM_GETMINMAXINFO消息；<br />2、在该函数修改MINMAXINFO结构体数据：</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 />
--><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;CTestDlg::OnGetMinMaxInfo(MINMAXINFO&nbsp;FAR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;lpMMI)&nbsp;<br /><img id="Codehighlighter1_55_445_Open_Image" onclick="this.style.display='none'; Codehighlighter1_55_445_Open_Text.style.display='none'; Codehighlighter1_55_445_Closed_Image.style.display='inline'; Codehighlighter1_55_445_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_55_445_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_55_445_Closed_Text.style.display='none'; Codehighlighter1_55_445_Open_Image.style.display='inline'; Codehighlighter1_55_445_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_55_445_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_55_445_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxSize.x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">800</span><span style="color: #000000">;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大化时的宽度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxSize.y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">600</span><span style="color: #000000">;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大化时的高度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxPosition.x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大化时x坐标</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxPosition.y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大化时y坐标</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMinTrackSize.x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">400</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最小宽度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMinTrackSize.y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">400</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最小高度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxTrackSize.x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">600</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大宽度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;lpMMI</span><span style="color: #000000">-&gt;</span><span style="color: #000000">ptMaxTrackSize.y&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">500</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;设置窗口最大高度</span><span style="color: #008000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" /></span><span style="color: #000000">&nbsp;CDialog::OnGetMinMaxInfo(lpMMI);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>
<p>&nbsp;</p></div>
<div style="z-index: 999999; text-align: left; padding-bottom: 2px; text-transform: none; text-indent: 0px; zoom: 1; font: 12px Arial, Console, Verdana, 'Courier New'; white-space: normal; float: right; letter-spacing: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px" id="bdshare" class="bdshare_t bds_tools get-codes-bdshare"><br class="Apple-interchange-newline" /></div></div><img src ="http://www.cppblog.com/tx7do/aggbug/206136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2014-03-12 01:04 <a href="http://www.cppblog.com/tx7do/archive/2014/03/12/206136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对Windows下的File Mapping一个简单的封装</title><link>http://www.cppblog.com/tx7do/archive/2014/02/25/205927.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 24 Feb 2014 16:29:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2014/02/25/205927.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/205927.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2014/02/25/205927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/205927.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/205927.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 头文件：Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#ifndef&nbsp;__SharedMemory_H__#define&nbsp;__SharedMemory_H__class&nbsp;SharedMemory{public:&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2014/02/25/205927.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/205927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2014-02-25 00:29 <a href="http://www.cppblog.com/tx7do/archive/2014/02/25/205927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>waveInReset/waveOutReset死锁原因与解决方案</title><link>http://www.cppblog.com/tx7do/archive/2013/01/21/197429.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 20 Jan 2013 18:17:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2013/01/21/197429.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/197429.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2013/01/21/197429.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/197429.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/197429.html</trackback:ping><description><![CDATA[<div><strong style="color: red">转载自：</strong><a style="color: red" href="http://blog.csdn.net/soliddream66/article/details/5353960"><strong>http://blog.csdn.net/soliddream66/article/details/5353960</strong></a><br />
<br />
<h2 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">问题背景<br />
</h2>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">录音播音实际需求</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">1、随时终止</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">2、录音并非文件，而是形成rtp发送</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">3、播音并非源于文件，而是源于rtp</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">因此Waveform audio使用的buffer较小，不断的装载/发送 buffer,终止的时候Reset并且close.</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">大致如下调用的循环</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">录音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInAddBuffer</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">播音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutWrite</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">循环周期40ms，我采用的是回调函数。问题是有时候调用waveInReset/waveOutReset会形成死锁，调用waveInReset/waveOutReset的线程与回调函数所在的线程死锁在一块了。</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<h2 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><a style="color: rgb(51,102,153)" name="t1"></a>原因分析</h2>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">这方面网上有文章提到，就是调用waveInReset/waveOutReset的同时调用了录音/播音循环调用的某个函数会形成死锁。我再稍作解释下，我们知道buffer满了或是调用Reset都会触发消息（回调函数方式的话就是MM_WOM_DONE/MM_WIM_DATA），由于调用waveInReset/waveOutReset所在的线程，与回调函数所在的线程不是一个线程，因此很容易撞车，也就是说，你调用reset的时候，另一个线程正好在处理MM_WOM_DONE/MM_WIM_DATA，于是就这样死锁了。</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<h2 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><a style="color: rgb(51,102,153)" name="t2"></a>解决方案</h2>
<h3 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><a style="color: rgb(51,102,153)" name="t3"></a>方案一<br />
</h3>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">先加上标记(假设标记bReset:bool)，令bReset为true;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">标记作用如下</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">if(!bReset)</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">{</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">录音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInAddBuffer</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">播音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutWrite</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">}</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">延时调用waveInReset/waveOutReset，延时时间长度以循环周期为妙，我这个例子中也就是采用40ms。</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">当然也可以采用临界保护。</p>
<h3 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><a style="color: rgb(51,102,153)" name="t4"></a><br />
</h3>
<h3 style="text-align: left; padding-bottom: 0px; line-height: 26px; widows: 2; text-transform: none;  font-variant: normal; font-style: normal; text-indent: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; font-family: Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><a style="color: rgb(51,102,153)" name="t5"></a>方案二</h3>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">换一个角度去考虑问题，之所以死锁，是因为两个线程冲突了的缘故，所以可以建立一个线程</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">录音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveInAddBuffer</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">播音</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutUnprepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutPrepareHeader</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">waveOutWrite</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;</p>
<p style="text-align: left; widows: 2; text-transform: none;  text-indent: 0px; font: 14px/26px Arial; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">与waveInReset/waveOutReset都放到这个线程去处理，自然不会发生死锁了。</p>
</div><img src ="http://www.cppblog.com/tx7do/aggbug/197429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2013-01-21 02:17 <a href="http://www.cppblog.com/tx7do/archive/2013/01/21/197429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软代码签名证书使用指南</title><link>http://www.cppblog.com/tx7do/archive/2012/12/06/196026.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 05 Dec 2012 16:04:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/12/06/196026.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/196026.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/12/06/196026.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/196026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/196026.html</trackback:ping><description><![CDATA[<div><strong style="color: red">转载自：</strong><a style="color: red" href="http://www.willrey.com/support/signcode_guide_pfx.html"><strong>http://www.willrey.com/support/signcode_guide_pfx.html</strong></a><br /><br />
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">微软的代码签名软件 SignCode.exe 的缺省的&#8220;典型&#8221;签名类型，就是&#8220;从存储区选择&#8221;签名证书，同时由于微软的 Office 宏代码签名只支持同时包含了私钥和公钥的 PFX 格式签名证书，也就是直接&#8220;从存储区选择&#8221;签名证书。在收到证书后请用户先 Windows 的证书存储区导出备份签名证书，导出的证书格式为 PFX 格式，保管好证书的密码。<br /><br />下载Thawte代码签名证书的中级根证书：<br /><a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(86,87,89); text-decoration: underline; padding-top: 0px" href="https://search.thawte.com/support/ssl-digital-certificates/index?page=content&amp;id=AR1382" target="_blank">https://search.thawte.com/support/ssl-digital-certificates/index?page=content&amp;id=AR1382</a></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">下载VeriSign代码签名证书的中级根证书：<br /><a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(86,87,89); text-decoration: underline; padding-top: 0px" href="http://www.verisign.com/support/verisign-intermediate-ca/code-signing-intermediate/index.html" target="_blank">http://www.verisign.com/support/verisign-intermediate-ca/code-signing-intermediate/index.html</a></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />&nbsp;使用微软的<span class="Apple-converted-space">&nbsp;</span><strong style="color: rgb(86,87,89); font-size: 12px">SignCode.exe</strong><span class="Apple-converted-space">&nbsp;</span>就可以对微软的代码进行签名，如果您没有此文件，您可以点击<span class="Apple-converted-space">&nbsp;</span><a style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; color: rgb(86,87,89); text-decoration: underline; padding-top: 0px" href="http://www.willrey.com/support/signcode.exe">这里</a>下载。 Signcode.exe 可以使用 DOS 命令行方式实现签名，我们推荐用户使用数字签名向导方式，简单方便。请注意：如果您开发的ActiveX为IE加载项，请先数字签名每个CAB文件中的.dll和.ocx等文件，再把这些文件打包成.cab文件后再数字签名.cab文件，以确保所有IE加载项都被IE验证和信任，否则会显示&#8220;未验证&#8221;而可能影响正常运行。<br /><br />具体签名向导过程如下：</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp;&nbsp;(1) 运行 Signcode.exe ，要求您选择需要签名的文件，支持：可执行文件 (*.exe; *.dll; *.ocx) ； Cabinet 打包文件 (*.cab) 和目录文件 (*.cat) ，如下图 1 所示 ( 如： TestSign.cab) ，请注意：如果签名的文件已经有数字签名，则会被新的签名覆盖<span class="Apple-converted-space">&nbsp;</span><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="signcode" src="http://www.willrey.com/support/images/Signcode-01.JPG" width="500" height="380" /><br />(2) 点击&#8220;下一步&#8221;后，如下图 2 所示，会要求您选择&#8220;签名类型&#8221;， 直接点击&#8220;下一步&#8221;即可，即选择缺省的&#8220;典型&#8221;签名类型：<span class="Apple-converted-space">&nbsp;</span><br /><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="signcode" src="http://www.willrey.com/support/images/Signcode-02.JPG" width="506" height="379" /><br />&nbsp;&nbsp;(3) 如下图 3 所示，点击&#8220;从存储区选择&#8221;，则会显示您的电脑证书存储区的所有证书，包括存储在电脑和 USB Key 中的所有数字证书，选择您的签名证书即可：<span class="Apple-converted-space">&nbsp;</span><br /><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="verisign微软代码签名证书" src="http://www.willrey.com/support/images/Signcode-03.JPG" width="503" height="380" /><br />(4) 如下图 4 所示，要求填写该签名代码的功能描述，推荐一定要认真填写，因为此信息将会在最终用户下载此代码时显示，有助于最终用户了解此代码的功能以确定是否下载安装。第一行&#8220;描述&#8221;是指此代码的功能文字描述，第二行&#8220; Web 位置&#8221;则让最终用户点击文字描述来详细了解此代码的功能和使用方法等。</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="" src="http://www.willrey.com/support/images/Signcode-04.jpg" width="501" height="379" /><br />(5) 点击&#8220;下一步&#8221;后，如下图 9 所示，选中&#8220;将时间戳添加到数据中&#8221;，请使用:</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">VeriSign 免费提供的时间戳URL：<strong style="color: rgb(86,87,89); font-size: 12px">http://timestamp.verisign.com/scripts/timestamp.dll</strong></p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">&nbsp;&nbsp;&nbsp;&nbsp;时间戳服务非常重要，添加时间戳后，即使您的代码签名证书已经过期，但由于您的代码是在证书有效期内签名的，则时间戳服务保证了此代码仍然可信，最终用户仍然可以放心下载，使得即使代码签名证书已经过期，您也无需重签已经签名的代码。</p>
<p style="padding-bottom: 0px; widows: 2; text-transform: none; text-indent: 0px; margin: 10px 34px 0px 0px; padding-left: 0px; padding-right: 0px; font: 12px/18px Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(86,87,89); word-spacing: 0px; padding-top: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="" src="http://www.willrey.com/support/images/Signcode-05.jpg" width="501" height="378" /><br />&nbsp;(6) 点击&#8220;下一步&#8221;后，如下图 6 所示，会提示已经完成数字签名向导，点击&#8220;完成&#8221;就完成了中文版代码签名证书的代码签名。<br /><img style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" alt="" src="http://www.willrey.com/support/images/Signcode-06.jpg" width="504" height="379" /><span class="Apple-converted-space">&nbsp;</span><br /></p></div><img src ="http://www.cppblog.com/tx7do/aggbug/196026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-12-06 00:04 <a href="http://www.cppblog.com/tx7do/archive/2012/12/06/196026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Speex manul中文版</title><link>http://www.cppblog.com/tx7do/archive/2012/11/21/195510.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 21 Nov 2012 15:56:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/11/21/195510.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/195510.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/11/21/195510.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/195510.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/195510.html</trackback:ping><description><![CDATA[<strong style="color: red">转载自:</strong><a style="color: red" href="http://www.cnblogs.com/rosesmall/archive/2012/04/18/2455395.html"><strong>http://www.cnblogs.com/rosesmall/archive/2012/04/18/2455395.html</strong></a><br /><br />
<div style="widows: 2; text-transform: none; text-indent: 0px; font: 13px/19px Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-break: normal !important; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" id="cnblogs_post_body">
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span><strong>在VOIP的音频算法中，回音处理已经成为一个关系通话质量的主要问题。</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span><strong>回声的产生在IP网络主要有两种：<br />1.声学回声<br />2.电路回声</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span><strong>声学回声主要又分成以下几种:<br />a ) 直接回声:由扬声器产生的声音未经任何反射直接进入麦克风<br />b ) 间接回声: 由扬声器发出的声音经过多次反射后,再进入Mic<br />对于第二种回声,拥有多路径,时变性的特点.是比较难处理的.</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span><strong>由于IP网络下的传输的延迟较大,而一般情况下,对于人耳,如果声音延迟达到了10ms以上的话,那么回声就会越来越明显.<br />一般来讲,VOIP中的声音延迟主要来自于几个方面:<br />1. 编码延迟: 一般情况下编码算法在声音压缩时都会产生延迟,就我们采用的Speex来讲,延迟大概在20ms左右<br />2. 处理延迟, 封装时延, 缓冲时延等<br />3. 在IP网络中数据的传输过程也会照成延时.这由当前的网络状况决定.</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span><strong>回声消除的模型:<br />a) 建立远端声音模型,进行回声估计, 从采集的值中减去估计值<br />b) 声学模型</strong></span></span></p>
<h4 id="subjcns!31B2F8637FF39314!234" class="TextColor1"><span>Speex manul(手册)中文版</span></h4>
<div id="msgcns!31B2F8637FF39314!234">
<div>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>Speex</span></span><span>是一套专门用于压缩声音的库</span><span lang="EN-US"><span>,</span></span><span>由于其专门针对声音</span><span lang="EN-US"><span>,</span></span><span>所以压缩声音的性能非常高</span><span lang="EN-US"><span>.Speex</span></span><span>由于其压缩性能</span><span lang="EN-US"><span>,</span></span><span>及</span><span lang="EN-US"><span>0.80</span></span><span>版后的跨平台的性能</span><span lang="EN-US"><span>,</span></span><span>所以在网络声音的传输中有很大的价值</span><span lang="EN-US"><span>.</span></span><span>但是需要注意的是</span><span lang="EN-US"><span>speex</span></span><span>只能对声音进行压缩</span><span lang="EN-US"><span>,</span></span><span>不支持音乐的压缩</span><span lang="EN-US"><span>,</span></span><span>如果你需要音乐的压缩你或许需要用</span><span lang="EN-US"><span>vorbis</span></span><span>库</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>但是的</span><span lang="EN-US"><span>speex</span></span><span>资料像其它大都数专用库一样</span><span lang="EN-US"><span>,</span></span><span>并没有大多的中文资料</span><span lang="EN-US"><span>.</span></span><span>所以在这里我决定将里面最核心的编程技术翻译出来</span><span lang="EN-US"><span>.</span></span><span>一来是练习练习自己翻译资料的能力</span><span lang="EN-US"><span>,</span></span><span>二来是方便一些英语水平较差的朋友</span><span lang="EN-US"><span>.</span></span><span>由于本人能力有限</span><span lang="EN-US"><span>,</span></span><span>有些感觉有出入或难理解的地方可以去</span><span lang="EN-US"><span>speex</span></span><span>的官方网站</span><span lang="EN-US"><a style="background-color: transparent; color: rgb(51,102,153); text-decoration: none; background-origin: initial; background-clip: initial" href="http://www.speex.org/"><span>www.speex.org</span></a></span><span>找到英文原版的说明</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span>翻译的一些说明</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>1,</span></span><span>对于一些专有名词如</span><span lang="EN-US"><span>speex,api</span></span><span>不过行翻译</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>2,</span></span><span>对于一些新概念翻译</span><span lang="EN-US"><span>,</span></span><span>以及其它的翻译过来也许会产生歧义的文字</span><span lang="EN-US"><span>,</span></span><span>用中</span><span lang="EN-US"><span>/</span></span><span>英两种方式标出</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>如</span><span lang="EN-US"><span>:</span></span><span>对话</span><span lang="EN-US"><span>(speech),</span></span><span>位采集</span><span lang="EN-US"><span>(bit_packing)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>3,</span></span><span>基本做到和英文原行对译</span><span lang="EN-US"><span>.</span></span><span>及英文原文一行</span><span lang="EN-US"><span>,</span></span><span>中文翻译过来也是一行</span><span lang="EN-US"><span>,</span></span><span>使翻译后的文章和原文基本行行对照</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>4,</span></span><span>源代码不翻译</span><span lang="EN-US"><span>,</span></span><span>如</span><span lang="EN-US"><span>SpeexBits bits;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>5,</span></span><span>语言中的关健字不译</span><span lang="EN-US"><span>,</span></span><span>如</span><span lang="EN-US"><span>float</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>6,</span></span><span>一此不是关健字但英文通常出现的词第一次以中</span><span lang="EN-US"><span>/</span></span><span>英文格式给出</span><span lang="EN-US"><span>,</span></span><span>之后按具体情况给出英文或中文</span><span lang="EN-US"><span>,</span></span><span>如</span><span lang="EN-US"><span>:frame(</span></span><span>帧</span><span lang="EN-US"><span>),</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span lang="EN-US"><span>7,</span></span><span>对一些有自己翻译起来感觉有歧义的地方</span><span lang="EN-US"><span>,</span></span><span>加斜线作标记</span>&nbsp;</p></div></div>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>1,speex的介绍(略)</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong><span>2</span>特征描述</strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>这个章节展示了</span><span lang="EN-US"><span>speex</span></span><span>的主要特征</span><span lang="EN-US"><span>,</span></span><span>以衣一些关于对话</span><span lang="EN-US"><span>(speech)</span></span><span>编码的一个概念</span><span lang="EN-US"><span>,</span></span><span>以便</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>帮助我们更好的了解下一章节</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>取样率<span>(Sampling rate)</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>Speex</span></span><span>主要是设计了三种不同的取样率</span><span lang="EN-US"><span>:8kHz,16kHz,32kHz.</span></span><span>这些分别代表了窄宽</span><span lang="EN-US"><span>(narrowband),</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>多频率</span><span lang="EN-US"><span>,</span></span><span>超声</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>质量</strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>Speex</span></span><span>编码大都数时间是被一个范围为</span><span lang="EN-US"><span>0</span></span><span>到</span><span lang="EN-US"><span>10</span></span><span>的质量参数来控制</span><span lang="EN-US"><span>&nbsp;&nbsp;</span></span><span>的</span><span lang="EN-US"><span>.</span></span><span>在一个比特率为常量</span><span lang="EN-US"><span>(CBR)</span></span><span>的操作中</span><span lang="EN-US"><span>,</span></span><span>质量参数是一个整数</span><span lang="EN-US"><span>,</span></span><span>而对于变动的比特率</span><span lang="EN-US"><span>(VBR)</span></span><span>参数是一个</span><span lang="EN-US"><span>float;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong><span>复杂性</span><span lang="EN-US"><span>(</span></span><span>变量</span><span lang="EN-US"><span>)</span></span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>用</span><span lang="EN-US"><span>speex,</span></span><span>你可以将编码设置成允许的复杂度</span><span lang="EN-US"><span>.</span></span><span>这由一个范围为</span><span lang="EN-US"><span>1</span></span><span>到</span><span lang="EN-US"><span>10</span></span><span>的整数来控制完成</span><span lang="EN-US"><span>,</span></span><span>就像你用选项</span><span lang="EN-US"><span>-1</span></span><span>到</span><span lang="EN-US"><span>-9</span></span><span>来控制</span><span lang="EN-US"><span>gzip</span></span><span>和</span><span lang="EN-US"><span>bzip2</span></span><span>的压缩质量</span><span lang="EN-US"><span>.</span></span><span>在通常的运用中</span><span lang="EN-US"><span>,</span></span><span>噪声级别的复杂度</span><span lang="EN-US"><span>1</span></span><span>是在</span><span lang="EN-US"><span>1</span></span><span>到</span><span lang="EN-US"><span>2dB</span></span><span>之间</span><span lang="EN-US"><span>,</span></span><span>比复杂度</span><span lang="EN-US"><span>10</span></span><span>要高</span><span lang="EN-US"><span>,</span></span><span>但是</span><span lang="EN-US"><span>CPU</span></span><span>需要复杂度</span><span lang="EN-US"><span>10</span></span><span>大概</span><span lang="EN-US"><span>5</span></span><span>倍高行复杂度</span><span lang="EN-US"><span>1.</span></span><span>在实践中</span><span lang="EN-US"><span>,</span></span><span>最好的是设置在</span><span lang="EN-US"><span>2</span></span><span>到</span><span lang="EN-US"><span>4</span></span><span>之间</span><span lang="EN-US"><span>,</span></span><span>尽管更高的设定通常有用</span><span lang="EN-US"><span>,</span></span><span>当编码一个非对话声音</span><span lang="EN-US"><span>(non-speech sounds)</span></span><span>像</span><span lang="EN-US"><span>DTMF</span></span><span>语调</span><span lang="EN-US"><span>(tones).</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>变波特率<span>(VBR</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>变波特率</span><span lang="EN-US"><span>(VBR)</span></span><span>允许编码动态地改变它的波特率以适应声音编码的</span><span lang="EN-US"><span>&#8221;</span></span><span>难度</span><span lang="EN-US"><span>&#8221;.</span></span><span>在</span><span lang="EN-US"><span>speex</span></span><span>举例来说</span><span lang="EN-US"><span>,</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>像元音</span><span lang="EN-US"><span>(vowel)</span></span><span>和瞬间高音</span><span lang="EN-US"><span>(high-enenrg transients)</span></span><span>需要个高的比特率来</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>取得一个不错的质量</span><span lang="EN-US"><span>,</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>而摩擦音</span><span lang="EN-US"><span>(fricative)</span></span><span>可以被充分地用相对较少的字节来进行编码</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>由于上面这个原因</span><span lang="EN-US"><span>,VBR</span></span><span>可以调节到一个低的比特率却达到一个同样的质量</span><span lang="EN-US"><span>,</span></span><span>或者用</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>某个比特率达到更好的质量</span><span lang="EN-US"><span>.</span></span><span>尽管有上面这些优点</span><span lang="EN-US"><span>,</span></span><span>但是</span><span lang="EN-US"><span>VBR</span></span><span>也有两个主要的缺点</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>首先</span><span lang="EN-US"><span>,</span></span><span>仅仅靠指定质量值</span><span lang="EN-US"><span>,</span></span><span>这里没有一个关于最后平均比特率的保证</span><span lang="EN-US"><span>.(</span></span><span>译者注</span><span lang="EN-US"><span>:</span></span><span>作者大概是想说没有什么明确的方法知道质量值</span><span lang="EN-US"><span>)</span></span><span>此外</span><span lang="EN-US"><span>,</span></span><span>对一些即时</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>通信</span><span lang="EN-US"><span>,</span></span><span>像</span><span lang="EN-US"><span>IP</span></span><span>电话</span><span lang="EN-US"><span>(VoIP)</span></span><span>这种包含着最大的比特率的</span><span lang="EN-US"><span>,</span></span><span>必须把比特率设为足够低以适应</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>传输通道</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>r</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>平均比特率<span>(ABR)</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>平均比特率通过动态地调节</span><span lang="EN-US"><span>VBR</span></span><span>质量去得到一个确定的目标的比特率</span><span lang="EN-US"><span>,</span></span><span>从而解决了</span><span lang="EN-US"><span>VBR</span></span><span>中的一个问题</span><span lang="EN-US"><span>..</span></span><span>因为质量</span><span lang="EN-US"><span>/</span></span><span>比特率被即时的调整了</span><span lang="EN-US"><span>,</span></span><span>整体质量将会稍稍低于由</span><span lang="EN-US"><span>VBR</span></span><span>对一个</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>设置得和目标平均比特率非常接近的质量数编码得到的结果</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>声音生动性检测<span>(VAD)</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>声音生动性检测将会发觉音频正在被编码成对话</span><span lang="EN-US"><span>,</span></span><span>静音</span><span lang="EN-US"><span>,</span></span><span>或背景噪音</span><span lang="EN-US"><span>.VAD</span></span><span>总在用</span><span lang="EN-US"><span>VBR</span></span><span>进行编码时暗中起作用</span><span lang="EN-US"><span>,</span></span><span>因此选项仅仅对一个不是</span><span lang="EN-US"><span>VBR</span></span><span>的操作起作用</span><span lang="EN-US"><span>.</span></span><span>对于不是</span><span lang="EN-US"><span>VBR</span></span><span>的操作来说</span><span lang="EN-US"><span>,speex</span></span><span>察觉出一个不属于对话的周期</span><span lang="EN-US"><span>,</span></span><span>然后对它用足够的字节重新生成为背景噪音</span><span lang="EN-US"><span>.</span></span><span>不这叫做<span>舒适的噪音生成</span></span><span lang="EN-US"><span>(</span></span><span lang="EN-US"><span>CNG).</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>不连续传输<span>(DTX)</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>不连续传输是</span><span lang="EN-US"><span>VAD/VBR</span></span><span>操作的一个额外选项</span><span lang="EN-US"><span>,</span></span><span>当背景噪音一定时</span><span lang="EN-US"><span>,</span></span><span>它可以完整地传输</span><span lang="EN-US"><span>.</span></span><span>因为在基于文件的操作中</span><span lang="EN-US"><span>,</span></span><span>我们不能停止对文件进行写入</span><span lang="EN-US"><span>,</span></span><span>所以只有</span><span lang="EN-US"><span>5</span></span><span>字节被这种帧所运用</span><span lang="EN-US"><span>.(</span></span><span>给</span><span lang="EN-US"><span>250bps</span></span><span>通信</span><span lang="EN-US"><span>)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>Perceptual enhancement</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong><span>知觉增强</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>知觉增加是解码的一部分</span><span lang="EN-US"><span>,</span></span><span>它在打开的时候用来减少由编码解码所产生的噪音</span><span lang="EN-US"><span>.</span></span><span>在大都数</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>情况下</span><span lang="EN-US"><span>,</span></span><span>知觉增强在客观上使声音离原始值更远</span><span lang="EN-US"><span>(</span></span><span>如果用</span><span lang="EN-US"><span>SNR),</span></span><span>但是在最后它仍然听起来更好</span><span lang="EN-US"><span>(</span></span><span>主观上的改进</span><span lang="EN-US"><span>)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>Algorithmic delay</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong>迟时算法</strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>每一个声音编码导致了在传输上的延时</span><span lang="EN-US"><span>.</span></span><span>对于</span><span lang="EN-US"><span>speex,</span></span><span>这种延时等于</span><span lang="EN-US"><span>frame</span></span><span>的大小加上一些</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>数量的需要对每一帧进行的前瞻</span><span lang="EN-US"><span>(&#8221;look-adhead&#8221;).</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>在窄宽操作中</span><span lang="EN-US"><span>(8kHz),</span></span><span>迟时是</span><span lang="EN-US"><span>30ms,</span></span><span>而对于多频率</span><span lang="EN-US"><span>(2-44Hz),</span></span><span>迟时是</span><span lang="EN-US"><span>34ms.</span></span><span>这些值</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>不包括</span><span lang="EN-US"><span>CPU</span></span><span>编码</span><span lang="EN-US"><span>,</span></span><span>解码帧的时间</span><span lang="EN-US"><span>.</span></span>&nbsp;</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span><strong>用<span>speex</span>编程<span>(the libspeex api)</span></strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>这个章节出要讲述了如何用</span><span lang="EN-US"><span>speex api</span></span><span>进行编程</span><span lang="EN-US"><span>.</span></span><span>例子的源代友你也可以在附录</span><span lang="EN-US"><span>B</span></span><span>中找到</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>4.1 Encoding</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong><span>4.1</span>压缩</strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>为了用</span><span lang="EN-US"><span>Speex</span></span><span>压缩对话</span><span lang="EN-US"><span>,</span></span><span>你首先需要引用头文件</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>#include &lt;speex.h&gt;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>然后你需要定义一个</span><span lang="EN-US"><span>Speex</span></span><span>的位采集</span><span lang="EN-US"><span>(bit-packing)</span></span><span>结构</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>SpeexBits bits;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>and a Speex encoder state</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>以及定义一个</span><span lang="EN-US"><span>speex</span></span><span>编码器状态量</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>void *enc_state;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>上面定义的这样被初始化</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>The two are initialized by:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_init(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>enc_state = speex_encoder_init(&amp;speex_nb_mode);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>为了支持多频率的压缩</span><span lang="EN-US"><span>,speex_nb_mode</span></span><span>将被</span><span lang="EN-US"><span>sppex_wb_mode</span></span><span>取代</span><span lang="EN-US"><span>.</span></span><span>在大都数</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>情况下</span><span lang="EN-US"><span>,</span></span><span>你需要知道你用的模式</span><span lang="EN-US"><span>(mode)</span></span><span>的帧</span><span lang="EN-US"><span>(frame)</span></span><span>的大小</span><span lang="EN-US"><span>,</span></span><span>你可以得到在</span><span lang="EN-US"><span>frame_size</span></span><span>变量里得到这值</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&amp;frame_size);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>一但初始化完毕</span><span lang="EN-US"><span>,</span></span><span>对于每一个输入帧</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_reset(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encode(enc_state, input_frame, &amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>nbBytes = speex_bits_write(&amp;bits, byte_ptr, MAX_NB_BYTES);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>上面</span><span lang="EN-US"><span>input_frame</span></span><span>是一个指向对话</span><span lang="EN-US"><span>(speech)</span></span><span>帧</span><span lang="EN-US"><span>(frame)</span></span><span>的</span><span lang="EN-US"><span>float</span></span><span>指针</span><span lang="EN-US"><span>(pointing);byte_ptr</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>是指向编码帧开始写的地方的</span><span lang="EN-US"><span>char</span></span><span>指针</span><span lang="EN-US"><span>,MAX_NB_BYTES</span></span><span>是能</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>写进</span><span lang="EN-US"><span>byte_ptr</span></span><span>而不会造成溢出的最大数</span><span lang="EN-US"><span>.nbBytes</span></span><span>是一个实际写入</span><span lang="EN-US"><span>btye_ptr</span></span><span>的数</span><span lang="EN-US"><span>,</span></span><span>即编码的实际大小</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>在调用</span><span lang="EN-US"><span>speex_bits_write</span></span><span>前</span><span lang="EN-US"><span>,</span></span><span>可能你需要调用</span><span lang="EN-US"><span>speex_bits_nbytes(&amp;bits)</span></span><span>得到需要写入</span><span lang="EN-US"><span>(write)</span></span><span>的字节大小</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>在你已经编码后</span><span lang="EN-US"><span>,</span></span><span>释放所有的资源</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_destroy(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encoder_destroy(enc_state);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>That&#8217;s about it for the encoder.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>这就是关于编码的方面</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span>&nbsp;</span></p>
<h4 id="subjcns!31B2F8637FF39314!276" class="TextColor1"><span>Speex manul中文版三</span></h4>
<div id="msgcns!31B2F8637FF39314!276">
<div>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>附源代码的翻译</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>B Sample code</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span><strong><span>B&nbsp;</span>例程源代码</strong></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>这个章节演示了一段用</span><span lang="EN-US"><span>speex</span></span><span>编码</span><span lang="EN-US"><span>,</span></span><span>解码对话</span><span lang="EN-US"><span>(speech)</span></span><span>的源代码</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>可以如下用</span><span lang="EN-US"><span>api</span></span><span>命令来编码并解码一个文件</span><span lang="EN-US"><span>:</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>译者注</span><span lang="EN-US"><span>:</span></span><span>这里说的</span><span lang="EN-US"><span>api</span></span><span>命令是指</span><span lang="EN-US"><span>unix</span></span><span>的用</span><span lang="EN-US"><span>&#8221;|&#8221;</span></span><span>进行管道写入读出</span><span lang="EN-US"><span>.</span></span><span>在</span><span lang="EN-US"><span>windows</span></span><span>下这样并不能实现</span><span lang="EN-US"><span>.</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>% sampleenc in_file.sw | sampledec out_file.sw</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>这里这两段代码都没有引用其它的头文件</span><span lang="EN-US"><span>,</span></span><span>并以</span><span lang="EN-US"><span>16&nbsp;</span></span><span>比特率</span><span lang="EN-US"><span>(bits)</span></span><span>进行编码</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>natural endianness).</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span><strong>B.1 sampleenc.c</strong></span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>Sameleenc&nbsp;</span></span><span>用一个未加工的</span><span lang="EN-US"><span>16</span></span><span>比特率</span><span lang="EN-US"><span>(bits)</span></span><span>文章</span><span lang="EN-US"><span>,</span></span><span>给它编码并产生一个</span><span lang="EN-US"><span>speex&nbsp;</span></span><span>流</span><span lang="EN-US"><span>(steam)</span></span><span>给标准输出</span><span lang="EN-US"><span>.</span></span><span>注意已压缩的和</span><span lang="EN-US"><span>speexenc/speexdec</span></span><span>不和谐</span><span lang="EN-US"><span>!</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>#include &lt;speex.h&gt;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>#include &lt;stdio.h&gt;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>/*</span></span><span>帧的大小在这个例程中是一个固定的值</span><span lang="EN-US"><span>,</span></span><span>但它并不是必须这样</span><span lang="EN-US"><span>*/</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>#define FRAME_SIZE 160</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>int main(int argc, char **argv)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>{</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>char *inFile;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>FILE *fin;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>short in[FRAME_SIZE];</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>float input[FRAME_SIZE];</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>char cbits[200];</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>int nbBytes;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>/*</span></span><span>保存编码的状态</span><span lang="EN-US"><span>*/</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>void *state;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>/*</span></span><span>保存字节因此他们可以被</span><span lang="EN-US"><span>speex</span></span><span>常规</span><span>读写</span><span lang="EN-US"><span>*/</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>&nbsp;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>SpeexBits bits;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>int i, tmp;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>新建一个新的编码状态在窄宽</span><span lang="EN-US"><span>(narrowband)</span></span><span>模式下</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>state = speex_encoder_init(&amp;speex_nb_mode);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>设置质量为</span><span lang="EN-US"><span>8(15kbps)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>tmp=8;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encoder_ctl(state, SPEEX_SET_QUALITY, &amp;tmp);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>inFile = argv[1];</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>fin = fopen(inFile, "r");</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>初始化结构使他们保存数据</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_init(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>while (1)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>{</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>读入一帧</span><span lang="EN-US"><span>16bits</span></span><span>的声音</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>fread(in, sizeof(short), FRAME_SIZE, fin);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>if (feof(fin))</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>break;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>把</span><span lang="EN-US"><span>16bits</span></span><span>的值转化为</span><span lang="EN-US"><span>float,</span></span><span>以便</span><span lang="EN-US"><span>speex</span></span><span>库可以在上面工作</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>for (i=0;i&lt;FRAME_SIZE;i++)</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>input[i]=in[i];</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>清空这个结构体里所有的字节</span><span lang="EN-US"><span>,</span></span><span>以便我们可以编码一个新的帧</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_reset(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>对帧进行编码</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encode(state, input, &amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>把</span><span lang="EN-US"><span>bits</span></span><span>拷贝到一个利用写出的</span><span lang="EN-US"><span>char</span></span><span>型数组</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>nbBytes = speex_bits_write(&amp;bits, cbits, 200);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>首先写出帧的大小</span><span lang="EN-US"><span>,</span></span><span>这是</span><span lang="EN-US"><span>sampledec</span></span><span>文件需要的一个值</span><span lang="EN-US"><span>,</span></span><span>但是你的应用程序中可能不一样</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>fwrite(&amp;nbBytes, sizeof(int), 1, stdout);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>写出压缩后的数组</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>fwrite(cbits, 1, nbBytes, stdout);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>}</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>释放</span><span>编码器状态量</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_encoder_destroy(state);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>//</span></span><span>释放</span><span lang="EN-US"><span>bit_packing</span></span><span>结构</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>speex_bits_destroy(&amp;bits);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>fclose(fin);</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>return 0;</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span lang="EN-US"><span>}</span></span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px" align="left"><span>&nbsp;</span></p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px"><span>&nbsp;</span></p></div></div>
<div class="postTitle"><a style="background-color: transparent; color: rgb(51,102,153); text-decoration: none; background-origin: initial; background-clip: initial" href="http://blog.donews.com/keo321/archive/2006/12/28/1104088.aspx"><span>如何使用Speex中的AEC模块，提高声音质量？</span></a></div>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">在Speex（<a style="background-color: transparent; color: rgb(51,102,153); text-decoration: none; background-origin: initial; background-clip: initial" href="http://www.speex.org/"><span>www.speex.org</span></a>）的最新版本中，开始集成了回音消除的模块，而回音消除一直是Voip之中亟待解决的主要问题。<br />很多朋友和我说speex的aec模块的效能并不好，我们先来看一下speex的aec的api调用方式。</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">/*<br />*创建AEC对象<br />*/<br />SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">frame_size 的取值最好是一个编码的frame大小， 在低带宽条件下，一般延迟20ms，而大小为160<br />filter_length,最好是房间内反射时间的1/3<br />如: 一个房间的反射时延为300ms<br />&nbsp;&nbsp;&nbsp; 那么这个filter_length就最好是100ms(这个长度又被称为tail length).</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">而其中filter_length的设定是一个关键。</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">/*<br />*执行AEC<br />*/<br />speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">其中:<br />input_frame: 就是被声卡捕捉到的声音<br />echo_frame: 是由扬声器播放出的声音,这个声音是需要从 input_frame中抵消的声音.</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">output_frame 是处理完以后输出的声音</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">residue是一个可选参数,如果不使用可以将之设置为NULL, 也可以通过preprocessor 来控制</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">问题的关键是 处理input和echo 之间的关系,<br />也就是说在捕捉到的信号和播放的信号之间的延迟必须足够的小,才可以提高效率.</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">writetosndcard(echo_frame, frame_size)<br />readfromsndcard(input_frame, frame_size)<br />speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)<br />如果你想要尽可能的减小信号中的回音,那么可以将residue这个参数设置为噪音参数.</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">我相信在大多数情况下，都是因为声音捕捉和声音播放之间的同步问题没有处理好，导致的音频质量下降。</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">/*<br />*销毁和复位<br />*/<br />speex_echo_state_destroy(echo_state);</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">speex_echo_state_reset(echo_state);<br />不再复述了！</p>
<p style="line-height: 1.5; text-indent: 0px; margin: 10px auto; font-size: 13px">说明：<br />据说在Speex的最新的1.2beta版本上，Speex提供了可选择的，简化的API，来提高echo执行过程中的同步问题。</p></div><img src ="http://www.cppblog.com/tx7do/aggbug/195510.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-11-21 23:56 <a href="http://www.cppblog.com/tx7do/archive/2012/11/21/195510.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Speex 回声消除</title><link>http://www.cppblog.com/tx7do/archive/2012/11/21/195507.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 21 Nov 2012 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/11/21/195507.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/195507.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/11/21/195507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/195507.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/195507.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自:http://blog.csdn.net/dxpqxb/article/details/7928591为什么需要声学回声消除呢？在一般的VOIP软件或视频会议系统中，假设我们只有A和B两个人在通话，首先，A的声音传给B，B然后用喇叭放出来，而这时B的MIC呢则会采集到喇叭放出来的声音，然后传回给A，如果这个传输的过程中时延足够大，A就会听到一个和自己刚才说过的话一样的声音，这就是回声，...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2012/11/21/195507.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/195507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-11-21 23:44 <a href="http://www.cppblog.com/tx7do/archive/2012/11/21/195507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AEC (Acoustic Echo Canceller) 回音消除初探</title><link>http://www.cppblog.com/tx7do/archive/2012/11/21/195505.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 21 Nov 2012 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/11/21/195505.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/195505.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/11/21/195505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/195505.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/195505.html</trackback:ping><description><![CDATA[<div><strong style="color: red">转载自:</strong><a style="color: red" href="http://www.cnblogs.com/rainbowzc/archive/2006/08/07/2422323.html"><strong>http://www.cnblogs.com/rainbowzc/archive/2006/08/07/2422323.html</strong></a><br /><br />
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">AEC回声抑制算法，这个比较难，目前可以使用directsound进行处理，不过只能在xp下使用，别的系统不支持！<br />目前gips对本算法有出色的实现，skype就是使用的该引擎！<br />要想自己实现，恐怕很困难！<br />&nbsp;</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">AEC 模块是 Microsoft DirectSound 底层结构的一部分。该组件包括下列特性和限制：</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">AEC只在不超过 25&#215;15&#215;9 英尺的小房间才会有效；<span class="Apple-converted-space">&nbsp;</span><br />AEC只对单声道有效，当输出是多个通道的立体声的时候，只有一个通道能够具有回波抵消的效果；<span class="Apple-converted-space">&nbsp;</span><br />AEC不能抵消来自其它声音源的声音，比如背景中收音机放出来的歌曲；<br />IDirectSoundFullDuplex8*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectSoundFD;//<br />IDirectSoundCaptureBuffer8*&nbsp; DirectSoundCaptureBuf8;//捕捉缓冲区接口指针<br />IDirectSoundBuffer8*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DirectSoundBuf8;//回放缓冲区接口指针<br />IDirectSoundBuffer8*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pIUnkown;//回放缓冲区接口指针</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">extern "C" const GUID IID_IDirectSoundBuffer8 = {0x6825a449, 0x7524, 0x4d82,{ 0x92, 0x0f, 0x50, 0xe3, 0x6a, 0xb3, 0xab, 0x1e}};<br />extern "C" const GUID GUID_DSCFX_MS_NS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = {0x11c5c73b, 0x66e9, 0x4ba1, {0xa0, 0xba, 0xe8, 0x14, 0xc6, 0xee, 0xd9, 0x2d}};<br />extern "C" const GUID GUID_DSCFX_CLASS_NS = {0xe07f903f, 0x62fd, 0x4e60, {0x8c, 0xdd, 0xde, 0xa7, 0x23, 0x66, 0x65, 0xb5}};<br />extern "C" const GUID GUID_DSCFX_MS_AEC = {0xcdebb919, 0x379a, 0x488a, {0x87, 0x65, 0xf5, 0x3c, 0xfd, 0x36, 0xde, 0x40}};<br />extern "C" const GUID GUID_DSCFX_CLASS_AEC = {0xBF963D80L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};<br />extern "C" const GUID DAlgorithm ={0x00000000,&nbsp; 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><br />//1.创建及初始化DirectSound<br />WAVEFORMATEX WaveDataFormat={WAVE_FORMAT_PCM, 1,8000,16000,2,16, 0};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />//回放缓冲区。render buffer<br />DSBUFFERDESC desc;<br />memset(&amp;desc, 0, sizeof(desc));<span class="Apple-converted-space">&nbsp;</span><br />desc.dwSize = sizeof(desc);<br />desc.dwFlags = DSBCAPS_CTRLFX | DSBCAPS_GLOBALFOCUS;<br />desc.dwBufferBytes = 2000 * NUM_REC_NOTIFICATIONS;//待定<br />desc.dwReserved = 0;<br />desc.lpwfxFormat = &amp;WaveDataFormat;<br />&nbsp;&nbsp;&nbsp;</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">//捕捉缓冲区AEC和NS效果。<br />DSCEFFECTDESC efft[2];<br />memset(efft, 0, sizeof(efft));<br />//AEC效果<br />efft[0].dwSize = sizeof(efft[0]);<br />efft[0].dwFlags = DSCFX_LOCSOFTWARE;<br />efft[0].guidDSCFXClass = GUID_DSCFX_CLASS_AEC;<br />efft[0].guidDSCFXInstance = GUID_DSCFX_MS_AEC;<br />//NS效果<br />efft[1].dwSize = sizeof(efft[1]);<br />efft[1].dwFlags = DSCFX_LOCSOFTWARE;<br />efft[1].guidDSCFXClass = GUID_DSCFX_CLASS_NS;<br />efft[1].guidDSCFXInstance = GUID_DSCFX_MS_NS;<br />&nbsp;&nbsp;&nbsp;<span class="Apple-converted-space">&nbsp;</span><br />//捕捉缓冲区。capture buffer<br />DSCBUFFERDESC cdesc;<br />memset(&amp;cdesc, 0, sizeof(cdesc));<br />cdesc.dwSize = sizeof(cdesc);<br />cdesc.dwFlags = DSCBCAPS_CTRLFX;<span class="Apple-converted-space">&nbsp;</span><br />cdesc.dwBufferBytes =&nbsp; 2000 * NUM_REC_NOTIFICATIONS;//待定<br />cdesc.lpwfxFormat = &amp;WaveDataFormat;<br />cdesc.dwFXCount = 2;<br />cdesc.lpDSCFXDesc = efft;</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">HWND win = AfxGetApp()-&gt;m_pMainWnd-&gt;m_hWnd;<br />hr = DirectSoundFullDuplexCreate8(0, 0,&amp;cdesc, &amp;desc,win,<span class="Apple-converted-space">&nbsp;</span><br />DSSCL_PRIORITY,&amp;DirectSoundFD, &amp;DirectSoundCaptureBuf8,&amp;DirectSoundBuf8, 0);<span class="Apple-converted-space">&nbsp;</span><br />DXTRACE_ERR( TEXT("DirectSoundFullDuplexCreate8"), hr );<br />//成功创建DirectSoundFD，DirectSoundCaptureBuf8，DirectSoundBuf8，均不为零。</p>
<p style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; margin: 10px auto; font: 13px/1.4 Verdana, Geneva, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">if(!FAILED(hr))<br />&nbsp;&nbsp;&nbsp; DirectSoundFD-&gt;QueryInterface(IID_IDirectSoundBuffer8, (void**)pIUnkown);<br />//发现上面的pIUnkown=0，查询失败，为什么？<br />&nbsp;&nbsp;&nbsp; AfxMessageBox("失败");</p></div><img src ="http://www.cppblog.com/tx7do/aggbug/195505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-11-21 23:23 <a href="http://www.cppblog.com/tx7do/archive/2012/11/21/195505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>混音器编程接口讨论</title><link>http://www.cppblog.com/tx7do/archive/2012/11/05/194617.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 05 Nov 2012 10:23:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/11/05/194617.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/194617.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/11/05/194617.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/194617.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/194617.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自:http://www.cnblogs.com/windviki/archive/2011/08/31/2160683.html混音器编程接口讨论翻译：windviki@gmail.com&nbsp;转载请注明译自：MIXER API ARGUMENTATION为了理解混音器API是如何工作的，必须先了解典型的声卡的硬件布局。我们有必要想象一下，声卡上有各种独...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2012/11/05/194617.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/194617.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-11-05 18:23 <a href="http://www.cppblog.com/tx7do/archive/2012/11/05/194617.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CxImage使用掩码色设置透明色的图</title><link>http://www.cppblog.com/tx7do/archive/2012/11/01/194161.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Thu, 01 Nov 2012 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/11/01/194161.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/194161.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/11/01/194161.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/194161.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/194161.html</trackback:ping><description><![CDATA[CxImage设置透明色的方法:<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;SetImageTransColor(&nbsp;CxImage</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pImg,&nbsp;BYTE&nbsp;R,&nbsp;BYTE&nbsp;G,&nbsp;BYTE&nbsp;B&nbsp;)<br /><img id="Codehighlighter1_65_250_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_250_Open_Text.style.display='none'; Codehighlighter1_65_250_Closed_Image.style.display='inline'; Codehighlighter1_65_250_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_65_250_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_65_250_Closed_Text.style.display='none'; Codehighlighter1_65_250_Open_Image.style.display='inline'; Codehighlighter1_65_250_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_65_250_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_65_250_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pImg&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetTransIndex()&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">24</span><span style="color: #000000">)<br /><img id="Codehighlighter1_129_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_129_157_Open_Text.style.display='none'; Codehighlighter1_129_157_Closed_Image.style.display='inline'; Codehighlighter1_129_157_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_129_157_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_129_157_Closed_Text.style.display='none'; Codehighlighter1_129_157_Open_Image.style.display='inline'; Codehighlighter1_129_157_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_129_157_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_129_157_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">IncreaseBpp(</span><span style="color: #000000">24</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetTransIndex(</span><span style="color: #000000">0</span><span style="color: #000000">);<br /><img id="Codehighlighter1_204_215_Open_Image" onclick="this.style.display='none'; Codehighlighter1_204_215_Open_Text.style.display='none'; Codehighlighter1_204_215_Closed_Image.style.display='inline'; Codehighlighter1_204_215_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_204_215_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_204_215_Closed_Text.style.display='none'; Codehighlighter1_204_215_Open_Image.style.display='inline'; Codehighlighter1_204_215_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;RGBQUAD&nbsp;rgbTrans&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_204_215_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_204_215_Open_Text"><span style="color: #000000">{B,&nbsp;G,&nbsp;R,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pImg</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetTransColor(rgbTrans);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span></div>经过这样设置透明色的图,如果使用CxImage::Stretch进行缩放绘制,绘制透明色并不会透明,而会原汁原味的将透明色如实的绘制上去,经过测试,使用CxImage::Draw2这个方法缩放绘制是没有问题的.<img src ="http://www.cppblog.com/tx7do/aggbug/194161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-11-01 15:05 <a href="http://www.cppblog.com/tx7do/archive/2012/11/01/194161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOCP+UDP收包的时候:报0xC000000005，读取0x00000010错误的问题</title><link>http://www.cppblog.com/tx7do/archive/2012/10/15/193298.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 15 Oct 2012 03:42:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/10/15/193298.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/193298.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/10/15/193298.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/193298.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/193298.html</trackback:ping><description><![CDATA[最近发现我那简单得不再简单的IOCP+UDP的底层出错了,在大数据量的时候经常会报错,并且清一色都是报的:报0xC000000005，读取0x00000010错误.报错之后,整个程序的堆栈就全部破坏掉了.从发现问题到今日问题的解决,已经过去了一个月的时间.<br />唯一能够找到相关的资料只有:<a href="http://www.cppblog.com/HendricLee/archive/2008/07/29/57436.html">http://www.cppblog.com/HendricLee/archive/2008/07/29/57436.html</a><br />但是事实上,我的Overlapped都是复用的.因此,不大可能是此问题导致的.经过测试证明,也确实与此无关.<br />昨晚上又做了一系列的测试,结果到最后依旧是无果,百般无奈之下,只好问人,后面QQ好友Sagasarate告诉了我原委,我知道之后,只有两种感觉:想哭,想撞墙.<img border="0" alt="" src="http://www.cppblog.com/Emoticons/QQ/02.gif" width="20" height="20" /><br />至于为什么,请看以下代码便知了.非常非常之低级的错误.<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;CUDPRecvSendThread::postRecvRequest(CUdpOverLappedRecv</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pOverLappedRecv)<br /><img id="Codehighlighter1_78_626_Open_Image" onclick="this.style.display='none'; Codehighlighter1_78_626_Open_Text.style.display='none'; Codehighlighter1_78_626_Closed_Image.style.display='inline'; Codehighlighter1_78_626_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_78_626_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_78_626_Closed_Text.style.display='none'; Codehighlighter1_78_626_Open_Image.style.display='inline'; Codehighlighter1_78_626_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_78_626_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_78_626_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(pOverLappedRecv);<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pOverLappedRecv&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><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;pOverLappedRecv</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Reset();<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;DWORD&nbsp;dwBytesRecv&nbsp;</span><span style="color: #000000">=</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/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwFlags&nbsp;</span><span style="color: #000000">=</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/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nSenderAddrSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">&nbsp;(sockaddr_in);<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;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;rc&nbsp;</span><span style="color: #000000">=</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/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;rc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;::WSARecvFrom(m_ServerSocket,&nbsp;pOverLappedRecv</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetWsaBuffer(),&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">dwBytesRecv,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">dwFlags,<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pOverLappedRecv</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetClientAddr(), &amp;nSenderAddrSize,<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pOverLappedRecv</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetOverlapped(),&nbsp;NULL);<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;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(rc&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;SOCKET_ERROR)<br /><img id="Codehighlighter1_501_609_Open_Image" onclick="this.style.display='none'; Codehighlighter1_501_609_Open_Text.style.display='none'; Codehighlighter1_501_609_Closed_Image.style.display='inline'; Codehighlighter1_501_609_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_501_609_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_501_609_Closed_Text.style.display='none'; Codehighlighter1_501_609_Open_Image.style.display='inline'; Codehighlighter1_501_609_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_501_609_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_501_609_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwErrorCode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;::WSAGetLastError();<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwErrorCode&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;WSA_IO_PENDING)<br /><img id="Codehighlighter1_585_606_Open_Image" onclick="this.style.display='none'; Codehighlighter1_585_606_Open_Text.style.display='none'; Codehighlighter1_585_606_Closed_Image.style.display='inline'; Codehighlighter1_585_606_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_585_606_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_585_606_Closed_Text.style.display='none'; Codehighlighter1_585_606_Open_Image.style.display='inline'; Codehighlighter1_585_606_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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_585_606_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_585_606_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div>请对照着MSDN看.<br />如果没看出来,那我来告诉你是为什么.<br />问题就在于WSARecvFrom的7个参数.<br />MSDN的描述:<br />
<dt style="widows: 2; text-transform: none; text-indent: 0px; font: 12px/16px 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"><em>lpFromlen</em><span class="Apple-converted-space">&nbsp;</span>[in, out] 
</dt><dd style="widows: 2; text-transform: none; text-indent: 0px; font: 12px/16px 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">
<p style="padding-bottom: 15px; line-height: 18px; margin-top: 0px; margin-bottom: 0px; color: #2a2a2a">A pointer to the size, in bytes, of the "from" buffer required only if<span class="Apple-converted-space">&nbsp;</span><em>lpFrom</em><span class="Apple-converted-space">&nbsp;</span>is specified.<br /></p></dd>
<p style="widows: 2; text-transform: none; text-indent: 0px; font-family: 'Segoe UI', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; line-height: 16px; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; "><span style="font-size: 10pt; ">你会发现,这个参数是一个输入输出值.而WSARecvFrom投递的是一个异步的IOCP请求,故而,出了此方法(</span><span style="font-size: 12px;">CUDPRecvSendThread::postRecvRequest</span><span style="font-size: 10pt; ">)之后,nSenderAddrSize这个临时变量就会被回收.不出事才怪了.</span><br /><span style="font-size: 10pt; ">好吧,这事就是我干出来的.今年竟是做一些脑残的事情.肿么了我这是.T_T</span><br /><span style="font-size: 10pt; ">要解决这个问题,最好的办法就是把nSenderAddrSize作为CUdpOverLappedRecv的成员变量保存,这样生命周期可以得以保证.</span><br /><span style="font-size: 10pt; ">好吧,这件脑残事就这么结了. </span></p><img src ="http://www.cppblog.com/tx7do/aggbug/193298.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-10-15 11:42 <a href="http://www.cppblog.com/tx7do/archive/2012/10/15/193298.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用FFMPEG SDK进行视频转码压缩时解决音视频不同步问题的方法</title><link>http://www.cppblog.com/tx7do/archive/2012/09/17/190953.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 17 Sep 2012 03:09:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/09/17/190953.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/190953.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/09/17/190953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/190953.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/190953.html</trackback:ping><description><![CDATA[<div>转载自:<a href="http://blog.sina.com.cn/s/blog_6281e5750100vhn5.html">http://blog.sina.com.cn/s/blog_6281e5750100vhn5.html</a><br /><br />
<p>用FFMPEG SDK进行视频转码压缩的时候，转码成功后去看视频的内容，发现音视频是不同步的。这个的确是一个恼火的事情。我在用FFMPEG SDK做h264格式的FLV文件编码Filter的时候就碰到了这个问题。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 经过研究发现，FFMPEG SDK写入视频的时候有两个地方用来控制写入的时间戳，一个是AvPacket, 一个是AvFrame。 在调用avcodec_encode_video的时候需要传入AvFrame的对象指针，也就是传入一帧未压缩的视频进行压缩处理，AvFrame包含一个pts的参数，这个参数就是当前帧将来在还原播放的时候的时间戳。而AvPacket里面也有pts，还有dts。说起这个就必须要说明一下I,P,B三种视频压缩帧。I帧就是关键帧，不依赖于其他视频帧，P帧是向前预测的帧，只依赖于前面的视频帧，而B帧是双向预测视频帧，依赖于前后视频帧。由于B帧的存在，因为它是双向的，必须知道前面的视频帧和后面的视频帧的详细内容后，才能知道本B帧最终该呈现什么图像。而pts和dts两个参数就是用来控制视频帧的显示和解码的顺序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pts就是帧显示的顺序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dts就是帧被读取进行解码的顺序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 如果没有B帧存在，dts和pts是相同的。反之，则是不相同的。关于这个的详细介绍可以参考一下mpeg的原理。</p>
<p>再说说AvPacket中包含的pts和dts两个到底该设置什么值？</p>
<p>pts和dts需要设置的就是视频帧解码和显示的顺序。每增加一帧就加一，并不是播放视频的时间戳。</p>
<p>但是实践证明经过rmvb解码的视频有时候并不是固定帧率的，而是变帧率的，这样，如果每压缩一帧，pts和dts加一的方案为导致音视频不同步。</p>
<p>那怎么来解决音视频同步的问题呢？</p>
<p>请看如下代码段。</p>
<p>lTimeStamp 是通过directshow 获取的当前的视频帧的时间戳。</p>
<p>m_llframe_index为当前已经经过压缩处理的帧的数量。</p>
<p>首先av_rescale计算得到当前压缩处理已经需要处理什么时间戳的视频帧，如果该时间戳尚未到达directshow当前提供的视频帧的时间戳，则将该帧丢弃掉。</p>
<p>否则进行压缩操作。并设置AVPacket的pts和dts。这里假设B帧不存在。</p>
<p>因为在将来播放的时候视频以我们设定的固定播放帧率进行播放，所以需要根据设定的播放帧率计算得到的视频帧时间戳和directshow提供的当前视频帧的时间戳进行比较，设定是否需要进行实施延缓播放的策略。如果需要延缓播放，则将pts增加步长2，否则以普通速度播放，则设置为1.dts与之相同。</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 />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">__int64&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;av_rescale(m_llframe_index,AV_TIME_BASE</span><span style="color: #000000">*</span><span style="color: #000000">(int64_t)c</span><span style="color: #000000">-&gt;</span><span style="color: #000000">time_base.num,c</span><span style="color: #000000">-&gt;</span><span style="color: #000000">time_base.den);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;x&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lTimeStamp&nbsp;)<br /><img id="Codehighlighter1_119_134_Open_Image" onclick="this.style.display='none'; Codehighlighter1_119_134_Open_Text.style.display='none'; Codehighlighter1_119_134_Closed_Image.style.display='inline'; Codehighlighter1_119_134_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_119_134_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_119_134_Closed_Text.style.display='none'; Codehighlighter1_119_134_Open_Image.style.display='inline'; Codehighlighter1_119_134_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_119_134_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_119_134_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TRUE;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />m_pVideoFrame2</span><span style="color: #000000">-&gt;</span><span style="color: #000000">pts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lTimeStamp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />m_pVideoFrame2</span><span style="color: #000000">-&gt;</span><span style="color: #000000">pict_type&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;out_size&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;avcodec_encode_video(&nbsp;c,&nbsp;m_pvideo_outbuf,&nbsp;video_outbuf_size,&nbsp;m_pVideoFrame2&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(out_size&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 /><img id="Codehighlighter1_315_898_Open_Image" onclick="this.style.display='none'; Codehighlighter1_315_898_Open_Text.style.display='none'; Codehighlighter1_315_898_Closed_Image.style.display='inline'; Codehighlighter1_315_898_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_315_898_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_315_898_Closed_Text.style.display='none'; Codehighlighter1_315_898_Open_Image.style.display='inline'; Codehighlighter1_315_898_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_315_898_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_315_898_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />AVPacket&nbsp;pkt;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />av_init_packet(</span><span style="color: #000000">&amp;</span><span style="color: #000000">pkt);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;x&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;lTimeStamp&nbsp;)<br /><img id="Codehighlighter1_375_438_Open_Image" onclick="this.style.display='none'; Codehighlighter1_375_438_Open_Text.style.display='none'; Codehighlighter1_375_438_Closed_Image.style.display='inline'; Codehighlighter1_375_438_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_375_438_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_375_438_Closed_Text.style.display='none'; Codehighlighter1_375_438_Open_Image.style.display='inline'; Codehighlighter1_375_438_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.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_375_438_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_375_438_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;pkt.pts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pkt.dts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_llframe_index;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;pkt.duration&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_445_600_Open_Image" onclick="this.style.display='none'; Codehighlighter1_445_600_Open_Text.style.display='none'; Codehighlighter1_445_600_Closed_Image.style.display='inline'; Codehighlighter1_445_600_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_445_600_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_445_600_Closed_Text.style.display='none'; Codehighlighter1_445_600_Open_Image.style.display='inline'; Codehighlighter1_445_600_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.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_445_600_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_445_600_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;pkt.duration&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(lTimeStamp&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;x)</span><span style="color: #000000">*</span><span style="color: #000000">c</span><span style="color: #000000">-&gt;</span><span style="color: #000000">time_base.den</span><span style="color: #000000">/</span><span style="color: #000000">1000000</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;pkt.pts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_llframe_index;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;pkt.dts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pkt.pts;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;m_llframe_index&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;pkt.duration;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">pkt.pts&nbsp;=&nbsp;lTimeStamp&nbsp;*&nbsp;(__int64)frame_rate.den&nbsp;/&nbsp;1000;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;c</span><span style="color: #000000">-&gt;</span><span style="color: #000000">coded_frame&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;c</span><span style="color: #000000">-&gt;</span><span style="color: #000000">coded_frame</span><span style="color: #000000">-&gt;</span><span style="color: #000000">key_frame&nbsp;)<br /><img id="Codehighlighter1_710_743_Open_Image" onclick="this.style.display='none'; Codehighlighter1_710_743_Open_Text.style.display='none'; Codehighlighter1_710_743_Closed_Image.style.display='inline'; Codehighlighter1_710_743_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_710_743_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_710_743_Closed_Text.style.display='none'; Codehighlighter1_710_743_Open_Image.style.display='inline'; Codehighlighter1_710_743_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.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_710_743_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_710_743_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;pkt.flags&nbsp;</span><span style="color: #000000">|=</span><span style="color: #000000">&nbsp;PKT_FLAG_KEY;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />pkt.stream_index</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_pVideoStream</span><span style="color: #000000">-&gt;</span><span style="color: #000000">index;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />pkt.data</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;m_pvideo_outbuf;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />pkt.size</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;out_size;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" /><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;av_interleaved_write_frame(&nbsp;m_pAvFormatContext,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">pkt&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_905_916_Open_Image" onclick="this.style.display='none'; Codehighlighter1_905_916_Open_Text.style.display='none'; Codehighlighter1_905_916_Closed_Image.style.display='inline'; Codehighlighter1_905_916_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_905_916_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_905_916_Closed_Text.style.display='none'; Codehighlighter1_905_916_Open_Image.style.display='inline'; Codehighlighter1_905_916_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_905_916_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_905_916_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />}</span></span></div>
<p><br />&nbsp;</p></div><img src ="http://www.cppblog.com/tx7do/aggbug/190953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-09-17 11:09 <a href="http://www.cppblog.com/tx7do/archive/2012/09/17/190953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Directshow框架使用Windows渲染器VMR叠加水印</title><link>http://www.cppblog.com/tx7do/archive/2012/09/17/190951.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 17 Sep 2012 03:06:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/09/17/190951.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/190951.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/09/17/190951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/190951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/190951.html</trackback:ping><description><![CDATA[转载自:<a href="http://blog.sina.com.cn/s/blog_6281e5750100xdnj.html">http://blog.sina.com.cn/s/blog_6281e5750100xdnj.html</a><br /><br />对于windows系统，EVR/VMR9/VMR渲染器均提供了叠加静态图片的接口：<br />SetAlphaBitmap（）；<br />&nbsp;<br />此接口支持静态图片的资源使用方式，一种是HDC，一种是SURFACE；<br />使用发现，如果静态图片不规则，是有Alpha通道的不同取值形成，<br />则通过HDC叠加的会有黑边存在；<br />&nbsp;<br />对于EVR/VMR9可采用SURFACE，使用D3D创建，完美水印效果相对容易实现，略过；<br />对于VMR渲染器，SURFACE需要基于DirectDraw创建离屏表面；<br />&nbsp;<br />离屏表面创建后，静态图片数据使用决定着是否能完美呈现水印效果；<br />一种是通过离屏表面获取HDC，操作HDC，把静态图片附加给离屏表面，<br />一种是通过直接操作离屏表面的内存数据地址；<br />&nbsp;<br />经过几天的摸索，实现了比较完美的水印效果，代码如下：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">LPDIRECTDRAW7&nbsp;lpDDraw7;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(DirectDrawCreateEx(NULL,&nbsp;(LPVOID&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">lpDDraw7,&nbsp;IID_IDirectDraw7,&nbsp;NULL)))<br /><img id="Codehighlighter1_112_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_128_Open_Text.style.display='none'; Codehighlighter1_112_128_Closed_Image.style.display='inline'; Codehighlighter1_112_128_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_112_128_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_112_128_Closed_Text.style.display='none'; Codehighlighter1_112_128_Open_Image.style.display='inline'; Codehighlighter1_112_128_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&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_112_128_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_112_128_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(FAILED(lpDDraw7</span><span style="color: #000000">-&gt;</span><span style="color: #000000">SetCooperativeLevel(m_hShowWin,&nbsp;DDSCL_NORMAL)))<br /><img id="Codehighlighter1_201_215_Open_Image" onclick="this.style.display='none'; Codehighlighter1_201_215_Open_Text.style.display='none'; Codehighlighter1_201_215_Closed_Image.style.display='inline'; Codehighlighter1_201_215_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_201_215_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_201_215_Closed_Text.style.display='none'; Codehighlighter1_201_215_Open_Image.style.display='inline'; Codehighlighter1_201_215_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&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_201_215_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_201_215_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;DDSURFACEDESC2&nbsp;ddsd;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;ZeroMemory(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ddsd,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(ddsd));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.dwSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(ddsd);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.dwFlags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DDSD_CAPS&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;DDSD_WIDTH&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;DDSD_HEIGHT&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;DDSD_PIXELFORMAT;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.ddsCaps.dwCaps&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DDSCAPS_OFFSCREENPLAIN;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.dwWidth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xs;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;ddsd.dwHeight&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ys;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwSize&nbsp;</span><span style="color: #000000">=</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(DDPIXELFORMAT);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwFlags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">DDPF_RGB&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;DDPF_ALPHAPIXELS;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwRGBBitCount&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">32</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwRBitMask</span><span style="color: #000000">=</span><span style="color: #000000">0x00ff0000</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwGBitMask</span><span style="color: #000000">=</span><span style="color: #000000">0x0000ff00</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;ddsd.ddpfPixelFormat.dwBBitMask</span><span style="color: #000000">=</span><span style="color: #000000">0x000000ff</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;ddsd.ddpfPixelFormat.dwRGBAlphaBitMask</span><span style="color: #000000">=</span><span style="color: #000000">0xff000000</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(FAILED(lpDDraw7</span><span style="color: #000000">-&gt;</span><span style="color: #000000">CreateSurface(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ddsd,&nbsp;lpSource,&nbsp;NULL)))<br /><img id="Codehighlighter1_885_899_Open_Image" onclick="this.style.display='none'; Codehighlighter1_885_899_Open_Text.style.display='none'; Codehighlighter1_885_899_Closed_Image.style.display='inline'; Codehighlighter1_885_899_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_885_899_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_885_899_Closed_Text.style.display='none'; Codehighlighter1_885_899_Open_Image.style.display='inline'; Codehighlighter1_885_899_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&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_885_899_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_885_899_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />lpSurface</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Restore();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;CImage&nbsp;img;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;HRESULT&nbsp;result;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;img.Load(_bstr_t(path));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">SUCCEEDED(result))<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;LPBYTE&nbsp;lpBits&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)img.GetBits();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nPitch&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;img.GetPitch();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;imgWidth&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;img.GetWidth();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;bpp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;img.GetBPP();<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(bpp&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">24</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;bpp&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;DDSURFACEDESC2&nbsp;dds;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;ZeroMemory(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dds,</span><span style="color: #000000">0</span><span style="color: #000000">,</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(dds));<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;dds.dwSize&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(dds);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(DD_OK&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;lpSurface</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Lock(NULL,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">dds,&nbsp;DDLOCK_WAIT,&nbsp;NULL))<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;LPBYTE&nbsp;dest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(LPBYTE)dds.lpSurface;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;yPos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;yPos&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;img.GetHeight();&nbsp;yPos</span><span style="color: #000000">++</span><span style="color: #000000">)<br /><img id="Codehighlighter1_1463_1892_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1463_1892_Open_Text.style.display='none'; Codehighlighter1_1463_1892_Closed_Image.style.display='inline'; Codehighlighter1_1463_1892_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1463_1892_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1463_1892_Closed_Text.style.display='none'; Codehighlighter1_1463_1892_Open_Image.style.display='inline'; Codehighlighter1_1463_1892_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif">&nbsp;&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_1463_1892_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1463_1892_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;LPBYTE&nbsp;lpBytes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBits&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;(&nbsp;yPos&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;nPitch&nbsp;);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;width&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;img.GetWidth(&nbsp;)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;(bpp&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">8</span><span style="color: #000000">);<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;xPos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;xPos&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;width;&nbsp;)<br /><img id="Codehighlighter1_1600_1855_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1600_1855_Open_Text.style.display='none'; Codehighlighter1_1600_1855_Closed_Image.style.display='inline'; Codehighlighter1_1600_1855_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1600_1855_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1600_1855_Closed_Text.style.display='none'; Codehighlighter1_1600_1855_Open_Image.style.display='inline'; Codehighlighter1_1600_1855_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&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_1600_1855_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1600_1855_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(bpp&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">24</span><span style="color: #000000">)<br /><img id="Codehighlighter1_1624_1771_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1624_1771_Open_Text.style.display='none'; Codehighlighter1_1624_1771_Closed_Image.style.display='inline'; Codehighlighter1_1624_1771_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1624_1771_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1624_1771_Closed_Text.style.display='none'; Codehighlighter1_1624_1771_Open_Image.style.display='inline'; Codehighlighter1_1624_1771_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_1624_1771_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1624_1771_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBytes[xPos&nbsp;];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBytes[xPos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBytes[xPos&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0xff</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xPos&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(bpp&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">32</span><span style="color: #000000">)<br /><img id="Codehighlighter1_1800_1850_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1800_1850_Open_Text.style.display='none'; Codehighlighter1_1800_1850_Closed_Image.style.display='inline'; Codehighlighter1_1800_1850_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_1800_1850_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1800_1850_Closed_Text.style.display='none'; Codehighlighter1_1800_1850_Open_Image.style.display='inline'; Codehighlighter1_1800_1850_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_1800_1850_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1800_1850_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">dest</span><span style="color: #000000">++</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;lpBytes[xPos];<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xPos&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />&nbsp;&nbsp;&nbsp;dest&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;dds.lPitch&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;width;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />&nbsp;&nbsp;lpSurface</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Unlock(NULL);</span></div>静态图片的数据赋给离屏表面，上面代码采用的是操作内存的方式，如果采用<br />lpSurface-&gt;GetDc(&amp;hdc)的方式，然后通过BitBlt方式绘制的话，alpha通道会丢失，达不到水印的完美呈现<img src ="http://www.cppblog.com/tx7do/aggbug/190951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-09-17 11:06 <a href="http://www.cppblog.com/tx7do/archive/2012/09/17/190951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在activex控件工程中使用directshow,编译时link错误的解决方法</title><link>http://www.cppblog.com/tx7do/archive/2012/08/17/187492.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Fri, 17 Aug 2012 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/08/17/187492.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/187492.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/08/17/187492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/187492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/187492.html</trackback:ping><description><![CDATA[<div><strong style="color: red">转载自:</strong><a style="color: red" href="http://www.wangchao.net.cn/bbsdetail_839548.html"><strong>http://www.wangchao.net.cn/bbsdetail_839548.html</strong></a><br /><br /><span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; display: inline !important; font: 14px/25px simsun; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">错误为： <br />strmbase.lib(dllentry.obj) : error LNK2001: unresolved external symbol "class CFactoryTemplate * g_Templates" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#103;&#95;&#84;&#101;&#109;&#112;&#108;&#97;&#116;&#101;&#115;&#64;&#64;&#51;&#80;&#65;&#86;&#67;&#70;&#97;&#99;&#116;&#111;&#114;&#121;&#84;&#101;&#109;&#112;&#108;&#97;&#116;&#101;&#64;&#64;&#65;">g_Templates@@3PAVCFactoryTemplate@@A</a>) <br />strmbase.lib(dllentry.obj) : error LNK2001: unresolved external symbol "int g_cTemplates" (<a href='&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#103;&#95;&#99;&#84;&#101;&#109;&#112;&#108;&#97;&#116;&#101;&#115;&#64;&#64;&#51;&#72;&#65;&#34;&#103;&#95;&#99;&#84;&#101;&#109;&#112;&#108;&#97;&#116;&#101;&#115;&#64;&#64;&#51;&#72;&#65;'>g_cTemplates@@3HA"g_cTemplates@@3HA</a>)</span><br style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/25px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" /><span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; display: inline !important; font: 14px/25px simsun; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">原因好像出在标准C上，与用户代码无关。</span><br style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; font: 14px/25px simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" /><span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; display: inline !important; font: 14px/25px simsun; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">----------------------------解决方案--------------------------------------<br />加入<span style="widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; display: inline !important; font: 14px/25px simsun; white-space: normal; orphans: 2; float: none; letter-spacing: normal; color: rgb(0,0,0); word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px">下面加上以下代码,重新编译即可.
<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 id="Codehighlighter1_2_80_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_80_Open_Text.style.display='none'; Codehighlighter1_2_80_Closed_Image.style.display='inline'; Codehighlighter1_2_80_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_2_80_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_2_80_Closed_Text.style.display='none'; Codehighlighter1_2_80_Open_Image.style.display='inline'; Codehighlighter1_2_80_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ContractedBlock.gif"><span style="color: #000000">　　</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_2_80_Closed_Text">/**/</span><span id="Codehighlighter1_2_80_Open_Text"><span style="color: #808080">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//&nbsp;</span><span style="color: #808080"></span></span><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">　　</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;DllGetClassObject&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">　　</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　STDAPI&nbsp;DllGetClassObject(REFCLSID&nbsp;rclsid,&nbsp;REFIID&nbsp;riid,&nbsp;LPVOID</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;ppv)&nbsp;<br /><img id="Codehighlighter1_192_296_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_296_Open_Text.style.display='none'; Codehighlighter1_192_296_Closed_Image.style.display='inline'; Codehighlighter1_192_296_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_192_296_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_192_296_Closed_Text.style.display='none'; Codehighlighter1_192_296_Open_Image.style.display='inline'; Codehighlighter1_192_296_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_192_296_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_192_296_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　AFX_MANAGE_STATE(AfxGetStaticModuleState());&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;AfxDllGetClassObject(rclsid,&nbsp;riid,&nbsp;ppv);&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br /><img id="Codehighlighter1_301_379_Open_Image" onclick="this.style.display='none'; Codehighlighter1_301_379_Open_Text.style.display='none'; Codehighlighter1_301_379_Closed_Image.style.display='inline'; Codehighlighter1_301_379_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_301_379_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_301_379_Closed_Text.style.display='none'; Codehighlighter1_301_379_Open_Image.style.display='inline'; Codehighlighter1_301_379_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_301_379_Closed_Text">/**/</span><span id="Codehighlighter1_301_379_Open_Text"><span style="color: #808080">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//&nbsp;</span><span style="color: #808080"></span></span><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /><span style="color: #000000">　　</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;DllCanUnloadNow&nbsp;</span><span style="color: #008000"><br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" /></span><span style="color: #000000">　　</span><span style="color: #0000ff">extern</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">C</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/None.gif"  alt="" />　　STDAPI&nbsp;DllCanUnloadNow(</span><span style="color: #0000ff">void</span><span style="color: #000000">)&nbsp;<br /><img id="Codehighlighter1_450_535_Open_Image" onclick="this.style.display='none'; Codehighlighter1_450_535_Open_Text.style.display='none'; Codehighlighter1_450_535_Closed_Image.style.display='inline'; Codehighlighter1_450_535_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_450_535_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_450_535_Closed_Text.style.display='none'; Codehighlighter1_450_535_Open_Image.style.display='inline'; Codehighlighter1_450_535_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_450_535_Closed_Text"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_450_535_Open_Text"><span style="color: #000000">{&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　AFX_MANAGE_STATE(AfxGetStaticModuleState());&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif"  alt="" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;AfxDllCanUnloadNow();&nbsp;<br /><img align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif"  alt="" />　　}</span></span><span style="color: #000000">&nbsp;<br /><img id="Codehighlighter1_540_616_Open_Image" onclick="this.style.display='none'; Codehighlighter1_540_616_Open_Text.style.display='none'; Codehighlighter1_540_616_Closed_Image.style.display='inline'; Codehighlighter1_540_616_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_540_616_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_540_616_Closed_Text.style.display='none'; Codehighlighter1_540_616_Open_Image.style.display='inline'; Codehighlighter1_540_616_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_540_616_Closed_Text">/**/</span><span id="Codehighlighter1_540_616_Open_Text"><span style="color: #808080">///////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">/</span></div></span><br /><br /></span><br /></span></div><img src ="http://www.cppblog.com/tx7do/aggbug/187492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-08-17 17:01 <a href="http://www.cppblog.com/tx7do/archive/2012/08/17/187492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Windows下编译最新版本的Libjingle</title><link>http://www.cppblog.com/tx7do/archive/2012/07/18/184081.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Wed, 18 Jul 2012 09:02:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/07/18/184081.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/184081.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/07/18/184081.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/184081.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/184081.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自:http://mysuperbaby.iteye.com/blog/908866&nbsp;Libjingle版本: 0.5.2操作系统: Windows XP&nbsp;编译器: Microsoft Visual C++ 2008 Express&nbsp;具体可以参考README:&nbsp;http://code.google.com/p/libjingle/source/brows...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2012/07/18/184081.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/184081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-07-18 17:02 <a href="http://www.cppblog.com/tx7do/archive/2012/07/18/184081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOCP包裹类</title><link>http://www.cppblog.com/tx7do/archive/2012/07/16/183777.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Mon, 16 Jul 2012 10:38:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/07/16/183777.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/183777.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/07/16/183777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/183777.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/183777.html</trackback:ping><description><![CDATA[头文件：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000">/*</span><span style="color: #008000">*********************************************************************<br />*&nbsp;Copyright&nbsp;(C)&nbsp;2008&nbsp;-&nbsp;&nbsp;-&nbsp;All&nbsp;Rights&nbsp;Reserved<br />*<br />*&nbsp;文件名称:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOCP.h<br />*&nbsp;摘&nbsp;&nbsp;&nbsp;&nbsp;要:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOCP包裹类<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />*&nbsp;作&nbsp;&nbsp;&nbsp;&nbsp;者:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yanglinbo,&nbsp;<br />*&nbsp;修&nbsp;&nbsp;&nbsp;&nbsp;改:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查看文件最下方.<br />*&nbsp;<br />**********************************************************************</span><span style="color: #008000">*/</span><br /><br />#ifndef&nbsp;__IOCP_H__<br /><span style="color: #0000ff">#define</span>&nbsp;__IOCP_H__<br /><br /><br />#include&nbsp;&lt;assert.h&gt;<br />#include&nbsp;&lt;WinSock2.h&gt;<br /><br /><br /><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//<br /></span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;IOCP包装类，完成IOCP创建，关联等动作<br /></span><span style="color: #808080">////////////////////////////////////////////////////////////////////////</span><span style="color: #008000">//</span><span style="color: #808080"><br /></span><span style="color: #0000ff">class</span>&nbsp;CIOCP<br />{<br /><span style="color: #0000ff">public</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;CIOCP(<span style="color: #0000ff">int</span>&nbsp;nMaxConcurrency&nbsp;=&nbsp;-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">virtual</span>&nbsp;~CIOCP(<span style="color: #0000ff">void</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;CIOCP&amp;&nbsp;<span style="color: #0000ff">operator</span>&nbsp;=&nbsp;(<span style="color: #0000ff">const</span>&nbsp;CIOCP&amp;&nbsp;rht);<br />&nbsp;&nbsp;&nbsp;&nbsp;CIOCP&amp;&nbsp;<span style="color: #0000ff">operator</span>&nbsp;=&nbsp;(<span style="color: #0000ff">const</span>&nbsp;HANDLE&amp;&nbsp;rht);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">operator</span>&nbsp;HANDLE()&nbsp;<span style="color: #0000ff">const</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;创建IOCP<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;nMaxConcurrency&nbsp;最大线程数</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;Create(<span style="color: #0000ff">int</span>&nbsp;nMaxConcurrency);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;销毁IOCP</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;Destroy();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;完全端口是否有效</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;IsValid()&nbsp;<span style="color: #0000ff">const</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;关联指定SOCKET及参数到IOCP<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;socket<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;CompKey</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;AssociateSocket(SOCKET&nbsp;socket,&nbsp;ULONG_PTR&nbsp;CompKey);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;发送通知到IOCP<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;CompKey<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;dwNumBytes<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;po</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;PostStatus(ULONG_PTR&nbsp;CompKey,&nbsp;DWORD&nbsp;dwNumBytes&nbsp;=&nbsp;0,&nbsp;OVERLAPPED*&nbsp;po&nbsp;=&nbsp;NULL);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #008000">&nbsp;取得IOCP状态<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;pCompKey<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;pdwNumBytes<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;ppo<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;@param&nbsp;[in]&nbsp;dwMilliseconds</span><span style="color: #808080"><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;BOOL&nbsp;GetStatus(ULONG_PTR*&nbsp;pCompKey,&nbsp;PDWORD&nbsp;pdwNumBytes,&nbsp;OVERLAPPED**&nbsp;ppo,&nbsp;DWORD&nbsp;dwMilliseconds&nbsp;=&nbsp;INFINITE);<br /><br /><span style="color: #0000ff">private</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;HANDLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_hIOCP;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #808080">///</span><span style="color: #808080">&lt;&nbsp;IOCP句柄<br /></span><span style="color: #008000">};</span><span style="color: #808080"><br /></span><br /><br /><span style="color: #0000ff">#endif</span></div><br /><br />cpp文件：<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img id="Codehighlighter1_0_281_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_281_Open_Text.style.display='none'; Codehighlighter1_0_281_Closed_Image.style.display='inline'; Codehighlighter1_0_281_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_0_281_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_0_281_Closed_Text.style.display='none'; Codehighlighter1_0_281_Open_Image.style.display='inline'; Codehighlighter1_0_281_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"><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_0_281_Closed_Text">/**/</span><span id="Codehighlighter1_0_281_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">*********************************************************************<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;Copyright&nbsp;(C)&nbsp;2008&nbsp;-&nbsp;&nbsp;-&nbsp;All&nbsp;Rights&nbsp;Reserved<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOCP.cpp<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;摘&nbsp;&nbsp;&nbsp;&nbsp;要:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOCP包裹类<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;作&nbsp;&nbsp;&nbsp;&nbsp;者:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yanglinbo,&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;修&nbsp;&nbsp;&nbsp;&nbsp;改:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;查看文件最下方.<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />*&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" />**********************************************************************</span><span style="color: #008000">*/</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" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">StdAfx.h</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />#include&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">IOCP.h</span><span style="color: #000000">"</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" /><br /><img id="Codehighlighter1_359_366_Open_Image" onclick="this.style.display='none'; Codehighlighter1_359_366_Open_Text.style.display='none'; Codehighlighter1_359_366_Closed_Image.style.display='inline'; Codehighlighter1_359_366_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_359_366_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_359_366_Closed_Text.style.display='none'; Codehighlighter1_359_366_Open_Image.style.display='inline'; Codehighlighter1_359_366_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">CIOCP::CIOCP(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nMaxConcurrency&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_359_366_Closed_Text">/**/</span><span id="Codehighlighter1_359_366_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">=&nbsp;-1</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;)<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" />:&nbsp;m_hIOCP(INVALID_HANDLE_VALUE)<br /><img id="Codehighlighter1_402_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_402_465_Open_Text.style.display='none'; Codehighlighter1_402_465_Closed_Image.style.display='inline'; Codehighlighter1_402_465_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_402_465_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_402_465_Closed_Text.style.display='none'; Codehighlighter1_402_465_Open_Image.style.display='inline'; Codehighlighter1_402_465_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_402_465_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_402_465_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(nMaxConcurrency&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)<br /><img id="Codehighlighter1_433_463_Open_Image" onclick="this.style.display='none'; Codehighlighter1_433_463_Open_Text.style.display='none'; Codehighlighter1_433_463_Closed_Image.style.display='inline'; Codehighlighter1_433_463_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="display: none" id="Codehighlighter1_433_463_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_433_463_Closed_Text.style.display='none'; Codehighlighter1_433_463_Open_Image.style.display='inline'; Codehighlighter1_433_463_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&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_433_463_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_433_463_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create(nMaxConcurrency);<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></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" />CIOCP::</span><span style="color: #000000">~</span><span style="color: #000000">CIOCP(&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;)<br /><img id="Codehighlighter1_490_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_490_504_Open_Text.style.display='none'; Codehighlighter1_490_504_Closed_Image.style.display='inline'; Codehighlighter1_490_504_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_490_504_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_490_504_Closed_Text.style.display='none'; Codehighlighter1_490_504_Open_Image.style.display='inline'; Codehighlighter1_490_504_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_490_504_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_490_504_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;Destroy();<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" />CIOCP</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;CIOCP::</span><span style="color: #0000ff">operator</span><span style="color: #000000">=</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;CIOCP</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;rht&nbsp;)<br /><img id="Codehighlighter1_551_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_551_592_Open_Text.style.display='none'; Codehighlighter1_551_592_Closed_Image.style.display='inline'; Codehighlighter1_551_592_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_551_592_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_551_592_Closed_Text.style.display='none'; Codehighlighter1_551_592_Open_Image.style.display='inline'; Codehighlighter1_551_592_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_551_592_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_551_592_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m_hIOCP&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rht.m_hIOCP;<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">*</span><span style="color: #0000ff">this</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" />CIOCP</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;CIOCP::</span><span style="color: #0000ff">operator</span><span style="color: #000000">=</span><span style="color: #000000">(&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;HANDLE</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;rht&nbsp;)<br /><img id="Codehighlighter1_640_673_Open_Image" onclick="this.style.display='none'; Codehighlighter1_640_673_Open_Text.style.display='none'; Codehighlighter1_640_673_Closed_Image.style.display='inline'; Codehighlighter1_640_673_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_640_673_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_640_673_Closed_Text.style.display='none'; Codehighlighter1_640_673_Open_Image.style.display='inline'; Codehighlighter1_640_673_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_640_673_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_640_673_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m_hIOCP&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rht;<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">*</span><span style="color: #0000ff">this</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" />CIOCP::</span><span style="color: #0000ff">operator</span><span style="color: #000000">&nbsp;HANDLE()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img id="Codehighlighter1_707_758_Open_Image" onclick="this.style.display='none'; Codehighlighter1_707_758_Open_Text.style.display='none'; Codehighlighter1_707_758_Closed_Image.style.display='inline'; Codehighlighter1_707_758_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_707_758_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_707_758_Closed_Text.style.display='none'; Codehighlighter1_707_758_Open_Image.style.display='inline'; Codehighlighter1_707_758_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_707_758_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_707_758_Open_Text"><span style="color: #000000">{<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;(HANDLE)(</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;NULL&nbsp;:&nbsp;m_hIOCP);<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" />BOOL&nbsp;CIOCP::Create(&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;nMaxConcurrency&nbsp;)<br /><img id="Codehighlighter1_803_929_Open_Image" onclick="this.style.display='none'; Codehighlighter1_803_929_Open_Text.style.display='none'; Codehighlighter1_803_929_Closed_Image.style.display='inline'; Codehighlighter1_803_929_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_803_929_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_803_929_Closed_Text.style.display='none'; Codehighlighter1_803_929_Open_Image.style.display='inline'; Codehighlighter1_803_929_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_803_929_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_803_929_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m_hIOCP&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;::CreateIoCompletionPort(INVALID_HANDLE_VALUE,&nbsp;NULL,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;nMaxConcurrency);<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(IsValid());<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;IsValid();<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" />BOOL&nbsp;CIOCP::Destroy()<br /><img id="Codehighlighter1_954_1086_Open_Image" onclick="this.style.display='none'; Codehighlighter1_954_1086_Open_Text.style.display='none'; Codehighlighter1_954_1086_Closed_Image.style.display='inline'; Codehighlighter1_954_1086_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_954_1086_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_954_1086_Closed_Text.style.display='none'; Codehighlighter1_954_1086_Open_Image.style.display='inline'; Codehighlighter1_954_1086_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_954_1086_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_954_1086_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(IsValid()&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;FALSE)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;TRUE;<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;BOOL&nbsp;bClosed&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;::CloseHandle(m_hIOCP);<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;m_hIOCP&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;INVALID_HANDLE_VALUE;<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;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bClosed;<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" />BOOL&nbsp;CIOCP::AssociateSocket(&nbsp;SOCKET&nbsp;socket,&nbsp;ULONG_PTR&nbsp;CompKey&nbsp;)<br /><img id="Codehighlighter1_1153_1291_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1153_1291_Open_Text.style.display='none'; Codehighlighter1_1153_1291_Closed_Image.style.display='inline'; Codehighlighter1_1153_1291_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1153_1291_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1153_1291_Closed_Text.style.display='none'; Codehighlighter1_1153_1291_Open_Image.style.display='inline'; Codehighlighter1_1153_1291_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_1153_1291_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1153_1291_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(IsValid());<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;IsValid()&nbsp;== FALSE )&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<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;(::CreateIoCompletionPort((HANDLE)socket,&nbsp;m_hIOCP,&nbsp;CompKey,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;m_hIOCP);<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 id="Codehighlighter1_1354_1360_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1354_1360_Open_Text.style.display='none'; Codehighlighter1_1354_1360_Closed_Image.style.display='inline'; Codehighlighter1_1354_1360_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1354_1360_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1354_1360_Closed_Text.style.display='none'; Codehighlighter1_1354_1360_Open_Image.style.display='inline'; Codehighlighter1_1354_1360_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">BOOL&nbsp;CIOCP::PostStatus(&nbsp;ULONG_PTR&nbsp;CompKey,&nbsp;DWORD&nbsp;dwNumBytes&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_1354_1360_Closed_Text">/**/</span><span id="Codehighlighter1_1354_1360_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">=&nbsp;0</span><span style="color: #008000">*/</span></span><span style="color: #000000">,&nbsp;OVERLAPPED</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;po&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_1378_1387_Closed_Text">/**/</span><span id="Codehighlighter1_1378_1387_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">=&nbsp;NULL</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;)<br /><img id="Codehighlighter1_1391_1517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1391_1517_Open_Text.style.display='none'; Codehighlighter1_1391_1517_Closed_Image.style.display='inline'; Codehighlighter1_1391_1517_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1391_1517_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1391_1517_Closed_Text.style.display='none'; Codehighlighter1_1391_1517_Open_Image.style.display='inline'; Codehighlighter1_1391_1517_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_1391_1517_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1391_1517_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(IsValid());<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;IsValid()&nbsp;== FALSE&nbsp;)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<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;::PostQueuedCompletionStatus(m_hIOCP,&nbsp;dwNumBytes,&nbsp;CompKey,&nbsp;po);<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 id="Codehighlighter1_1623_1636_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1623_1636_Open_Text.style.display='none'; Codehighlighter1_1623_1636_Closed_Image.style.display='inline'; Codehighlighter1_1623_1636_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1623_1636_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1623_1636_Closed_Text.style.display='none'; Codehighlighter1_1623_1636_Open_Image.style.display='inline'; Codehighlighter1_1623_1636_Open_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">BOOL&nbsp;CIOCP::GetStatus(&nbsp;ULONG_PTR</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pCompKey,&nbsp;PDWORD&nbsp;pdwNumBytes,&nbsp;OVERLAPPED</span><span style="color: #000000">**</span><span style="color: #000000">&nbsp;ppo,&nbsp;DWORD&nbsp;dwMilliseconds&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_1623_1636_Closed_Text">/**/</span><span id="Codehighlighter1_1623_1636_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">=&nbsp;INFINITE</span><span style="color: #008000">*/</span></span><span style="color: #000000">&nbsp;)<br /><img id="Codehighlighter1_1640_1784_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1640_1784_Open_Text.style.display='none'; Codehighlighter1_1640_1784_Closed_Image.style.display='inline'; Codehighlighter1_1640_1784_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1640_1784_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1640_1784_Closed_Text.style.display='none'; Codehighlighter1_1640_1784_Open_Image.style.display='inline'; Codehighlighter1_1640_1784_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_1640_1784_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1640_1784_Open_Text"><span style="color: #000000">{<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(IsValid());<br /><img alt="" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;IsValid()&nbsp;== FALSE&nbsp;)&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;FALSE;<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;::GetQueuedCompletionStatus(m_hIOCP,&nbsp;pdwNumBytes,&nbsp;pCompKey,&nbsp;ppo,&nbsp;dwMilliseconds);<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" />BOOL&nbsp;CIOCP::IsValid()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img id="Codehighlighter1_1815_1881_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1815_1881_Open_Text.style.display='none'; Codehighlighter1_1815_1881_Closed_Image.style.display='inline'; Codehighlighter1_1815_1881_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_1815_1881_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1815_1881_Closed_Text.style.display='none'; Codehighlighter1_1815_1881_Open_Image.style.display='inline'; Codehighlighter1_1815_1881_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_1815_1881_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_1815_1881_Open_Text"><span style="color: #000000">{<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;(m_hIOCP&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;NULL)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;(m_hIOCP&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;INVALID_HANDLE_VALUE);<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" /></span></div><img src ="http://www.cppblog.com/tx7do/aggbug/183777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-07-16 18:38 <a href="http://www.cppblog.com/tx7do/archive/2012/07/16/183777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自绘CListCtrl防止闪烁的方法</title><link>http://www.cppblog.com/tx7do/archive/2012/01/13/164085.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Thu, 12 Jan 2012 16:16:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2012/01/13/164085.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/164085.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2012/01/13/164085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/164085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/164085.html</trackback:ping><description><![CDATA[<strong style="color: red">转载自：</strong><a style="color: red" href="http://blog.csdn.net/mynamelj/article/details/6571383"><strong>http://blog.csdn.net/mynamelj/article/details/6571383</strong></a><br /><br /><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">
<p>自绘控件中经常会遇到闪烁的问题，主要原因是某个区域发生了重复性的绘制而导致的，而列表控件在自绘后闪烁原因是<strong>WM_ERASEBKGND</strong>消息所导致的。解决定办法可以将这个消息屏蔽掉，然后使用双缓存，在Windows 5.1版本以后可以使用<a style="color: rgb(51,102,153); text-decoration: none" name="LVS_EX_DOUBLEBUFFER"><strong>LVS_EX_DOUBLEBUFFER</strong></a>样式，为了各个版本的兼容性我个人不建议使用这个样式，因此我们可以拦截WM_PAINT消息来使用我们自已创建的双缓存，具体看代码所示：</p></span><br class="Apple-interchange-newline" /><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">&nbsp;1.屏蔽WM_ERASEBKGND消息 
<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">BOOL&nbsp;CMyListCtrl::OnEraseBkgnd(CDC&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pDC)&nbsp;&nbsp;<br /><img id="Codehighlighter1_44_68_Open_Image" onclick="this.style.display='none'; Codehighlighter1_44_68_Open_Text.style.display='none'; Codehighlighter1_44_68_Closed_Image.style.display='inline'; Codehighlighter1_44_68_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_44_68_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_44_68_Closed_Text.style.display='none'; Codehighlighter1_44_68_Open_Image.style.display='inline'; Codehighlighter1_44_68_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_44_68_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_44_68_Open_Text"><span style="color: #000000">{&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;FALSE;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div></span><br /><span style="text-align: left; widows: 2; text-transform: none; background-color: rgb(255,255,255); text-indent: 0px; letter-spacing: normal; font: 14px/26px Arial; white-space: normal; orphans: 2; color: rgb(51,51,51); word-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class="Apple-style-span">2.在WM_PAINT消息中<font color="#333333">使用自已的双缓存</font> 
<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: #0000ff">void</span><span style="color: #000000">&nbsp;CMyListCtrl::OnPaint()&nbsp;&nbsp;<br /><img id="Codehighlighter1_30_1126_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_1126_Open_Text.style.display='none'; Codehighlighter1_30_1126_Closed_Image.style.display='inline'; Codehighlighter1_30_1126_Closed_Text.style.display='inline';" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_30_1126_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_30_1126_Closed_Text.style.display='none'; Codehighlighter1_30_1126_Open_Image.style.display='inline'; Codehighlighter1_30_1126_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_30_1126_Closed_Text"><img alt="" src="http://www.cppblog.com/Images/dot.gif" /></span><span id="Codehighlighter1_30_1126_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CPaintDC&nbsp;dc(</span><span style="color: #0000ff">this</span><span style="color: #000000">);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CRect&nbsp;rcClient,rcClip,rcHeader;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;GetClientRect(</span><span style="color: #000000">&amp;</span><span style="color: #000000">rcClient);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;GetHeaderCtrl()</span><span style="color: #000000">-&gt;</span><span style="color: #000000">GetWindowRect(</span><span style="color: #000000">&amp;</span><span style="color: #000000">rcHeader);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;dc.GetClipBox(</span><span style="color: #000000">&amp;</span><span style="color: #000000">rcClip);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CDC&nbsp;MemDC;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CBitmap&nbsp;MemBitmap,&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">pOldBitmap;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.CreateCompatibleDC(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dc);&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">int</span><span style="color: #000000">&nbsp;nMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MemDC.SetMapMode(dc.GetMapMode());&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemBitmap.CreateCompatibleBitmap(</span><span style="color: #000000">&amp;</span><span style="color: #000000">dc,rcClient.Width(),rcClient.Height());&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;pOldBitmap&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MemDC.SelectObject(</span><span style="color: #000000">&amp;</span><span style="color: #000000">MemBitmap);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.FillSolidRect(</span><span style="color: #000000">&amp;</span><span style="color: #000000">rcClient,GetBkColor());&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;CRgn&nbsp;rgn;&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;rgn.CreateRectRgn(rcClip.left,rcClip.top,rcClip.right,rcClip.bottom);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.SelectClipRgn(</span><span style="color: #000000">&amp;</span><span style="color: #000000">rgn);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;DefWindowProc(WM_PAINT,(WPARAM)MemDC.m_hDC,(LPARAM)</span><span style="color: #000000">0</span><span style="color: #000000">);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.SelectClipRgn(NULL);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&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">if</span><span style="color: #000000">&nbsp;(rcClip.top&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;rcHeader.Height())&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcClip.top&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;rcHeader.Height();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;dc.BitBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),</span><span style="color: #000000">&amp;</span><span style="color: #000000">MemDC,rcClip.left,rcClip.top,SRCCOPY);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.SetMapMode(nMode);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.SelectObject(pOldBitmap);&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemDC.DeleteDC();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;MemBitmap.DeleteObject();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/InBlock.gif" />&nbsp;&nbsp;&nbsp;&nbsp;rgn.DeleteObject();&nbsp;&nbsp;<br /><img alt="" align="top" src="http://www.cppblog.com/images/OutliningIndicators/ExpandedBlockEnd.gif" />}</span></span></div></span><br /><img src ="http://www.cppblog.com/tx7do/aggbug/164085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2012-01-13 00:16 <a href="http://www.cppblog.com/tx7do/archive/2012/01/13/164085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>