﻿<?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++博客-Khan's Notebook    GCC/GNU/Linux Delphi/Window Java/Anywhere-随笔分类-GCC/G++</title><link>http://www.cppblog.com/Khan/category/774.html</link><description>路漫漫，长修远，我们不能没有钱</description><language>zh-cn</language><lastBuildDate>Fri, 01 Apr 2022 02:54:39 GMT</lastBuildDate><pubDate>Fri, 01 Apr 2022 02:54:39 GMT</pubDate><ttl>60</ttl><item><title>Qt for Mac DeveloperId 打包 签名 公证 盖章</title><link>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Fri, 07 Jan 2022 04:14:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/224697.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/224697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/224697.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 以下脚本根据QCreator for mac工程的输出二进制文件 进行打包 部署 签名 上传公证 签章可在工程目录下新建一个 deployed目录, 并将脚本拷贝到该目录下执行, 执行需要root权限支持cmake工程或qmake工程此脚本不含编译部分, 需要自行编译, 编译成功后方可成功执行cd $projectDir &amp;&amp; mkdir deployed&...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/224697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2022-01-07 12:14 <a href="http://www.cppblog.com/Khan/archive/2022/01/07/QCreator_for_mac-codesign-notarization.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QtCreator中如何使用Conan包管理工具</title><link>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 19 Oct 2021 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217838.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217838.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217838.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要点    Conan本身是一个包管理工具, 类似Pyhon的pip, 本身用Python编写    QT 6.0 开始引入Conan插件, 从个人观察来看, 似乎该插件仅仅引入了cmake脚本文件    Conan本身不依赖QtCreator, 可以随意使用, 其他编译环境可以忽略掉本文章所有关于QT的内容, 其他不变一 准备环境, 安装Conan1.1 ...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2021/10/19/217838.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/217838.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-10-19 16:09 <a href="http://www.cppblog.com/Khan/archive/2021/10/19/217838.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 和 windows下 获取主机网卡mac地址</title><link>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 03 Jun 2021 09:42:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/217702.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/217702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/217702.html</trackback:ping><description><![CDATA[<div style="font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; width: 98%; border-bottom: #cccccc 1px solid; word-break: break-all; padding-bottom: 4px; padding-top: 4px; padding-left: 4px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #eeeeee"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;&nbsp;1</span>&nbsp;<span style="color: #000000">#ifndef&nbsp;__EHTERNET_HPP__<br /></span><span style="color: #008080">&nbsp;&nbsp;2</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;__EHTERNET_HPP__</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;3</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;4</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(WIN32)&nbsp;||&nbsp;defined(_WIN32)&nbsp;||&nbsp;defined(__WIN32__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;5</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_WIN32</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;6</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#elif</span><span style="color: #000000">&nbsp;defined(linux)&nbsp;||&nbsp;defined(__linux)&nbsp;||&nbsp;defined(__linux__)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;7</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#define</span><span style="color: #000000">&nbsp;MY_LINUX</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;8</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;&nbsp;9</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;10</span>&nbsp;<span style="color: #000000">#include</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">string</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;11</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;12</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;13</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">winsock2.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;14</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iphlpapi.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;15</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;16</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;17</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;18</span>&nbsp;<span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">socket.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;19</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;linux/if.h&gt;<br /></span><span style="color: #008080">&nbsp;20</span>&nbsp;<span style="color: #008000"></span><span style="color: #008000">//</span><span style="color: #008000">#include&nbsp;&lt;net/if.h&gt;</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;21</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">sys</span><span style="color: #000000">/</span><span style="color: #000000">ioctl.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;22</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;23</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;24</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_WIN32)</span><span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;25</span>&nbsp;<span style="color: #000000">std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;operstatusToStr(IF_OPER_STATUS&nbsp;status){<br /></span><span style="color: #008080">&nbsp;26</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">(status){<br /></span><span style="color: #008080">&nbsp;27</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUp:<br /></span><span style="color: #008080">&nbsp;28</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">up</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDown:<br /></span><span style="color: #008080">&nbsp;30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">down</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusTesting:<br /></span><span style="color: #008080">&nbsp;32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">testing</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusUnknown:<br /></span><span style="color: #008080">&nbsp;34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusDormant:<br /></span><span style="color: #008080">&nbsp;36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">dormant</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusNotPresent:<br /></span><span style="color: #008080">&nbsp;38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">notPresent</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IfOperStatusLowerLayerDown:<br /></span><span style="color: #008080">&nbsp;40</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">sLowerLayerDown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;42</span>&nbsp;<span style="color: #000000">&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: #000000">unknown</span><span style="color: #000000">"</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;43</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">&nbsp;44</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;45</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;46</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;47</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;family&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;AF_UNSPEC;</span><span style="color: #008000">//</span><span style="color: #008000">返回包括&nbsp;IPV4&nbsp;和&nbsp;IPV6&nbsp;地址</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;49</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;flags&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_PREFIX&nbsp;</span><span style="color: #000000">|</span><span style="color: #000000">&nbsp;GAA_FLAG_INCLUDE_GATEWAYS;</span><span style="color: #008000">//</span><span style="color: #008000">包括&nbsp;IPV4&nbsp;，IPV6&nbsp;閘道器</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;50</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ULONG&nbsp;outBufLen&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(IP_ADAPTER_ADDRESSES)&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;52</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;PIP_ADAPTER_ADDRESSES&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;54</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">do</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(IP_ADAPTER_ADDRESSES&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)malloc(outBufLen);<br /></span><span style="color: #008080">&nbsp;58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NULL)<br /></span><span style="color: #008080">&nbsp;59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">&nbsp;60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwRetVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;GetAdaptersAddresses(family,&nbsp;flags,&nbsp;NULL,&nbsp;pAddresses,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">outBufLen);<br /></span><span style="color: #008080">&nbsp;61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW)&nbsp;{<br /></span><span style="color: #008080">&nbsp;62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;free(pAddresses);<br /></span><span style="color: #008080">&nbsp;63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NULL;<br /></span><span style="color: #008080">&nbsp;64</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">&nbsp;65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;ERROR_BUFFER_OVERFLOW);<br /></span><span style="color: #008080">&nbsp;68</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dwRetVal&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;NO_ERROR)&nbsp;{<br /></span><span style="color: #008080">&nbsp;70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pAddresses;<br /></span><span style="color: #008080">&nbsp;71</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(pCurrAddresses)&nbsp;{<br /></span><span style="color: #008080">&nbsp;72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddressLength&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">&nbsp;73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">OperStatus&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;IfOperStatusUp){<br /></span><span style="color: #008080">&nbsp;74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;type[</span><span style="color: #000000">8</span><span style="color: #000000">]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;{</span><span style="color: #000000">0</span><span style="color: #000000">};<br /></span><span style="color: #008080">&nbsp;75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">IfType){&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">网卡类型</span><span style="color: #008000"><br /></span><span style="color: #008080">&nbsp;76</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_ETHERNET:<br /></span><span style="color: #008080">&nbsp;77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">eth</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_PPP:<br /></span><span style="color: #008080">&nbsp;80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">ppp</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;82</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_LOOPBACK:<br /></span><span style="color: #008080">&nbsp;83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">loop</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;85</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MIB_IF_TYPE_SLIP:<br /></span><span style="color: #008080">&nbsp;86</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">atm</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;87</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;88</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;IF_TYPE_IEEE80211:<br /></span><span style="color: #008080">&nbsp;89</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(type,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">wifi</span><span style="color: #000000">"</span><span style="color: #000000">);<br /></span><span style="color: #008080">&nbsp;90</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;91</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;92</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">&nbsp;93</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;acMAC[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">&nbsp;94</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(acMAC,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">1</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;95</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">2</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">3</span><span style="color: #000000">]),<br /></span><span style="color: #008080">&nbsp;96</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">PhysicalAddress[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">&nbsp;97</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;acMAC&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">&nbsp;98</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">&nbsp;99</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">100</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">101</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">102</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCurrAddresses&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pCurrAddresses</span><span style="color: #000000">-&gt;</span><span style="color: #000000">Next;<br /></span><span style="color: #008080">103</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">104</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">105</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br /></span><span style="color: #008080">106</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">107</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">108</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">109</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(pAddresses)&nbsp;free(pAddresses);<br /></span><span style="color: #008080">110</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;ret;<br /></span><span style="color: #008080">111</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">112</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">113</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">114</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#if</span><span style="color: #000000">&nbsp;defined(MY_LINUX)</span><span style="color: #000000"><br /></span><span style="color: #008080">115</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;GetMacByGetAdaptersAddresses(std::</span><span style="color: #0000ff">string</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;macOUT,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;all&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">){<br /></span><span style="color: #008080">116</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sock,&nbsp;if_count,&nbsp;i;<br /></span><span style="color: #008080">117</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf&nbsp;ifc;<br /></span><span style="color: #008080">118</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq&nbsp;ifr[</span><span style="color: #000000">10</span><span style="color: #000000">];<br /></span><span style="color: #008080">119</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;mac[</span><span style="color: #000000">32</span><span style="color: #000000">];<br /></span><span style="color: #008080">120</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">121</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifconf));<br /></span><span style="color: #008080">122</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;sock&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;socket(AF_INET,&nbsp;SOCK_DGRAM,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">);<br /></span><span style="color: #008080">123</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">124</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq);<br /></span><span style="color: #008080">125</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ifc.ifc_buf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)ifr;<br /></span><span style="color: #008080">126</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">127</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取所有网卡信息</span><span style="color: #008000"><br /></span><span style="color: #008080">128</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ioctl(sock,&nbsp;SIOCGIFCONF,&nbsp;(</span><span style="color: #0000ff">char</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">)</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifc);<br /></span><span style="color: #008080">129</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;if_count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ifc.ifc_len&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">sizeof</span><span style="color: #000000">(</span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ifreq));<br /></span><span style="color: #008080">130</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;if_count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">131</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ioctl(sock,&nbsp;SIOCGIFHWADDR,&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">ifr[i])&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)&nbsp;{<br /></span><span style="color: #008080">132</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(all&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;(ifr[i].ifr_flags&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;IFF_RUNNING)&nbsp;){<br /></span><span style="color: #008080">133</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(mac,&nbsp;ifr[i].ifr_hwaddr.sa_data,&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">);<br /></span><span style="color: #008080">134</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf(mac,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">%02X%02X%02X%02X%02X%02X</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">0</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">1</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">2</span><span style="color: #000000">]),<br /></span><span style="color: #008080">135</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">3</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">4</span><span style="color: #000000">]),&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff">char</span><span style="color: #000000">)(mac[</span><span style="color: #000000">5</span><span style="color: #000000">]));<br /></span><span style="color: #008080">136</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;macOUT&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;macOUT&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;mac&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">\n</span><span style="color: #000000">'</span><span style="color: #000000">;<br /></span><span style="color: #008080">137</span>&nbsp;<span style="color: #000000"></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("eth:&nbsp;%s,&nbsp;mac:&nbsp;%02x:%02x:%02x:%02x:%02x:%02x\n",&nbsp;ifr[i].ifr_name,&nbsp;mac[0],&nbsp;mac[1],&nbsp;mac[2],&nbsp;mac[3],&nbsp;mac[4],&nbsp;mac[5]);</span><span style="color: #008000"><br /></span><span style="color: #008080">138</span>&nbsp;<span style="color: #008000"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">139</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">140</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080">141</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /></span><span style="color: #008080">142</span>&nbsp;<span style="color: #000000">}<br /></span><span style="color: #008080">143</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">144</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">145</span>&nbsp;<span style="color: #000000"></span><span style="color: #0000ff">#endif</span><span style="color: #000000"><br /></span><span style="color: #008080">146</span>&nbsp;<span style="color: #000000"><br /></span><span style="color: #008080">147</span>&nbsp;<span style="color: #000000"></span></div><br />调用方式<br /><br /><span style="color: #c0c0c0">&nbsp;&nbsp;&nbsp; </span><span style="color: #800080">std</span>::<span style="color: #800080">string</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>;<pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #00677c">GetMacByGetAdaptersAddresses</span>(<span style="color: #092e64; font-style: italic">macs</span>,<span style="color: #c0c0c0"> </span><span style="color: #808000">true</span>);</pre><pre style="margin: 0px; text-indent: 0px; -qt-block-indent: 0"><span style="color: #c0c0c0">    </span><span style="color: #000080">qDebug</span>()<span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #000080">TIMESTAMP</span><span style="color: #c0c0c0"> </span><span style="color: #00677c">&lt;&lt;</span><span style="color: #c0c0c0"> </span><span style="color: #092e64">macs</span>.<span style="color: #00677c">c_str</span>();</pre><br /><br /><br /><img src ="http://www.cppblog.com/Khan/aggbug/217702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2021-06-03 17:42 <a href="http://www.cppblog.com/Khan/archive/2021/06/03/217702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在 C++ 中实现一个轻量的标记清除 gc 系统(转载)</title><link>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 01 Aug 2019 02:57:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/216620.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/216620.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/216620.html</trackback:ping><description><![CDATA[<div># 在 C++ 中实现一个轻量的标记清除 gc 系统<br /></div><div></div><div>[引用](https://blog.codingnow.com/2010/02/cpp_gc.html)<br /></div><div></div><div></div><div>最近想把 engine 做一个简单 C++ 封装，结合 QT 使用。engine 本身是用纯 C 实现的，大部分应用基于 lua 开发。对对象生命期管理也依赖 lua 的 gc 系统。关于这部分的设计，可以参考我以前写的一篇 为 lua 封装 C 对象的生存期管理问题 。<br /></div><div></div><div>当我们把中间层搬到 C++ 中时，遇到的问题之一就是，C++ 没有原生的 gc 支持。我也曾经写过一个 gc 库。但在特定应用下还不够简洁。这几天过年休息，仔细考虑了一下相关的需求，尝试实现了一个更简单的 gc 框架。不到 200 行代码吧，我直接列在这篇 blog 里。<br /></div><div></div><div>这些尚是一些玩具代码，我花了一天时间来写。有许多考虑不周的地方，以及不完整的功能。但可以阐明一些基本思路。<br /></div><div></div><div>首先我需要一个`标记清除`的 `gc系统`，用来解决`引用记数`不容易解决的`循环引用`问题。它的实现不想比`引用记数`复杂太多，并有相同甚至更高的性能。<br /></div><div></div><div>我不想使用复杂的 template 技术，利用太多的语法糖让使用看起来简单。如果需要让这些 C++ 代码看起来更现代，更有&#8220;品味&#8221;，我想也不是很难的事情。<br /></div><div></div><div>接口和实现希望尽量分离，对用的人少暴露细节。但不拘泥于教条，强求做成类似 COM 那样的通用 ABI 。还是尽量利用 C++ 语言本身提供的机制，不滥用。<br /></div><div></div><div>使用尽量简单，不要让使用人员有太大负担。<br /></div><div></div><div>功能满足最低需求即可。代码容易阅读，使用人员可以很快理解原理，不至于误用。也方便日后扩展以适应新的需求。<br /></div><div></div><div>代码如下：</div><div></div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;filename:&nbsp;i_gcobject.h&nbsp;<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.&nbsp;<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; ">&nbsp;<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"&nbsp;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;as&nbsp;listed&nbsp;at&nbsp;.&nbsp;<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;};&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div><div><br /></div><div>所有支持 `gc管理的接口`都继承至 `i_gcobject` ，提供三个方法:<br /></div><div></div><div>* mark 可以把这个对象打上标记，被标记的对象将不会被 collect 回收。</div><div></div><div>* grab 将对象挂接到一个被称呼为 root 的特殊 gcobject 上。</div><div></div><div>* release 将对象从 root 上取掉。<br /></div><div></div><div>另提供 touch 的模板方法供 mark 回调，用来标记同一对象中的不同部分。</div><div></div><div>mark 方法一般在 touch 方法中使用，另外，collect 方法将主动调用 root 的 mark 。<br /></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcholder.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcholder_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">21</span>&nbsp;};<br /><span style="color: #008080; ">22</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div>`i_gcholder` 为 root 的接口，提供 `hold` 和 `unhold` 方法来挂接需要持久保留的 gcobject 。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;i_gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interfacce_gcobject_h<br /><span style="color: #008080; ">13</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;interface&nbsp;struct<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;~i_gcobject()&nbsp;{}<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{}<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release()&nbsp;=&nbsp;0&nbsp;;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;collect();<br /><span style="color: #008080; ">26</span>&nbsp;};<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">#endif</span></div></div><div></div><div></div><div></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.h<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#ifndef&nbsp;gc_object_h<br /><span style="color: #008080; ">12</span>&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;gc_object_h<br /><span style="color: #008080; ">13</span>&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;"i_gcobject.h"<br /><span style="color: #008080; ">15</span>&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcobject&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;marked;<br /><span style="color: #008080; ">18</span>&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;gcobject();<br /><span style="color: #008080; ">21</span>&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;mark();<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;grab();<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;release();<br /><span style="color: #008080; ">25</span>&nbsp;<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_unmarked;<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;};<br /><span style="color: #008080; ">29</span>&nbsp;<span style="color: #0000FF; ">#endif</span><br /><span style="color: #008080; ">30</span>&nbsp;```<br /><span style="color: #008080; ">31</span>&nbsp;<br /><span style="color: #008080; ">32</span>&nbsp;```c++<br /><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcobject.cpp&nbsp;<br /></span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">44</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">45</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">46</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;gc_trigger;<br /><span style="color: #008080; ">49</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;std::vector&lt;gcobject&nbsp;*&gt;&nbsp;gc_pool;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_gcholder&nbsp;*&nbsp;gc_root&nbsp;=&nbsp;i_gcholder::create();<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;gcobject::f_unmarked&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(gcobject&nbsp;*&nbsp;value)&nbsp;{<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unmarked&nbsp;=&nbsp;value-&gt;marked&nbsp;!=&nbsp;gc_trigger;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(unmarked)&nbsp;{<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;value;<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;unmarked;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;};<br /><span style="color: #008080; ">62</span>&nbsp;<br /><span style="color: #008080; ">63</span>&nbsp;gcobject::gcobject()&nbsp;:&nbsp;marked(!gc_trigger)&nbsp;{<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;gc_pool.push_back(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">65</span>&nbsp;}<br /><span style="color: #008080; ">66</span>&nbsp;<br /><span style="color: #008080; ">67</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::mark()&nbsp;{<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(marked&nbsp;!=&nbsp;gc_trigger)&nbsp;{<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marked&nbsp;=&nbsp;gc_trigger;<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;touch();<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">72</span>&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;<br /><span style="color: #008080; ">74</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::grab(){<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;hold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">76</span>&nbsp;}<br /><span style="color: #008080; ">77</span>&nbsp;<br /><span style="color: #008080; ">78</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcobject::release(){<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;unhold(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">80</span>&nbsp;}<br /><span style="color: #008080; ">81</span>&nbsp;<br /><span style="color: #008080; ">82</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;i_gcobject::collect()&nbsp;{<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;gc_root-&gt;mark();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;gc_pool.erase(remove_if(gc_pool.begin(),&nbsp;gc_pool.end()&nbsp;,&nbsp;gcobject::f_unmarked()),&nbsp;gc_pool.end());<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;gc_trigger&nbsp;=&nbsp;!gc_trigger;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div></div><div></div><div></div><div>gcobject 为具体的 gc 实现，实现了 `mark` 、`grab`、`release` 和 `collect` 方法。</div><div></div><div>`mark` 采用的直接向一 bool 变量设置标记。这个标记利用了 `trigger` 这个乒乓开关，每次 `collect` 都会切换状态。</div><div></div><div>`grab` 和 `release` 可以把对象挂接到 root 上，或从上取掉。</div><div></div><div>`collect` 会主动从 root 开始 `mark` ，并释放那些没有 `mark` 的对象。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;gcholder.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;"i_gcholder.h"<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;vector&gt;<br /><span style="color: #008080; ">14</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">15</span>&nbsp;#include&nbsp;&lt;cassert&gt;<br /><span style="color: #008080; ">16</span>&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;gcholder&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcholder,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;hold_set;<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;&nbsp;unhold_set;<br /><span style="color: #008080; ">20</span>&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;set_changed;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;hold_set_sorted;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">bool</span>&nbsp;unhold_set_sorted;<br /><span style="color: #008080; ">24</span>&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;combine_set();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch();<br /><span style="color: #008080; ">27</span>&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;hold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.push_back(obj);<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">33</span>&nbsp;<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unhold(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.push_back(obj);<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">39</span>&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(i_gcobject&nbsp;*obj)&nbsp;{<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj-&gt;mark();<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">45</span>&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">47</span>&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;gcholder()&nbsp;:&nbsp;&nbsp;set_changed(<span style="color: #0000FF; ">false</span>),&nbsp;&nbsp;hold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;,&nbsp;&nbsp;unhold_set_sorted(<span style="color: #0000FF; ">true</span>)&nbsp;{&nbsp;&nbsp;}<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;};<br /><span style="color: #008080; ">51</span>&nbsp;<br /><span style="color: #008080; ">52</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::combine_set(){<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!hold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(hold_set.begin(),hold_set.end());<br /><span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set_sorted)&nbsp;{<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::sort(unhold_set.begin(),unhold_set.end());<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set_sorted&nbsp;=&nbsp;<span style="color: #0000FF; ">true</span>;<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!unhold_set.empty())&nbsp;{<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter1&nbsp;=&nbsp;hold_set.begin();<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::vector&lt;i_gcobject&nbsp;*&gt;::iterator&nbsp;iter2&nbsp;=&nbsp;unhold_set.begin();<br /><span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;(iter1&nbsp;!=&nbsp;hold_set.end()&nbsp;&amp;&amp;&nbsp;iter2&nbsp;!=&nbsp;unhold_set.end())&nbsp;{<br /><span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(*iter1&nbsp;==&nbsp;*iter2)&nbsp;{<br /><span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*iter1&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter2;<br /><span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(*iter1&nbsp;&lt;&nbsp;*iter2);<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++iter1;<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i_gcobject&nbsp;*&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hold_set.erase(std::remove(hold_set.begin(),hold_set.end(),<span style="color: #0000FF; ">null</span>)&nbsp;,&nbsp;hold_set.end());<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unhold_set.clear();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">78</span>&nbsp;}<br /><span style="color: #008080; ">79</span>&nbsp;<br /><span style="color: #008080; ">80</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;gcholder::touch(){<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(set_changed)&nbsp;{<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;combine_set();<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_changed&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;std::for_each(hold_set.begin(),&nbsp;hold_set.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">86</span>&nbsp;}<br /><span style="color: #008080; ">87</span>&nbsp;<br /><span style="color: #008080; ">88</span>&nbsp;i_gcholder&nbsp;*&nbsp;i_gcholder::create(){<br /><span style="color: #008080; ">89</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;gcholder;<br /><span style="color: #008080; ">90</span>&nbsp;}</div></div><div></div><div></div><br /><br /><div></div><div></div><div></div><div>gcholder 理论上可以有多个实例，并相互挂接。（否则不需要继承至 i_gcobject ）这个设计可以用来模拟多级的堆栈。但实际上并不需要这么复杂。因为在大部分应用里，如果你的程序有一个周期性的主循环，就可以不在 gc 系统里模拟出一个多级的堆栈。我们只用在循环之外做 collect 即可。再堆栈调用的较深层次触发 collect 反而效果不佳，会导致许多临时 gc 对象无法回收。</div><div></div><div>最后来看一个玩具代码，用 stl 里的 mutliset 实现了一个简单的树接口。可能没有什么使用价值，但它演示了一个较复杂的对象相互引用的关系。并可以展示 gc 如何正确工作。</div><div></div><div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;&nbsp;filename:&nbsp;test.cpp<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2010&nbsp;,<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cloud&nbsp;Wu&nbsp;.&nbsp;All&nbsp;rights&nbsp;reserved.<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.codingnow.com</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;*<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;Use,&nbsp;modification&nbsp;and&nbsp;distribution&nbsp;are&nbsp;subject&nbsp;to&nbsp;the&nbsp;"New&nbsp;BSD&nbsp;License"<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;*&nbsp;&nbsp;as&nbsp;listed&nbsp;at&nbsp;&lt;url:&nbsp;</span><span style="color: #008000; text-decoration-line: underline;">http://www.opensource.org/licenses/bsd-license.php</span><span style="color: #008000; ">&nbsp;&gt;.<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">10</span>&nbsp;#include&nbsp;"gcobject.h"<br /><span style="color: #008080; ">11</span>&nbsp;#include&nbsp;&lt;cstdio&gt;<br /><span style="color: #008080; ">12</span>&nbsp;#include&nbsp;&lt;<span style="color: #0000FF; ">set</span>&gt;<br /><span style="color: #008080; ">13</span>&nbsp;#include&nbsp;&lt;algorithm&gt;<br /><span style="color: #008080; ">14</span>&nbsp;<br /><span style="color: #008080; ">15</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;i_tree&nbsp;:&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_gcobject&nbsp;{<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*p)&nbsp;=&nbsp;0;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;i_tree&nbsp;*&nbsp;create();<br /><span style="color: #008080; ">18</span>&nbsp;};<br /><span style="color: #008080; ">19</span>&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;tree&nbsp;:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;i_tree&nbsp;,&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;gcobject&nbsp;{<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;tree&nbsp;*parent;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;std::multiset&lt;tree&nbsp;*&gt;&nbsp;children;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;f_mark&nbsp;{<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;<span style="color: #0000FF; ">operator</span>()&nbsp;(tree&nbsp;*node)&nbsp;{<br /><span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node-&gt;mark();<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;};<br /><span style="color: #008080; ">28</span>&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;touch()&nbsp;{<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)<br /><span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;mark();<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::for_each(children.begin(),&nbsp;children.end(),&nbsp;f_mark());<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">34</span>&nbsp;<br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;unlink();<br /><span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">virtual</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;link(i_tree&nbsp;*parent);<br /><span style="color: #008080; ">37</span>&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000FF; ">public</span>:<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;tree()&nbsp;:&nbsp;parent(NULL)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("create&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">42</span>&nbsp;<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;~tree()&nbsp;{<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("release&nbsp;node&nbsp;%p\n",<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;};<br /><span style="color: #008080; ">48</span>&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;<br /><span style="color: #008080; ">50</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::unlink()&nbsp;{<br /><span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(parent)&nbsp;{<br /><span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent-&gt;children.erase(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;NULL;<br /><span style="color: #008080; ">54</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">55</span>&nbsp;}<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;tree::link(i_tree&nbsp;*p){<br /><span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;unlink();<br /><span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(p)&nbsp;{<br /><span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree&nbsp;*&nbsp;cp&nbsp;=&nbsp;dynamic_cast&lt;tree&nbsp;*&gt;(p);<br /><span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp-&gt;children.insert(<span style="color: #0000FF; ">this</span>);<br /><span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent&nbsp;=&nbsp;cp;<br /><span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">64</span>&nbsp;}<br /><span style="color: #008080; ">65</span>&nbsp;<br /><span style="color: #008080; ">66</span>&nbsp;i_tree&nbsp;*i_tree::create(){<br /><span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;tree;<br /><span style="color: #008080; ">68</span>&nbsp;}<br /><span style="color: #008080; ">69</span>&nbsp;<br /><span style="color: #008080; ">70</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(){<br /><span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*root&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;root-&gt;grab();<br /><span style="color: #008080; ">73</span>&nbsp;&nbsp;&nbsp;i_tree&nbsp;*node;<br /><span style="color: #008080; ">74</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;i_tree::create();<br /><span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;node-&gt;link(root);<br /><span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">79</span>&nbsp;&nbsp;&nbsp;printf("collected\n");<br /><span style="color: #008080; ">80</span>&nbsp;&nbsp;&nbsp;node-&gt;link(NULL);<br /><span style="color: #008080; ">81</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">82</span>&nbsp;&nbsp;&nbsp;printf("finalize\n");<br /><span style="color: #008080; ">83</span>&nbsp;&nbsp;&nbsp;root-&gt;release();<br /><span style="color: #008080; ">84</span>&nbsp;&nbsp;&nbsp;i_gcobject::collect();<br /><span style="color: #008080; ">85</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;0;<br /><span style="color: #008080; ">86</span>&nbsp;}</div></div><div></div><div></div><div>我们在实现一个基于 gc 的对象时，可以先定义出需要的接口，让接口从 i_gcobject 继承。例如上例中的 i_tree 。</div><div></div><div>然后在实现这个接口时，可以虚继承 gcobject 。例如上例中的 tree 。</div><div></div><div>如果有需要，就重载 touch 方法，在 touch 方法中 mark 相关的 gcobject 。对于 tree 这个例子，就是调用父亲和孩子节点的 mark 。</div><div></div><div>对象依然可以写析构函数，相当于对象的 finalize 。在析构函数中，不要再释放和它相关的 gcobject ，那些留给 gc 系统去完成。（例如在 tree 里，就不要在 ~tree 中 delete children 容器中的变量，也不需要把自己从父亲节点上摘掉）</div><div></div><div>如果仅仅只是使用那些接口，则不需要再包含 gcobject.h ，因为 gcobject 的细节只供实现 i_gcobject 时使用。</div><img src ="http://www.cppblog.com/Khan/aggbug/216620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2019-08-01 10:57 <a href="http://www.cppblog.com/Khan/archive/2019/08/01/GC_System_for_Cpp.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost的lexical_cast --数据类型转</title><link>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sat, 14 Oct 2017 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/215297.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2017/10/14/215297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/215297.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/215297.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 注:转载请保证文章完整性一、介绍lexical_cast是boost中一个非常有用，常用，好用的库，我现在的小数据转换用的都是lexical_cast。&nbsp;lexical_cast最大的特点是安全，包括长度安全，类型安全。 下面我来介绍下lexical_cast的基本使用方法。Target lexical_cast(Source arg)例如:#include &lt;boost/le...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2017/10/14/215297.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/215297.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2017-10-14 16:26 <a href="http://www.cppblog.com/Khan/archive/2017/10/14/215297.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>boost中asio网络库多线程并发处理实现，以及asio在多线程模型中线程的调度情况和线程安全。 (转载)</title><link>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sat, 14 Oct 2017 03:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/215295.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2017/10/14/215295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/215295.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/215295.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自(http://www.cnblogs.com/lidabo/p/3906055.html)1、实现多线程方法： &nbsp;&nbsp;&nbsp; 其实就是多个线程同时调用io_service::run 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2017/10/14/215295.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/215295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2017-10-14 11:44 <a href="http://www.cppblog.com/Khan/archive/2017/10/14/215295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++11 中值得关注的几大变化</title><link>http://www.cppblog.com/Khan/archive/2014/06/04/207186.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Wed, 04 Jun 2014 04:32:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2014/06/04/207186.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/207186.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2014/06/04/207186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/207186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/207186.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转载自: http://coolshell.cn/articles/5265.html源文章来自前C++标准委员会的&nbsp;Danny Kalev&nbsp;的&nbsp;The Biggest Changes in C++11 (and Why You Should Care)，赖勇浩做了一个中文翻译在这里。所以，我就不翻译了，我在这里仅对文中提到的这些变化&#8220;追问为什么要引入这些...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2014/06/04/207186.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/207186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2014-06-04 12:32 <a href="http://www.cppblog.com/Khan/archive/2014/06/04/207186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++开发者都应该使用的10个C++11特性</title><link>http://www.cppblog.com/Khan/archive/2014/06/04/207185.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Wed, 04 Jun 2014 04:30:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2014/06/04/207185.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/207185.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2014/06/04/207185.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/207185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/207185.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文由&nbsp;伯乐在线&nbsp;-&nbsp;治不好你我就不是兽医&nbsp;翻译自&nbsp;Marius Bancila。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。【感谢冯上（@治不好你我就不是兽医&nbsp;）的热心翻译。如果其他朋友也有不错的原创或译文，可以尝试推荐给伯乐在线。】&nbsp;在C++11新标准中，语言本身和标准库都增加了很多新内容，本文只涉及了一些皮毛。不过我...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2014/06/04/207185.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/207185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2014-06-04 12:30 <a href="http://www.cppblog.com/Khan/archive/2014/06/04/207185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下播放器设计和开发</title><link>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 24 Mar 2013 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198767.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/03/24/198767.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198767.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198767.html</trackback:ping><description><![CDATA[<div>播放器设计与开发 &nbsp;</div><div></div><div>转载自http://hi.baidu.com/zhaozequan</div><div>kf701.ye@gmail.com 2008</div><div></div><div></div><div>本文根据DawnLightPlayer的开发经验写成。DawnLithtPlayer是今天3月份开始,和maddrone一起在业余时间开发的一个跨平台，多线程的播放器,主要是在Linux下面开发的,文中所用示例代码均截自其中。</div><div>DawnLightPlayer目前可以运行在Linux和Windows系统上，并使用VC和Python开发了GUI，支持大部分的音视频文件格式和网络流，另外新增对CMMB协议的支持,不支持 RMVB, SWF 等尚未公开协议的视频文件格式。</div><div></div><div>目录:</div><div>一. 播放器的流程</div><div>&nbsp; &nbsp;1. 输入</div><div>&nbsp; &nbsp;2. 解码</div><div>&nbsp; &nbsp;3. 输出</div><div>二. 播放器的实现</div><div>&nbsp; &nbsp;1. 输入实现</div><div>&nbsp; &nbsp;2. 解码线程实现</div><div>&nbsp; &nbsp;3. 输出线程实现</div><div>三. 视频输出库</div><div>&nbsp; &nbsp;1. SDL (多平台,支持硬件缩放)</div><div>&nbsp; &nbsp;2. DirectX DirectDraw (win32平台,支持硬件缩放)</div><div>&nbsp; &nbsp;3. OpenGL (多平台,支持硬件缩放)</div><div>&nbsp; &nbsp;4. X11 (Linux/Unix)</div><div>&nbsp; &nbsp;5. FrameBuffer (Linux, 无硬件缩放)</div><div>四. 音频输出</div><div>&nbsp; &nbsp;1. OSS (Open Sound System for Linux)</div><div>&nbsp; &nbsp;2. ALSA (Advanced Linux Sound Architecture)</div><div>&nbsp; &nbsp;3. DirectSound (WIN32)</div><div>五. 音视频同步</div><div>&nbsp; &nbsp;1. 以音频为基准同步视频</div><div>&nbsp; &nbsp;2. 以视频为基准同步音频</div><div>&nbsp; &nbsp;3. 同步于一个外部时钟</div><div>六. 截图</div><div>&nbsp; &nbsp;1. 使用jpeglib保存成jpeg文件</div><div>&nbsp; &nbsp;2. 使用libpng保存成png文件</div><div>七. YUV RGB 软件转换</div><div>八. 软件缩放</div><div></div><div></div><div></div><div>一. 播放器的流程</div><div></div><div>1. 输入 : 从文件或网络等读取原数据，如 x.avi, x.mov, rtsp://xxx, 对原数据进行解析，比如文件，首先要分析文件格式，从文件中取得音视频编码参数，视频时间长度等信息，然后要从其中取出音频编码数据和视频编码数据送到解 码部分，这里暂称这种编码源数据块为 packet。</div><div></div><div>2. 解码 : 初始化时，利用输入端从源数据中取得的信息调用不同的解码库初始化；然后接收输入端传送来的音视频编码数据，分别进行音频解码和视频解码，视频解码出来的 数据一般是 YUV 或 RGB 数据，这里暂称为 picture, 音频解码出来的数据是采样数据，是声卡可以播放的数据，这里暂称为 sample。 解码所得的数据接下来送到输出部分。</div><div></div><div>3. 输出 ： 接收解码部分送来的 picture 和 sample 并显示。 视频显示一般使用某个图形库，如 SDL, Xlib, DirectDraw, OpengGL, FrameBuffer等, 音频输出是把 sample 写入系统的音频驱动，由音频驱动送入声卡播放, 可用的音频输出有 ALSA, OSS, SDL, DirectSound, WaveOut等。</div><div></div><div>二. 播放器的实现</div><div></div><div>推荐实现方案</div><div>一个audio_packet队列，一个video_packet队列,一个picture队列，一个sample队列</div><div>一个input线程，两个decode线程，两个output线程,一个UI控制线程</div><div></div><div>1. 输入实现</div><div>对 文件的解析，首先要了解文件的格式，文件格式一般称为文件容器。公开的文件格式，按格式协议读取分析就可以了，但像RMVB,SWF这种目前还不公开格式 的文件，就不好办，也是目前一般播放器的困难。一般的文件格式的解析libavformat库已经做了，只要使用它就行，下面给出示例代码段:</div><div></div><div>初始化：</div><div>static int avin_file_init(void)</div><div>{</div><div>&nbsp; &nbsp; AVFormatParameters params, *ap = &amp;params;</div><div>&nbsp; &nbsp; err = av_open_input_file( &amp;fmtctx, input_filename, NULL, 0, ap );</div><div>&nbsp; &nbsp; if ( err &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; print_error( input_filename, err );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; fmtctx-&gt;flags |= AVFMT_FLAG_GENPTS;</div><div></div><div>&nbsp; &nbsp; err = av_find_stream_info( fmtctx );</div><div>&nbsp; &nbsp; if ( err &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "%d: init input from file error\n", __LINE__);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; print_error( input_filename, err );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; if (fmtctx-&gt;pb) fmtctx-&gt;pb-&gt;eof_reached = 0;</div><div>&nbsp; &nbsp; dump_format( fmtctx, 0, input_filename, 0 );</div><div></div><div>&nbsp; &nbsp; ....</div><div>}</div><div>读取packet:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; AVPacket *pkt = NULL;</div><div>&nbsp; &nbsp; pkt = av_malloc( sizeof(AVPacket) );</div><div>&nbsp; &nbsp; ret = av_read_frame(fmtctx, pkt);</div><div>&nbsp; &nbsp;&nbsp;</div><div>送出packet到解码部分:</div><div>&nbsp; &nbsp; 可以memcpy, 或用LinkList结构处理,如:</div><div>&nbsp; &nbsp; push_to_video_packet_queue(pkt);</div><div>}</div><div></div><div>如果是自己的私有输入，比如移动电视的视频输入,代码如下,部分是伪代码:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; your_parse_code();</div><div>&nbsp; &nbsp; size = your_get_video_data(buf);</div><div></div><div>&nbsp; &nbsp; pkt = av_mallocz( sizeof(AVPacket) );</div><div>&nbsp; &nbsp; x = av_new_packet( pkt, vret);</div><div>&nbsp; &nbsp; memcpy( pkt-&gt;data, buf, size );</div><div>&nbsp; &nbsp; pkt-&gt;pts = your_time;</div><div></div><div>&nbsp; &nbsp; push_to_video_packet_queue(pkt);</div><div>}</div><div></div><div>2. 解码线程实现</div><div>解码是个算法大课题，大多只能使用已有的解码库，如libavcodec,下面示例代码:</div><div>while ( 1 )</div><div>{</div><div>&nbsp; &nbsp; AVPicture *picture;</div><div>&nbsp; &nbsp; AVPacket *pkt = pop_from_video_packet_queue();</div><div>&nbsp; &nbsp; AVFrame *frame = avcodec_alloc_frame();</div><div>&nbsp; &nbsp; avcodec_decode_video(video_ctxp, frame, &amp;got_picture, pkt-&gt;data, pkt-&gt;size);</div><div>&nbsp; &nbsp; if ( got_picture )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; convert_frame_to_picture( picture, frame );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; picture-&gt;pts = pkt-&gt;pts;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; push_to_picture_queue( picture );</div><div>&nbsp; &nbsp; }</div><div>}</div><div>音频雷同</div><div></div><div>3. 输出线程实现</div><div></div><div>视 频输出要控制FPS，比如25帧每秒的视频，那么每一帧的显示时间要是1/25秒，但把一帧RGB数据写入显存用不了1/25秒的时间，那么就要控制，不 能让25帧的数据在0.1或0.2秒的时间内就显示完了，最简单的实现是在每显示一帧数据后，sleep( 1/fps - 显示用去的时间 )。</div><div></div><div>音 视频同步这个重要的工作也要在输出线程里完成。以音频为基准同步视频，以视频为基准同步音频，或与一个外部时钟同步，都是可行的方法，但以音频为基准同步 视频是最简单也最有效的方法。音频驱动只要设置好sample rate, sample size 和 channels 后， write 数据就会以此恒定的速度播放， 如果驱动的输出 buffer 满，则 write 就可以等待。</div><div></div><div>视频:</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; picture = pop_from_picture_queue();</div><div>&nbsp; &nbsp; picture_shot( picture ); /* 截图 */</div><div>&nbsp; &nbsp; vo-&gt;display( picture );</div><div>&nbsp; &nbsp; video_pts = picture-&gt;pts;</div><div>&nbsp; &nbsp; sync_with_audio(); /* 同步 */</div><div>&nbsp; &nbsp; control_fps(); /* FPS */</div><div>}</div><div>音频：</div><div>while( 1 )</div><div>{</div><div>&nbsp; &nbsp; sample = pop_from_sample_queue();</div><div>&nbsp; &nbsp; ao-&gt;play( sample );</div><div>&nbsp; &nbsp; now_pts = sample-&gt;pts;</div><div>}</div><div></div><div>三. 视频输出库</div><div></div><div>1. SDL (多平台,支持硬件缩放)</div><div></div><div>SDL(Simple DirectMedia Layer) is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer.</div><div></div><div>其实SDL就是一个中间件，它封装了下层的OpenGL, FrameBuffer, X11, DirectX等给上层提供一个统一的API接口，使用SDL的优点是我们不必再为X11或DirectX分别做个视频输出程序了。</div><div></div><div>SDL可以直接显示YUV数据和RGB数据,一般解码得到的picture都是YUV420P格式的,不用做YUV2RGB的转换就可以直接显示,主要代码如下:</div><div></div><div>static int vo_sdl_init(void)</div><div>{</div><div>&nbsp; &nbsp; ....</div><div>&nbsp; &nbsp; screen = SDL_SetVideoMode(ww, wh, 0, flags);</div><div>&nbsp; &nbsp; overlay = SDL_CreateYUVOverlay(dw, dh, SDL_YV12_OVERLAY, screen);</div><div>&nbsp; &nbsp;....</div><div>}</div><div></div><div>static void vo_sdl_display(AVPicture *pict)</div><div>{</div><div>&nbsp; &nbsp; SDL_Rect rect;</div><div>&nbsp; &nbsp; AVPicture p;</div><div></div><div>&nbsp; &nbsp; SDL_LockYUVOverlay(overlay);</div><div>&nbsp; &nbsp; p.data[0] = overlay-&gt;pixels[0];</div><div>&nbsp; &nbsp; p.data[1] = overlay-&gt;pixels[2];</div><div>&nbsp; &nbsp; p.data[2] = overlay-&gt;pixels[1];</div><div>&nbsp; &nbsp; p.linesize[0] = overlay-&gt;pitches[0];</div><div>&nbsp; &nbsp; p.linesize[1] = overlay-&gt;pitches[2];</div><div>&nbsp; &nbsp; p.linesize[2] = overlay-&gt;pitches[1];</div><div>&nbsp; &nbsp; vo_sdl_sws( &amp;p, pict ); /* only do memcpy */</div><div>&nbsp; &nbsp; SDL_UnlockYUVOverlay(overlay);</div><div></div><div>&nbsp; &nbsp; rect.x = dx;</div><div>&nbsp; &nbsp; rect.y = dy;</div><div>&nbsp; &nbsp; rect.w = dw;</div><div>&nbsp; &nbsp; rect.h = dh;</div><div>&nbsp; &nbsp; SDL_DisplayYUVOverlay(overlay, &amp;rect);</div><div>}</div><div></div><div>2. DirectX DirectDraw (win32平台,支持硬件缩放)</div><div></div><div>DirectX是window上使用较多的一种输出,也支持直接YUV或RGB显示，示例代码:</div><div></div><div>static int vo_dx_init(void)</div><div>{</div><div>&nbsp; &nbsp; DxCreateWindow();</div><div>&nbsp; &nbsp; DxInitDirectDraw();</div><div>&nbsp; &nbsp; DxCreatePrimarySurface();</div><div>&nbsp; &nbsp; DxCreateOverlay();</div><div>&nbsp; &nbsp; DetectImgFormat();</div><div>}</div><div></div><div>static void vo_dx_display(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; vfmt2rgb(my_pic, pic);</div><div>&nbsp; &nbsp; memcpy( g_image, my_pic-&gt;data[0], my_pic-&gt;linesize[0] * height );</div><div>&nbsp; &nbsp; flip_page();</div><div>}</div><div></div><div>3. OpenGL (多平台,支持硬件缩放)</div><div></div><div>OpenGL是3D游戏库，跨平台，效率高，支持大多数的显示加速，显示2D RGB数据只要使用glDrawPixels函数就足够了,同时禁用一些OpenGL管线操作效率更高,如:</div><div></div><div>&nbsp; &nbsp; glDisable( GL_SCISSOR_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_ALPHA_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_DEPTH_TEST );</div><div>&nbsp; &nbsp; glDisable( GL_DITHER );</div><div></div><div>4. X11 (Linux/Unix)</div><div></div><div>X11 是Unix/Linux系统平台上的基本图形界面库，像普通的GTK，QT等主要都是建立在X11的基础之上。但X11的API接口太多，复杂，很不利于 开发，基本的GUI程序一般都会使用GTK，QT等，不会直接调用X11的API，这里只是为了效率。MPlyaer的libvo里有X11的完整使用代 码，包括全屏等功能。</div><div></div><div>static void vo_x11_display(AVPicture* pic)</div><div>{</div><div>&nbsp; &nbsp; vfmt2rgb( my_pic, pic );</div><div>&nbsp; &nbsp; Ximg-&gt;data = my_pic-&gt;data[0];</div><div>&nbsp; &nbsp; XPutImage(Xdisplay, Xvowin, Xvogc, Ximg,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, 0, 0, 0, dw, dh);</div><div>&nbsp; &nbsp; XSync(Xdisplay, False);</div><div>&nbsp; &nbsp; XSync(Xdisplay, False);</div><div>}</div><div></div><div>5. FrameBuffer (Linux, 无硬件缩放)</div><div></div><div>FrameBuffer是Linux内核的一部分，提供一个到显存的存取地址的map,但没有任何加速使用。</div><div></div><div>static void vo_fb_display(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; int i;</div><div>&nbsp; &nbsp; uint8_t *src, *dst = fbctxp-&gt;mem;</div><div></div><div>&nbsp; &nbsp; vfmt2rgb( my_pic, pic );</div><div>&nbsp; &nbsp; src = my_pic-&gt;data[0];</div><div></div><div>&nbsp; &nbsp; for ( i = 0; i &lt; fbctxp-&gt;dh; i++ )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; memcpy( dst, src, fbctxp-&gt;dw * (fbctxp-&gt;varinfo.bits_per_pixel / 8) );</div><div>&nbsp; &nbsp; &nbsp; &nbsp; dst += fbctxp-&gt;fixinfo.line_length;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; src += my_pic-&gt;linesize[0];</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>四. 音频输出</div><div></div><div>1. OSS (Open Sound System for Linux)</div><div></div><div>OSS是Linux下面最简单的音频输出了，直接write就可以。</div><div></div><div>static int ao_oss_init(void)</div><div>{</div><div>&nbsp; &nbsp; int i;</div><div>&nbsp; &nbsp; dsp = open(dsp_dev, O_WRONLY);</div><div>&nbsp; &nbsp; if ( dsp &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "open oss: %s\n", strerror(errno));</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return -1;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; i = sample_rate;</div><div>&nbsp; &nbsp; ioctl (dsp, SNDCTL_DSP_SPEED, &amp;i);</div><div>&nbsp; &nbsp; i = format2oss(sample_fmt);</div><div>&nbsp; &nbsp; ioctl(dsp, SNDCTL_DSP_SETFMT, &amp;i);</div><div>&nbsp; &nbsp; i = channels;</div><div>&nbsp; &nbsp; if ( i &gt; 2 ) i = 2;</div><div>&nbsp; &nbsp; ioctl(dsp, SNDCTL_DSP_CHANNELS, &amp;i);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><div>static void ao_oss_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; write(dsp, s-&gt;data, s-&gt;size);</div><div>}</div><div></div><div>2. ALSA (Advanced Linux Sound Architecture)</div><div></div><div>ALSA做的比较失败，长长的函数名。</div><div></div><div>static void ao_alsa_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; int num_frames = s-&gt;size / bytes_per_sample;</div><div>&nbsp; &nbsp; snd_pcm_sframes_t res = 0;</div><div>&nbsp; &nbsp; uint8_t *data = s-&gt;data;</div><div></div><div>&nbsp; &nbsp; if (!alsa_handle)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>&nbsp; &nbsp; if (num_frames == 0)</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>rewrite:</div><div>&nbsp; &nbsp; res = snd_pcm_writei(alsa_handle, data, num_frames);</div><div>&nbsp; &nbsp; if ( res == -EINTR )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; if ( res &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; snd_pcm_prepare(alsa_handle);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if ( res &lt; num_frames )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; data += res * bytes_per_sample;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; num_frames -= res;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; goto rewrite;</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>3. DirectSound (WIN32)</div><div></div><div>MS DirectX的一部分,它的缺点是不如Linux里面的OSS或ALSA那样，在没有sample写入的时候，自动 silent,DirectSound在播放过程中，当没有sample数据送入输出线程时，它总是回放最后0.2或0.5秒的数据。由于只是最近移植 DawnLightPlayer才使用起Windows，不太了解其机制。</div><div></div><div>static void dsound_play(AVSample *s)</div><div>{</div><div>&nbsp; &nbsp; int wlen, ret, len = s-&gt;size;</div><div>&nbsp; &nbsp; uint8_t *data = s-&gt;data;</div><div></div><div>&nbsp; &nbsp; while ( len &gt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; wlen = dsound_getspace();</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( wlen &gt; len ) wlen = len;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; ret = write_buffer(data, wlen);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; data += ret;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; len -= ret;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; usleep(10*1000);</div><div>&nbsp; &nbsp; }</div><div>}</div><div></div><div>五. 音视频同步</div><div></div><div>1. 以音频为基准同步视频</div><div></div><div>视频输出线程中如下处理:</div><div>&nbsp; &nbsp; start_time = now();</div><div>&nbsp; &nbsp; ....</div><div>&nbsp; &nbsp; vo-&gt;display( picture );</div><div>&nbsp; &nbsp; last_video_pts = picture-&gt;pts;</div><div>&nbsp; &nbsp; end_time = now();</div><div>&nbsp; &nbsp; rest_time = end_time - start_time;</div><div>&nbsp; &nbsp; av_diff = last_audio_pts - last_video_pts;</div><div>&nbsp; &nbsp; if ( av_diff &gt; 0.2 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( av_diff &lt; 0.5 ) rest_time -= rest_time / 4;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; else rest_time -= rest_time / 2;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; else if ( av_diff &lt; -0.2)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ( av_diff &gt; -0.5 ) rest_time += rest_time / 4;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; else rest_time += rest_time / 2;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; if ( rest_time &gt; 0 )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; usleep(rest_time);</div><div></div><div>2. 以视频为基准同步音频</div><div></div><div></div><div>3. 同步于一个外部时钟</div><div></div><div></div><div></div><div>六. 截图</div><div></div><div>截图可以在解码线程做，也可以在输出线程做，见前面的输出线程部分。只要在display前把picture保存起来即可。一般加一些编码，如保存成 PNG 或 JPEG 格式。</div><div></div><div>1. 使用jpeglib保存成jpeg文件</div><div></div><div>static void draw_jpeg(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; char fname[128];</div><div>&nbsp; &nbsp; struct jpeg_compress_struct cinfo;</div><div>&nbsp; &nbsp; struct jpeg_error_mgr jerr;</div><div>&nbsp; &nbsp; JSAMPROW row_pointer[1];</div><div>&nbsp; &nbsp; int row_stride;</div><div>&nbsp; &nbsp; uint8_t *buffer;</div><div></div><div>&nbsp; &nbsp; if ( !po_status )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div></div><div>&nbsp; &nbsp; vfmt2rgb24(my_pic, pic);</div><div>&nbsp; &nbsp; buffer = my_pic-&gt;data[0];</div><div></div><div>#ifdef __MINGW32__</div><div>&nbsp; &nbsp; sprintf(fname, "%s\\DLPShot-%d.jpg", get_save_path(), framenum++);</div><div>#else</div><div>&nbsp; &nbsp; sprintf(fname, "%s/DLPShot-%d.jpg", get_save_path(), framenum++);</div><div>#endif</div><div>&nbsp; &nbsp; fp = fopen (fname, "wb");</div><div>&nbsp; &nbsp; if (fp == NULL)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "fopen %s error\n", fname);</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return;</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; cinfo.err = jpeg_std_error(&amp;jerr);</div><div>&nbsp; &nbsp; jpeg_create_compress(&amp;cinfo);</div><div>&nbsp; &nbsp; jpeg_stdio_dest(&amp;cinfo, fp);</div><div></div><div>&nbsp; &nbsp; cinfo.image_width = width;</div><div>&nbsp; &nbsp; cinfo.image_height = height;</div><div>&nbsp; &nbsp; cinfo.input_components = 3;</div><div>&nbsp; &nbsp; cinfo.in_color_space = JCS_RGB;</div><div></div><div>&nbsp; &nbsp; jpeg_set_defaults(&amp;cinfo);</div><div>&nbsp; &nbsp; cinfo.write_JFIF_header = TRUE;</div><div>&nbsp; &nbsp; cinfo.JFIF_major_version = 1;</div><div>&nbsp; &nbsp; cinfo.JFIF_minor_version = 2;</div><div>&nbsp; &nbsp; cinfo.density_unit = 1;</div><div>&nbsp; &nbsp; cinfo.X_density = jpeg_dpi * width / width;</div><div>&nbsp; &nbsp; cinfo.Y_density = jpeg_dpi * height / height;</div><div>&nbsp; &nbsp; cinfo.write_Adobe_marker = TRUE;</div><div></div><div>&nbsp; &nbsp; jpeg_set_quality(&amp;cinfo, jpeg_quality, jpeg_baseline);</div><div>&nbsp; &nbsp; cinfo.optimize_coding = jpeg_optimize;</div><div>&nbsp; &nbsp; cinfo.smoothing_factor = jpeg_smooth;</div><div>&nbsp; &nbsp; if ( jpeg_progressive_mode )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; jpeg_simple_progression(&amp;cinfo);</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; jpeg_start_compress(&amp;cinfo, TRUE);</div><div></div><div>&nbsp; &nbsp; row_stride = width * 3;</div><div>&nbsp; &nbsp; while (cinfo.next_scanline &lt; height)</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; row_pointer[0] = &amp;buffer[cinfo.next_scanline * row_stride];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; (void)jpeg_write_scanlines(&amp;cinfo, row_pointer, 1);</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; jpeg_finish_compress(&amp;cinfo);</div><div>&nbsp; &nbsp; fclose(fp);</div><div>&nbsp; &nbsp; jpeg_destroy_compress(&amp;cinfo);</div><div></div><div>&nbsp; &nbsp; return ;</div><div>}</div><div></div><div>2. 使用libpng保存成png文件</div><div></div><div>static void draw_png(AVPicture *pic)</div><div>{</div><div>&nbsp; &nbsp; int k;</div><div>&nbsp; &nbsp; png_byte *row_pointers[height]; /* GCC C99 */</div><div></div><div>&nbsp; &nbsp; if ( init_png() &lt; 0 )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; av_log(NULL, AV_LOG_ERROR, "draw_png: init png error\n");</div><div>&nbsp; &nbsp; &nbsp; &nbsp; return ;</div><div>&nbsp; &nbsp; }</div><div></div><div>&nbsp; &nbsp; vfmt2rgb24( my_pic, pic );</div><div></div><div>&nbsp; &nbsp; for ( k = 0; k &lt; height; k++ )</div><div>&nbsp; &nbsp; &nbsp; &nbsp; row_pointers[k] = my_pic-&gt;data[0] + my_pic-&gt;linesize[0] * k;</div><div></div><div>&nbsp; &nbsp; png_write_image(png.png_ptr, row_pointers);</div><div></div><div>&nbsp; &nbsp; destroy_png();</div><div>}</div><div></div><div></div><div>七. YUV RGB 转换</div><div></div><div>YUV 与RGB的转换和缩放，一般在低端设备上，要有硬件加速来做，否则CPU吃不消。在如今的高端PC上，可以使用软件来做，libswscale库正为此而 来。libswscale针对X86 CPU已经做了优化，如使用 MMX, SSE, 3DNOW 等 CPU 相关的多媒体指令。</div><div></div><div>static int vfmt2rgb(AVPicture *dst, AVPicture *src)</div><div>{</div><div>&nbsp; &nbsp; static struct SwsContext *img_convert_ctx;</div><div></div><div>&nbsp; &nbsp; img_convert_ctx = sws_getCachedContext(img_convert_ctx,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, src_pic_fmt,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, my_pic_fmt, SWS_X, NULL, NULL, NULL);</div><div></div><div>&nbsp; &nbsp; sws_scale(img_convert_ctx, src-&gt;data, src-&gt;linesize,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, width, dst-&gt;data, dst-&gt;linesize);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><div></div><div>比如从 YUV420P 到 RGB24 的转换，只要设置</div><div></div><div>src_pic_fmt = PIX_FMT_YUV420P ;</div><div>my_pic_fmt = PIX_FMT_RGB24 ;</div><div></div><div></div><div>八. 软件缩放</div><div></div><div>软件缩放就可以使用上述的 libswscale 库，调用代码基本一样，只是改一下目标picture的width和height,如放大两倍:</div><div></div><div>static int zoom_2(AVPicture *dst, AVPicture *src)</div><div>{</div><div>&nbsp; &nbsp; static struct SwsContext *img_convert_ctx;</div><div></div><div>&nbsp; &nbsp; img_convert_ctx = sws_getCachedContext(img_convert_ctx,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width, height, src_pic_fmt,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; width*2, height*2, my_pic_fmt, SWS_X, NULL, NULL, NULL);</div><div></div><div>&nbsp; &nbsp; sws_scale(img_convert_ctx, src-&gt;data, src-&gt;linesize,</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0, width*2, dst-&gt;data, dst-&gt;linesize);</div><div></div><div>&nbsp; &nbsp; return 0;</div><div>}</div><img src ="http://www.cppblog.com/Khan/aggbug/198767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-03-24 13:36 <a href="http://www.cppblog.com/Khan/archive/2013/03/24/198767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS 绘制PDF</title><link>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 18 Mar 2013 15:10:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198566.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/03/18/198566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198566.html</trackback:ping><description><![CDATA[<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;-(<span style="color: #0000FF; ">void</span>)createPdf:(UIImage&nbsp;*)img&nbsp;andText:(NSString&nbsp;*)text{<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSArray&nbsp;*paths&nbsp;=&nbsp;NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,&nbsp;NSUserDomainMask,&nbsp;YES);<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*saveDirectory&nbsp;=&nbsp;[paths&nbsp;objectAtIndex:0];<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*saveFileName&nbsp;=&nbsp;@"myPDF.pdf";<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NSString&nbsp;*newFilePath&nbsp;=&nbsp;[saveDirectory&nbsp;stringByAppendingPathComponent:saveFileName];<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;*filename&nbsp;=&nbsp;[newFilePath&nbsp;UTF8String];<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGRect&nbsp;pageRect&nbsp;=&nbsp;CGRectMake(0,&nbsp;0,&nbsp;612,&nbsp;792);<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;code&nbsp;block&nbsp;sets&nbsp;up&nbsp;our&nbsp;PDF&nbsp;Context&nbsp;so&nbsp;that&nbsp;we&nbsp;can&nbsp;draw&nbsp;to&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextRef&nbsp;pdfContext;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFStringRef&nbsp;path;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFURLRef&nbsp;url;<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFMutableDictionaryRef&nbsp;myDictionary&nbsp;=&nbsp;NULL;<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;CFString&nbsp;from&nbsp;the&nbsp;filename&nbsp;we&nbsp;provide&nbsp;to&nbsp;this&nbsp;method&nbsp;when&nbsp;we&nbsp;call&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;=&nbsp;CFStringCreateWithCString&nbsp;(NULL,&nbsp;filename,&nbsp;kCFStringEncodingUTF8);<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;CFURL&nbsp;using&nbsp;the&nbsp;CFString&nbsp;we&nbsp;just&nbsp;defined</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;url&nbsp;=&nbsp;CFURLCreateWithFileSystemPath&nbsp;(NULL,&nbsp;path,&nbsp;kCFURLPOSIXPathStyle,&nbsp;0);<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFRelease&nbsp;(path);<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;This&nbsp;dictionary&nbsp;contains&nbsp;extra&nbsp;options&nbsp;mostly&nbsp;for&nbsp;&#8216;signing&#8217;&nbsp;the&nbsp;PDF</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;myDictionary&nbsp;=&nbsp;CFDictionaryCreateMutable(NULL,&nbsp;0,&nbsp;&amp;kCFTypeDictionaryKeyCallBacks,&nbsp;&amp;kCFTypeDictionaryValueCallBacks);<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFDictionarySetValue(myDictionary,&nbsp;kCGPDFContextTitle,&nbsp;CFSTR("My&nbsp;PDF&nbsp;File"));<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFDictionarySetValue(myDictionary,&nbsp;kCGPDFContextCreator,&nbsp;CFSTR("My&nbsp;Name"));<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;our&nbsp;PDF&nbsp;Context&nbsp;with&nbsp;the&nbsp;CFURL,&nbsp;the&nbsp;CGRect&nbsp;we&nbsp;provide,&nbsp;and&nbsp;the&nbsp;above&nbsp;defined&nbsp;dictionary</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;pdfContext&nbsp;=&nbsp;CGPDFContextCreateWithURL&nbsp;(url,&nbsp;&amp;pageRect,&nbsp;myDictionary);<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Cleanup&nbsp;our&nbsp;mess</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CFRelease(myDictionary);<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFRelease(url);<br />
<span style="color: #008080; ">29</span>&nbsp;<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Done&nbsp;creating&nbsp;our&nbsp;PDF&nbsp;Context,&nbsp;now&nbsp;it&#8217;s&nbsp;time&nbsp;to&nbsp;draw&nbsp;to&nbsp;it<br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Starts&nbsp;our&nbsp;first&nbsp;page</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextBeginPage&nbsp;(pdfContext,&nbsp;&amp;pageRect);<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIImage*&nbsp;myUIImage&nbsp;=&nbsp;img;<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGImageRef&nbsp;pageImage&nbsp;=&nbsp;[myUIImage&nbsp;CGImage];<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextDrawImage(pdfContext,&nbsp;CGRectMake(0,0,([myUIImage&nbsp;size].width)&nbsp;,&nbsp;([myUIImage&nbsp;size].height)),&nbsp;pageImage); //绘制图片<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Draws&nbsp;a&nbsp;black&nbsp;rectangle&nbsp;around&nbsp;the&nbsp;page&nbsp;inset&nbsp;by&nbsp;50&nbsp;on&nbsp;all&nbsp;sides<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextStrokeRect(pdfContext,&nbsp;CGRectMake(50,&nbsp;50,&nbsp;pageRect.size.width&nbsp;-&nbsp;100,&nbsp;pageRect.size.height&nbsp;-&nbsp;100));<br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Adding&nbsp;some&nbsp;text&nbsp;on&nbsp;top&nbsp;of&nbsp;the&nbsp;image&nbsp;we&nbsp;just&nbsp;added<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextSelectFont&nbsp;(pdfContext,&nbsp;"Helvetica",&nbsp;30,&nbsp;kCGEncodingMacRoman);</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetTextDrawingMode&nbsp;(pdfContext,&nbsp;kCGTextFill);<br />
<span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetRGBFillColor&nbsp;(pdfContext,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;1);<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">46</span>&nbsp;<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIGraphicsPushContext(pdfContext); &nbsp;//将需要绘制的层push<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextTranslateCTM(pdfContext,&nbsp;0,&nbsp;792); &nbsp;//转换Y轴坐标, &nbsp;底层坐标与cocoa 组件不同 Y轴相反<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextScaleCTM(pdfContext,&nbsp;1,&nbsp;-1);<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextShowTextAtPoint&nbsp;(pdfContext,&nbsp;260,&nbsp;390,&nbsp;[text&nbsp;UTF8String],&nbsp;strlen([text&nbsp;UTF8String]));&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">汉字不正常</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[text&nbsp;drawAtPoint:CGPointMake(80,&nbsp;80)&nbsp;withFont:[UIFont&nbsp;systemFontOfSize:18]]; &nbsp;//绘制汉字<br />
<span style="color: #008080; ">54</span>&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;UIFont&nbsp;*font&nbsp;=&nbsp;[UIFont&nbsp;systemFontOfSize:15&nbsp;]; //自定义字体<br />
</span><span style="color: #008080; ">56</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;CGContextSetFillColorWithColor(pdfContext,&nbsp;[UIColor&nbsp;blackColor].CGColor); //颜色<br />
</span><span style="color: #008080; ">57</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;[text&nbsp;drawAtPoint:CGPointMake(260,390)&nbsp;forWidth:50&nbsp;withFont:font&nbsp;minFontSize:8&nbsp;actualFontSize:NULL&nbsp;lineBreakMode:UILineBreakModeTailTruncation&nbsp;baselineAdjustment:UIBaselineAdjustmentAlignCenters];</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">58</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UIGraphicsPopContext();&nbsp;<br />
<span style="color: #008080; ">60</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CGContextStrokePath(pdfContext);<br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;End&nbsp;text<br />
</span><span style="color: #008080; ">65</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;are&nbsp;done&nbsp;drawing&nbsp;to&nbsp;this&nbsp;page,&nbsp;let&#8217;s&nbsp;end&nbsp;it<br />
</span><span style="color: #008080; ">66</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;could&nbsp;add&nbsp;as&nbsp;many&nbsp;pages&nbsp;as&nbsp;we&nbsp;wanted&nbsp;using&nbsp;CGContextBeginPage/CGContextEndPage</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextEndPage&nbsp;(pdfContext);<br />
<span style="color: #008080; ">68</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;We&nbsp;are&nbsp;done&nbsp;with&nbsp;our&nbsp;context&nbsp;now,&nbsp;so&nbsp;we&nbsp;release&nbsp;it</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;CGContextRelease&nbsp;(pdfContext);<br />
<span style="color: #008080; ">70</span>&nbsp;}</div>
<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)viewDidLoad<br />
<span style="color: #008080; ">2</span>&nbsp;{<br />
<span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;viewDidLoad];<br />
<span style="color: #008080; ">4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Do&nbsp;any&nbsp;additional&nbsp;setup&nbsp;after&nbsp;loading&nbsp;the&nbsp;view,&nbsp;typically&nbsp;from&nbsp;a&nbsp;nib.<br />
</span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">调用方法</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;createPdf:[UIImage&nbsp;imageNamed:@"aa"]&nbsp;andText:@"汉字"];<br />
<span style="color: #008080; ">8</span>&nbsp;&nbsp;<br />
<span style="color: #008080; ">9</span>&nbsp;}</div>
<br />
<br />
没注释掉的代码 每一行都有其意义. 注意步骤, 仔细阅读注释<img src ="http://www.cppblog.com/Khan/aggbug/198566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-03-18 23:10 <a href="http://www.cppblog.com/Khan/archive/2013/03/18/198566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为UITableView增加左右滑动事件</title><link>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 26 Feb 2013 18:51:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198100.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/02/27/198100.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198100.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198100.html</trackback:ping><description><![CDATA[UITableView 屏蔽了左右滑动事件. &nbsp;通过重载的方式可以注入事件touch事件, 供开发者使用..
<div><br />
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;TouchTableView.h<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;i2fBank4Iphone<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;khan.lau&nbsp;on&nbsp;13-1-8.<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2013年&nbsp;khan.lau.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;#import&nbsp;&lt;UIKit/UIKit.h&gt;<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;<br />
<span style="color: #008080; ">12</span>&nbsp;@protocol&nbsp;TouchTableViewDelegate&nbsp;&lt;NSObject&gt;<br />
<span style="color: #008080; ">13</span>&nbsp;@optional<br />
<span style="color: #008080; ">14</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesBegin:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">15</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesCancelled:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">16</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesEnded:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">17</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)tableView:(UITableView&nbsp;*)tableView&nbsp;touchesMoved:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>;<br />
<span style="color: #008080; ">18</span>&nbsp;@end</div>
</div>
<div><br />
</div>
<div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;TouchTableView.m<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;i2fBank4Iphone<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Created&nbsp;by&nbsp;khan.lau&nbsp;on&nbsp;13-1-8.<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;Copyright&nbsp;(c)&nbsp;2013年&nbsp;khan.lau.&nbsp;All&nbsp;rights&nbsp;reserved.<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; "></span><span style="color: #008000; ">//<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;#import&nbsp;"TouchTableView.h"<br />
<span style="color: #008080; ">10</span>&nbsp;<br />
<span style="color: #008080; ">11</span>&nbsp;@implementation&nbsp;TouchTableView<br />
<span style="color: #008080; ">12</span>&nbsp;<br />
<span style="color: #008080; ">13</span>&nbsp;@synthesize&nbsp;touchDelegate&nbsp;=&nbsp;_touchDelegate;<br />
<span style="color: #008080; ">14</span>&nbsp;<br />
<span style="color: #008080; ">15</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesBegan:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesBegan:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesBegin:withEvent:)])<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesBegin:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">23</span>&nbsp;}<br />
<span style="color: #008080; ">24</span>&nbsp;<br />
<span style="color: #008080; ">25</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesCancelled:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesCancelled:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesCancelled:withEvent:)])<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesCancelled:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">33</span>&nbsp;}<br />
<span style="color: #008080; ">34</span>&nbsp;<br />
<span style="color: #008080; ">35</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesEnded:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">36</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesEnded:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesEnded:withEvent:)])<br />
<span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesEnded:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">43</span>&nbsp;}<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;-&nbsp;(<span style="color: #0000FF; ">void</span>)touchesMoved:(NSSet&nbsp;*)touches&nbsp;withEvent:(UIEvent&nbsp;*)<span style="color: #0000FF; ">event</span>&nbsp;{<br />
<span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[super&nbsp;touchesMoved:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;([_touchDelegate&nbsp;conformsToProtocol:@protocol(TouchTableViewDelegate)]&nbsp;&amp;&amp;<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;respondsToSelector:@selector(tableView:touchesMoved:withEvent:)])<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[_touchDelegate&nbsp;tableView:self&nbsp;touchesMoved:touches&nbsp;withEvent:<span style="color: #0000FF; ">event</span>];<br />
<span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">53</span>&nbsp;}<br />
<span style="color: #008080; ">54</span>&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;@end<br />
<span style="color: #008080; ">56</span>&nbsp;</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>调用方法 :</div>
<div>1. 头文件中加入delegate</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; "><span style="color: #bb2ca2">@interface</span><span style="color: #000000"> MoneyViewCtl : </span><span style="color: #703daa">UIViewController</span><span style="color: #000000">&lt;</span><span style="color: #703daa">UITableViewDataSource</span><span style="color: #000000">, </span><span style="color: #703daa">UITableViewDelegate</span><span style="color: #000000">, </span>SDWebDataDownloaderDelegate<span style="color: #000000">, </span>EGORefreshTableHeaderDelegate<span style="color: #000000">, </span>TouchTableViewDelegate<span style="color: #000000">&gt;{</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; ">&nbsp;&nbsp; &nbsp;</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #703daa; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #bb2ca2">IBOutlet</span><span style="color: #000000"> </span>UISegmentedControl<span style="color: #000000"> *_sigTime;</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">&nbsp; &nbsp; <span style="color: #bb2ca2">IBOutlet</span> <span style="color: #4f8187">TouchTableView</span> *_tableview;</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #bb2ca2; ">@end</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #bb2ca2; "><br />
</p>
</div>
<div><br />
</div>
<div>2. .m文件中设置好delegate</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; ">_tableview<span style="color: #000000">.</span>touchDelegate<span style="color: #000000"> = </span><span style="color: #bb2ca2">self</span><span style="color: #000000">;</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #4f8187; "><span style="color: #000000"><br />
</span></p>
</div>
<div><br />
</div>
<div>3. .m文件中实现如下事件</div>
<div>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #78492a; ">#pragma mark - TouchTableViewDelegate lifecycle</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesBegin:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesBegin"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesCancelled:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesCancelled"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px; "><br />
</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesEnded:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesEnded"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">- (<span style="color: #bb2ca2">void</span>)tableView:(<span style="color: #703daa">UITableView</span> *)tableView touchesMoved:(<span style="color: #703daa">NSSet</span> *)touches withEvent:(<span style="color: #703daa">UIEvent</span> *)event{</p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: #d12f1b; "><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #3d1d81">NSLog</span><span style="color: #000000">(</span>@"touchesMoved"<span style="color: #000000">);</span></p>
<p style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; ">}</p>
</div>
<div><br />
</div>
<div><br />
</div>
<div>剩下的事情就可以自己发挥了</div>
<div><br />
</div>
<div><br />
</div><img src ="http://www.cppblog.com/Khan/aggbug/198100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-02-27 02:51 <a href="http://www.cppblog.com/Khan/archive/2013/02/27/198100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS GIF播放, 包含UITableViewCell中正常播放</title><link>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 26 Feb 2013 18:40:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/198099.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2013/02/27/198099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/198099.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/198099.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本程序依赖第三方库UIImage+animatedImageWithGIF, 但是有小幅度修改&nbsp;1&nbsp;//&nbsp;2&nbsp;//&nbsp;&nbsp;UIImage+animatedImageWithGIF.h&nbsp;3&nbsp;//&nbsp;4&nbsp;//&nbsp;&nbsp;Created&nbsp;by&nbsp;YuAo&nbsp;...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2013/02/27/198099.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/198099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2013-02-27 02:40 <a href="http://www.cppblog.com/Khan/archive/2013/02/27/198099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg 视频封装步骤</title><link>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 17 Dec 2012 16:29:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196392.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/18/196392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196392.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196392.html</trackback:ping><description><![CDATA[<div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 1、打开你写好的*.264文件，av_open_input_file()；</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 2、找到解码器，avcodec_find_decoder();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 3、设置好编码参数，如宽、高、帧率等等；找到编码器avcodec_find_encoder()，打开编码器avcodec_open();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 4、打开你要写入的文件，比如*avi，url_fopen();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 5、写入流的头信息，av_write_header();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 6、读取帧，av_read_frame();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 7、开始解码，avcodec_decode_video();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 8、随后编码，avcodec_encode_video();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 9、将编码后的数据写入文件（*.avi），av_write_frame();</span></div><div><span style="font-size: 12px; line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; 10、最后应该是写入尾部信息，av_write_trailer().</span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;"><br /></span></div><div><span style="font-size: 12px; line-height: normal;">以上为纯视频封装, 音频还需其他步骤.</span></div><img src ="http://www.cppblog.com/Khan/aggbug/196392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-18 00:29 <a href="http://www.cppblog.com/Khan/archive/2012/12/18/196392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在C/C++程序里打印调用栈信息(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Mon, 17 Dec 2012 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196388.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/17/196388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196388.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196388.html</trackback:ping><description><![CDATA[<div>原文出处 &nbsp;http://blog.csdn.net/yetyongjin/article/details/7759144<br /><br />以下不能windows + mingw下执行. &nbsp;windows下参考&nbsp;http://code.google.com/p/backtrace-mingw/<br /></div><div></div><div></div><div>我们知道，GDB的backtrace命令可以查看堆栈信息。但很多时候，GDB根本用不上。比如说，在线上环境中可能没有GDB，即使有，也不太可能让我们直接在上面调试。如果能让程序自己输出调用栈，那是最好不过了。本文介绍和调用椎栈相关的几个函数。</div><div>&nbsp;</div><div>NAME</div><div>&nbsp; &nbsp; &nbsp; &nbsp;backtrace, backtrace_symbols, backtrace_symbols_fd - support for application self-debugging</div><div></div><div>SYNOPSIS</div><div>&nbsp; &nbsp; &nbsp; &nbsp;#include &lt;execinfo.h&gt;</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;int backtrace(void **buffer, int size);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;char **backtrace_symbols(void *const *buffer, int size);</div><div></div><div>&nbsp; &nbsp; &nbsp; &nbsp;void backtrace_symbols_fd(void *const *buffer, int size, int fd);</div><div>&nbsp;</div><div>以上内容源自这几个函数的man手册。</div><div>&nbsp;</div><div>先简单介绍一下这几个函数的功能：</div><div>l backtrace：获取当前的调用栈信息，结果存储在buffer中，返回值为栈的深度，参数size限制栈的最大深度，即最大取size步的栈信息。</div><div>l backtrace_symbols：把backtrace获取的栈信息转化为字符串，以字符指针数组的形式返回，参数size限定转换的深度，一般用backtrace调用的返回值。</div><div>l backtrace_symbols_fd：它的功能和backtrace_symbols差不多，只不过它不把转换结果返回给调用方，而是写入fd指定的文件描述符。</div><div></div><div>Man手册里，给出了一个简单的实例，我们看一下：</div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;#include&lt;execinfo.h&gt;<br /><span style="color: #008080; ">&nbsp;2</span>&nbsp;#include&lt;stdio.h&gt;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;#include&lt;stdlib.h&gt;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;#include&lt;unistd.h&gt;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myfunc3(<span style="color: #0000FF; ">void</span>)&nbsp;{<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;j,&nbsp;nptrs;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">#define</span>&nbsp;SIZE&nbsp;100<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;*buffer[100];<br /><span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;**strings;<br /><span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;nptrs&nbsp;=&nbsp;backtrace(buffer,&nbsp;SIZE);<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;printf("backtrace()&nbsp;returned&nbsp;%d&nbsp;addresses\n",&nbsp;nptrs);<br /><span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;The&nbsp;call&nbsp;backtrace_symbols_fd(buffer,&nbsp;nptrs,&nbsp;STDOUT_FILENO)<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;would&nbsp;produce&nbsp;similar&nbsp;output&nbsp;to&nbsp;the&nbsp;following:&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">15</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;strings&nbsp;=&nbsp;backtrace_symbols(buffer,&nbsp;nptrs);<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(strings&nbsp;==&nbsp;NULL)&nbsp;{<br /><span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror("backtrace_symbols");<br /><span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br /><span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt;&nbsp;nptrs;&nbsp;j++)<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%s\n",&nbsp;strings[j]);<br /><span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;free(strings);<br /><span style="color: #008080; ">25</span>&nbsp;}<br /><span style="color: #008080; ">26</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;myfunc2(<span style="color: #0000FF; ">void</span>)&nbsp;{&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;"static"&nbsp;means&nbsp;don't&nbsp;export&nbsp;the&nbsp;symbol<img src="http://www.cppblog.com/Images/dot.gif" alt="" />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;myfunc3();<br /><span style="color: #008080; ">29</span>&nbsp;}<br /><span style="color: #008080; ">30</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;myfunc(<span style="color: #0000FF; ">int</span>&nbsp;ncalls)&nbsp;{<br /><span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(ncalls&nbsp;&gt;&nbsp;1)<br /><span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfunc(ncalls&nbsp;-&nbsp;1);<br /><span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">else</span><br /><span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myfunc2();<br /><span style="color: #008080; ">36</span>&nbsp;}<br /><span style="color: #008080; ">37</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">38</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;main(<span style="color: #0000FF; ">int</span>&nbsp;argc,<span style="color: #0000FF; ">char</span>&nbsp;*argv[])&nbsp;{<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(argc&nbsp;!=&nbsp;2)&nbsp;{<br /><span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,"%s&nbsp;num-calls\n",&nbsp;argv[0]);<br /><span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br /><span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;}<br /><span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;myfunc(atoi(argv[1]));<br /><span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br /><span style="color: #008080; ">45</span>&nbsp;}<br /><span style="color: #008080; ">46</span>&nbsp;&nbsp;</div></div><div>编译:</div><div># cc prog.c -o prog</div><div>&nbsp;</div><div>运行：</div><div># ./prog 0</div><div>backtrace() returned 6 addresses</div><div>./prog() [0x80485a3]</div><div>./prog() [0x8048630]</div><div>./prog() [0x8048653]</div><div>./prog() [0x80486a7]</div><div>&nbsp;</div><div>这样，是输出了调用栈，不过只是以十六进制输出函数地址而已，可读性很差。仔细看下man手册，原来很简单，编译时加上个参数：</div><div>&nbsp;</div><div>重新编译：</div><div># cc -rdynamic &nbsp;prog.c -o prog</div><div>通过gcc手册，我们可以也解下参数的说明:</div><div>-rdynamic</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of "dlopen" or to allow obtaining backtraces from within a program.</div><div>&nbsp;</div><div>再执行：</div><div># ./prog 0</div><div>backtrace() returned 6 addresses</div><div>./prog(myfunc3+0x1f) [0x8048763]</div><div>./prog() [0x80487f0]</div><div>./prog(myfunc+0x21) [0x8048813]</div><div>./prog(main+0x52) [0x8048867]</div><div>/lib/libc.so.6(__libc_start_main+0xe6) [0xaf9cc6]</div><div>./prog() [0x80486b1]</div><div>&nbsp;</div><div>这回，可以看到函数名了。</div><img src ="http://www.cppblog.com/Khan/aggbug/196388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-17 22:12 <a href="http://www.cppblog.com/Khan/archive/2012/12/17/196388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之七(打开输入的流)  </title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196237.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:47:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196237.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196237.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196237.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196237.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196237.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: err&nbsp;=&nbsp;av_open_input_stream(ic_ptr,&nbsp;pb,&nbsp;filename,&nbsp;fmt,&nbsp;ap);                                                            int&nbsp;av_open_input_s...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2012/12/14/196237.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/196237.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:47 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196237.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之六(再次探测输入的格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196236.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196236.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196236.html</trackback:ping><description><![CDATA[<div>void *logctx= ap &amp;&amp; ap-&gt;prealloced_context ? *ic_ptr : NULL; // 因为 ap == NULL, 所以 logctx 也 == NULL.</div>
<div>if (!fmt &amp;&amp; (err = ff_probe_input_buffer(&amp;pb, &amp;fmt, filename, logctx, 0, logctx ? (*ic_ptr)-&gt;probesize : 0)) &lt; 0) {</div>
<div>&nbsp; goto fail;</div>
<div>}</div>
<div>// fmt == NULL 时才执行 ff_probe_input_buffer 函数, 因为 fmt 就等于NULL, 成立.</div>
<div><br />
</div>
<div><br />
</div>
<div>ff_probe_input_buffer函数的原型:</div>
<div>int ff_probe_input_buffer(ByteIOContext **pb, // 字节IO上下文, 执行url_fopen得到的</div>
<div>&nbsp; &nbsp; AVInputFormat **fmt, // 输出参数: 输入的格式</div>
<div>&nbsp; &nbsp; const char *filename, // 文件名</div>
<div>&nbsp; &nbsp; void *logctx, // NULL</div>
<div>&nbsp; &nbsp; unsigned int offset, // 0</div>
<div>&nbsp; &nbsp; unsigned int max_probe_size) // 0</div>
<div><br />
</div>
<div><br />
</div>
<div>关键的代码片断:</div>
<div>/* 读待探测的数据 */</div>
<div>buf = av_realloc(buf, probe_size + AVPROBE_PADDING_SIZE);</div>
<div>if ((ret = get_buffer(*pb, buf + buf_offset, probe_size - buf_offset)) &lt; 0) {</div>
<div>&nbsp; /* fail if error was not end of file, otherwise, lower score */</div>
<div>&nbsp; if (ret != AVERROR_EOF) {</div>
<div>&nbsp; &nbsp; av_free(buf);</div>
<div>&nbsp; &nbsp; return ret;</div>
<div>&nbsp; }</div>
<div>&nbsp; score = 0;</div>
<div>&nbsp; ret = 0; /* error was end of file, nothing read */</div>
<div>}</div>
<div>pd.buf_size += ret;</div>
<div>pd.buf = &amp;buf[offset];</div>
<div><br />
</div>
<div>memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);</div>
<div><br />
</div>
<div>/* 猜测文件格式 */</div>
<div>*fmt = av_probe_input_format2(&amp;pd, 1, &amp;score);</div>
<div><br />
</div>
<div>get_buffer函数, 有两处比较关键:</div>
<div>int get_buffer(ByteIOContext *s, unsigned char *buf, int size);</div>
<div>{</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */ /* 读包 */</div>
<div>&nbsp; if(s-&gt;read_packet)</div>
<div>&nbsp; &nbsp; len = s-&gt;read_packet(s-&gt;opaque, buf, size);</div>
<div><br />
</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */</div>
<div><br />
</div>
<div>&nbsp; /* 填充缓冲 */</div>
<div><br />
</div>
<div>&nbsp; fill_buffer(s);</div>
<div><br />
</div>
<div>&nbsp; /* 省略部分代码 */</div>
<div><br />
</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>fill_buffer函数, 有一处比较关键:</div>
<div>static void fill_buffer(ByteIOContext *s)</div>
<div>{ /* 省略部分代码 */ /* 读包 */</div>
<div>&nbsp; if(s-&gt;read_packet)</div>
<div>&nbsp; &nbsp; len = s-&gt;read_packet(s-&gt;opaque, dst, len);</div>
<div><br />
</div>
<div>/* 省略部分代码 */</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div>好了, 到第二次探测输入格式的地方了:</div>
<div>*fmt = av_probe_input_format2(&amp;pd, 1, &amp;score);</div>
<div><br />
</div>
<div><br />
</div>
<div>进入av_probe_input_format2函数:</div>
<div>AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)</div>
<div>{</div>
<div>&nbsp; AVInputFormat *fmt1, *fmt;</div>
<div>&nbsp; int score;</div>
<div><br />
</div>
<div>&nbsp; fmt = NULL;</div>
<div>&nbsp; for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1-&gt;next) {</div>
<div>&nbsp; &nbsp; if (!is_opened == !(fmt1-&gt;flags &amp; AVFMT_NOFILE))</div>
<div>&nbsp; &nbsp; &nbsp; continue;</div>
<div><br />
</div>
<div>&nbsp; &nbsp; /* 这次 is_opened == 1, fmt1-&gt;flags设置AVFMT_NOFILE标志才时成立 */</div>
<div><br />
</div>
<div>&nbsp; &nbsp; /* 由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面不成立, 继续执行 */ score = 0;</div>
<div>&nbsp; &nbsp; if (fmt1-&gt;read_probe) {</div>
<div>&nbsp; &nbsp; &nbsp; score = fmt1-&gt;read_probe(pd); /* 调用h264_demuxer.h264_probe */</div>
<div>&nbsp; &nbsp; } else if (fmt1-&gt;extensions) {</div>
<div>&nbsp; &nbsp; &nbsp; if (av_match_ext(pd-&gt;filename, fmt1-&gt;extensions)) { /* 文件名和格式扩展名的匹配 */</div>
<div><br />
</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; /* h264_demuxer.extensions = "h26l,h264,264" */ score = 50;</div>
<div>&nbsp; &nbsp; &nbsp; }</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp;if (score &gt; *score_max) {</div>
<div>&nbsp; &nbsp; *score_max = score;</div>
<div>&nbsp; &nbsp; fmt = fmt1;</div>
<div>&nbsp; }else if (score == *score_max)</div>
<div>&nbsp; &nbsp; fmt = NULL;</div>
<div>&nbsp; }</div>
<div>&nbsp; return fmt;</div>
<div>}</div>
<div><br />
</div>
<div>av_match_ext函数:</div>
<div>int av_match_ext(const char *filename, const char *extensions)</div>
<div>{</div>
<div>&nbsp; const char *ext, *p;</div>
<div>&nbsp; char ext1[32], *q;</div>
<div><br />
</div>
<div>&nbsp; if(!filename)</div>
<div>&nbsp; &nbsp; return 0;</div>
<div><br />
</div>
<div>&nbsp; ext = strrchr(filename, '.');</div>
<div>&nbsp; if (ext) {</div>
<div>&nbsp; &nbsp; ext++;</div>
<div>&nbsp; &nbsp; p = extensions;</div>
<div>&nbsp; &nbsp; for(;;) {</div>
<div>&nbsp; &nbsp; &nbsp; q = ext1;</div>
<div>&nbsp; &nbsp; &nbsp; while (*p != '' &amp;&amp; *p != ',' &amp;&amp; q-ext1&lt;sizeof(ext1)-1)</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; *q++ = *p++;</div>
<div>&nbsp; &nbsp; &nbsp; *q = '';</div>
<div>&nbsp; &nbsp; &nbsp; if (!strcasecmp(ext1, ext))</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; return 1;</div>
<div>&nbsp; &nbsp; &nbsp; if (*p == '')</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; break;</div>
<div>&nbsp; &nbsp; &nbsp; p++;</div>
<div>&nbsp; &nbsp; }</div>
<div>&nbsp; }</div>
<div>&nbsp; return 0;</div>
<div>}</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/Khan/aggbug/196236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:44 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之五(打开输入的文件)  </title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:34:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196235.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196235.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196235.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196235.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. 打开文件:                                    if&nbsp;(!fmt&nbsp;||&nbsp;!(fmt-&gt;flags&nbsp;&amp;&nbsp;AVFMT_NOFILE))&nbsp;{&nbsp;                        &nbsp;&nbsp; &nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2012/12/14/196235.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/196235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:34 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之四(探测输入的格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:32:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196234.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196234.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196234.html</trackback:ping><description><![CDATA[<div>调用av_open_input_file(&amp;pFormatCtx, is-&gt;filename, NULL, 0, NULL)函数打开输入的文件.<br /><br /><br /></div><div></div><div>1. 分析一下函数原型:</div><div>int av_open_input_file(AVFormatContext **ic_ptr, // 输出参数: 格式上下文</div><div>&nbsp; &nbsp; const char *filename, // 文件名</div><div>&nbsp; &nbsp; AVInputFormat *fmt, // 输入的格式, 为NULL, 即未知</div><div>&nbsp; &nbsp; int buf_size, // 缓冲的大小, 为0</div><div>&nbsp; &nbsp; AVFormatParameters *ap); // 格式的参数, 为NULL<br /><br /><br /><br /></div><div></div><div>2. 初始化探测数据:</div><div>AVProbeData probe_data, *pd = &amp;probe_data;</div><div></div><div>pd-&gt;filename = "";</div><div>if (filename)</div><div>&nbsp; pd-&gt;filename = filename;</div><div>pd-&gt;buf = NULL;</div><div>pd-&gt;buf_size = 0;<br /><br /><br /><br /></div><div></div><div>3. 探测输入的格式:</div><div>if (!fmt) { // fmt == NULL, 成立</div><div>&nbsp; &nbsp; fmt = av_probe_input_format(pd, 0);</div><div>}<br /><br /><br /><br /></div><div></div><div>进入av_probe_input_format函数:</div><div>AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened) {</div><div>&nbsp; &nbsp; int score=0;</div><div>&nbsp; &nbsp; return av_probe_input_format2(pd, is_opened, &amp;score);</div><div>}<br /><br /><br /><br /></div><div></div><div>进入av_probe_input_format2函数:</div><div>AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max)</div><div>{</div><div>&nbsp; &nbsp; AVInputFormat *fmt1, *fmt;</div><div>&nbsp; &nbsp; int score;</div><div></div><div>&nbsp; &nbsp; fmt = NULL;</div><div>&nbsp; &nbsp; for(fmt1 = first_iformat; fmt1 != NULL; fmt1 = fmt1-&gt;next) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (!is_opened == !(fmt1-&gt;flags &amp; AVFMT_NOFILE)) // is_opened == 0, fmt1-&gt;flags 没有设置 AVFMT_NOFILE 标志时成立</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; /* 省略部分代码 */</div><div>&nbsp; &nbsp; }<br /><br /><br /><br /><br /></div><div></div><div>见libavformat/raw.c文件:</div><div>AVInputFormat h264_demuxer = {</div><div>&nbsp; "h264",</div><div>&nbsp; NULL_IF_CONFIG_SMALL("raw H.264 video format"),</div><div>&nbsp; 0,</div><div>&nbsp; h264_probe,</div><div>&nbsp; video_read_header,</div><div>&nbsp; ff_raw_read_partial_packet,</div><div>&nbsp; .flags= AVFMT_GENERIC_INDEX,</div><div>&nbsp; .extensions = "h26l,h264,264", //FIXME remove after writing mpeg4_probe</div><div>&nbsp; .value = CODEC_ID_H264,</div><div>};<br /><br /><br /></div><div>由于 h264_demuxer.flags == AVFMT_GENERIC_INDEX, 所以上面成立, continue, 返回的 AVInputFormat 指针为 NULL, 探测不成功.</div><img src ="http://www.cppblog.com/Khan/aggbug/196234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:32 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之三(输入输出格式)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:24:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196233.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196233.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196233.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196233.html</trackback:ping><description><![CDATA[<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; ">(不知原始出处, 方便请告知, 此处转载于&nbsp;</span><span style="color: #aaaaaa; font-family: georgia, Verdana, Helvetica, Arial; font-size: 13px; line-height: 18px; text-align: justify; ">http://hi.baidu.com/monkeyifox</span><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; ">)</span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">探测数据结构:</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code><span style="color: #000000; "><span style="color: #ff9900; ">/** This structure contains the data a format has to probe a file. */</span><br style="font-size: 10pt; " />
            <span style="color: #00ff00; ">typedef</span>&nbsp;<span style="color: #00ff00; ">struct</span>&nbsp;AVProbeData&nbsp;<span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">const</span>&nbsp;<span style="color: #00ff00; ">char</span>&nbsp;<span style="color: #00cc00; ">*</span>filename<span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">unsigned</span>&nbsp;<span style="color: #00ff00; ">char</span>&nbsp;<span style="color: #00cc00; ">*</span>buf<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">/**&lt; Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;buf_size<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">/**&lt; Size of buf except extra allocated bytes */</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span>&nbsp;AVProbeData<span style="color: #00cc00; ">;</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">h264的探测函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;h264_probe<span style="color: #00cc00; ">(</span>AVProbeData&nbsp;<span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">uint32_t</span>&nbsp;code<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;sps<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;pps<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;idr<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;res<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">,</span>&nbsp;sli<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;i<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">for</span><span style="color: #00cc00; ">(</span>i<span style="color: #00cc00; ">=</span>0<span style="color: #00cc00; ">;</span>&nbsp;i<span style="color: #00cc00; ">&lt;</span>p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf_size<span style="color: #00cc00; ">;</span>&nbsp;i<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>code<span style="color: #00cc00; ">&lt;</span><span style="color: #00cc00; ">&lt;</span>8<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">+</span>&nbsp;p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf<span style="color: #00cc00; ">[</span>i<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">(</span>code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0xffffff00<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;0x100<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;ref_idc<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>code<span style="color: #00cc00; ">&gt;</span><span style="color: #00cc00; ">&gt;</span>5<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">&amp;</span>3<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;type&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0x1F<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">const</span>&nbsp;<span style="color: #ff0000; ">int8_t</span>&nbsp;ref_zero<span style="color: #00cc00; ">[</span>32<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span><span style="color: #00cc00; ">-</span>1<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<span style="color: #00cc00; ">,</span>&nbsp;2<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>code&nbsp;<span style="color: #00cc00; ">&amp;</span>&nbsp;0x80<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #ff9900; ">//forbidden bit<br />
            </span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;1&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;ref_idc<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">-</span>1&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;<span style="color: #00cc00; ">!</span>ref_idc<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>ref_zero<span style="color: #00cc00; ">[</span>type<span style="color: #00cc00; ">]</span>&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;2<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">switch</span><span style="color: #00cc00; ">(</span>type<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;1<span style="color: #00cc00; ">:</span>&nbsp;sli<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;5<span style="color: #00cc00; ">:</span>&nbsp;idr<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;7<span style="color: #00cc00; ">:</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>p<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>buf<span style="color: #00cc00; ">[</span>i<span style="color: #00cc00; ">+</span>2<span style="color: #00cc00; ">]</span><span style="color: #00cc00; ">&amp;</span>0x0F<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sps<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">case</span>&nbsp;8<span style="color: #00cc00; ">:</span>&nbsp;pps<span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">+</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00ff00; ">break</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>sps&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;pps&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;<span style="color: #00cc00; ">(</span>idr<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span>sli<span style="color: #00cc00; ">&gt;</span>3<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">&amp;</span>&nbsp;res<span style="color: #00cc00; ">&lt;</span><span style="color: #00cc00; ">(</span>sps<span style="color: #00cc00; ">+</span>pps<span style="color: #00cc00; ">+</span>idr<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVPROBE_SCORE_MAX<span style="color: #00cc00; ">/</span>2<span style="color: #00cc00; ">+</span>1<span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #ff9900; ">// +1 for .mpg<br />
            </span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span><br />
            </span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">视频读首部函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;video_read_header<span style="color: #00cc00; ">(</span>AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AVFormatParameters&nbsp;<span style="color: #00cc00; ">*</span>ap<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVStream&nbsp;<span style="color: #00cc00; ">*</span>st<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;st&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;av_new_stream<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">,</span>&nbsp;0<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">!</span>st<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVERROR<span style="color: #00cc00; ">(</span>ENOMEM<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_type&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;AVMEDIA_TYPE_VIDEO<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>iformat<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>value<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>need_parsing&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;AVSTREAM_PARSE_FULL<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* for MJPEG, specify frame rate */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* for MPEG-4 specify it, too (most MPEG-4 streams do not have the fixed_vop_rate set ...)*/</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>ap<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">.</span>num<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">=</span>&nbsp;ap<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span>&nbsp;<span style="color: #00ff00; ">else</span>&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_MJPEG&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_MPEG4&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_DIRAC&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_DNXHD&nbsp;<span style="color: #00cc00; ">|</span><span style="color: #00cc00; ">|</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec_id&nbsp;<span style="color: #00cc00; ">=</span><span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>codec<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span><span style="color: #ff0000; ">time_base</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">(</span>AVRational<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">{</span>1<span style="color: #00cc00; ">,</span>25<span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;av_set_pts_info<span style="color: #00cc00; ">(</span>st<span style="color: #00cc00; ">,</span>&nbsp;64<span style="color: #00cc00; ">,</span>&nbsp;1<span style="color: #00cc00; ">,</span>&nbsp;1200000<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; ">原始地读实际的包函数:</span></span></div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="color: #333333; font-family: Arial; font-size: 14px; line-height: 26px; text-align: left; border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #000000; "><span style="color: #00ff00; ">int</span>&nbsp;ff_raw_read_partial_packet<span style="color: #00cc00; ">(</span>AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span>&nbsp;AVPacket&nbsp;<span style="color: #00cc00; ">*</span>pkt<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;ret<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;size&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;RAW_PACKET_SIZE<span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>av_new_packet<span style="color: #00cc00; ">(</span>pkt<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">&lt;</span>&nbsp;0<span style="color: #00cc00; ">)</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;AVERROR<span style="color: #00cc00; ">(</span>ENOMEM<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pos<span style="color: #00cc00; ">=</span>&nbsp;url_ftell<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>stream_index&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;0<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;get_partial_buffer<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>data<span style="color: #00cc00; ">,</span>&nbsp;size<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span>&nbsp;<span style="color: #00cc00; ">(</span>ret&nbsp;<span style="color: #00cc00; ">&lt;</span>&nbsp;0<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;av_free_packet<span style="color: #00cc00; ">(</span>pkt<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">}</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>size&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;ret<span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; " />
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">原始地写包函数:</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; "><br />
</div>
<div style="color: #333333; font-family: Arial; line-height: 26px; text-align: left; background-color: #ffffff; ">
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code><span style="color: #00ff00; ">static</span>&nbsp;<span style="color: #00ff00; ">int</span>&nbsp;raw_write_packet<span style="color: #00cc00; ">(</span><span style="color: #00ff00; ">struct</span>&nbsp;AVFormatContext&nbsp;<span style="color: #00cc00; ">*</span>s<span style="color: #00cc00; ">,</span>&nbsp;AVPacket&nbsp;<span style="color: #00cc00; ">*</span>pkt<span style="color: #00cc00; ">)</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;put_buffer<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>data<span style="color: #00cc00; ">,</span>&nbsp;pkt<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>size<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;put_flush_packet<span style="color: #00cc00; ">(</span>s<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>pb<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">return</span>&nbsp;0<span style="color: #00cc00; ">;</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div><span style="font-size: 13px; "><br />
</span></div>
<div><span style="font-size: 13px; ">h264混合器:</span></div>
<div><span style="font-size: 13px; "><br />
</span></div>
<div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr style="font-size: 10pt; ">
            <td style="font-size: 10pt; ">
            <p style="margin-right: 5px; margin-left: 5px; font-size: 10pt; line-height: 19px; "><code>AVOutputFormat h264_muxer&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">{</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;NULL_IF_CONFIG_SMALL<span style="color: #00cc00; ">(</span><span style="color: #ff0ff0; ">"raw H.264 video format"</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;0<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;CODEC_ID_NONE<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;raw_write_packet<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>flags<span style="color: #00cc00; ">=</span>&nbsp;AVFMT_NOTIMESTAMPS<span style="color: #00cc00; ">,</span><br style="font-size: 10pt; " />
            <span style="color: #00cc00; ">}</span><span style="color: #00cc00; ">;</span></code></p>
            <div><code><span style="color: #00cc00; "><br />
            </span></code></div>
            </td>
        </tr>
    </tbody>
</table>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">h264分离器:</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code>AVInputFormat h264_demuxer&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0ff0; ">"h264"</span><span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;NULL_IF_CONFIG_SMALL<span style="color: #00cc00; ">(</span><span style="color: #ff0ff0; ">"raw H.264 video format"</span><span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;0<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;h264_probe<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;video_read_header<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;ff_raw_read_partial_packet<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>flags<span style="color: #00cc00; ">=</span>&nbsp;AVFMT_GENERIC_INDEX<span style="color: #00cc00; ">,</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>extensions&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0ff0; ">"h26l,h264,264"</span><span style="color: #00cc00; ">,</span>&nbsp;<span style="color: #ff9900; ">//FIXME remove after writing mpeg4_probe</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">.</span>value&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;CODEC_ID_H264<span style="color: #00cc00; ">,</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">libavformat/allformats.c文件的<span style="font-family: 新宋体; ">av_register_all函数</span>注册了h264分离器和混合器:</span></span></div>
<div><span style="font-size: 16px; "><span style="font-size: 13px; "><br />
</span></span></div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_MUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">extern</span>&nbsp;AVOutputFormat x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_muxer<span style="color: #00cc00; ">;</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>CONFIG_<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>X<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_MUXER<span style="color: #00cc00; ">)</span>&nbsp;av_register_output_format<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">&amp;</span>x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_muxer<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_DEMUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;<span style="color: #00cc00; ">{</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">extern</span>&nbsp;AVInputFormat x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_demuxer<span style="color: #00cc00; ">;</span>&nbsp;\<br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">if</span><span style="color: #00cc00; ">(</span>CONFIG_<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>X<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_DEMUXER<span style="color: #00cc00; ">)</span>&nbsp;av_register_input_format<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">&amp;</span>x<span style="color: #00cc00; ">#</span><span style="color: #00cc00; ">#</span>_demuxer<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;<span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00cc00; ">#</span><span style="color: #ff0000; ">define</span>&nbsp;REGISTER_MUXDEMUX<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span>&nbsp;REGISTER_MUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span>&nbsp;REGISTER_DEMUXER<span style="color: #00cc00; ">(</span>X<span style="color: #00cc00; ">,</span>x<span style="color: #00cc00; ">)</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<div><br />
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #00ff00; ">void</span>&nbsp;av_register_all<span style="color: #00cc00; ">(</span><span style="color: #00ff00; ">void</span><span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* 省略部分代码 */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* protocols */</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;REGISTER_MUXDEMUX&nbsp;<span style="color: #00cc00; ">(</span>H264<span style="color: #00cc00; ">,</span>&nbsp;h264<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff9900; ">/* 省略部分代码 */</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
<br />
<div><span style="font-size: 16px; "><span style="font-size: 13px; ">把注册格式函数也贴出来吧:</span></span></div>
<div><br />
</div>
</div>
<table cellpadding="0" cellspacing="0" width="95%" bgcolor="#f1f1f1" border="1" bordercolor="#999999" style="border-collapse: collapse; ">
    <tbody>
        <tr>
            <td>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #ff9900; ">/** head of registered input format linked list */</span><br />
            AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span>first_iformat&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #ff9900; ">/** head of registered output format linked list */</span><br />
            AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span>first_oformat&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span></code></p>
            <p style="margin-right: 5px; margin-left: 5px; line-height: 21px; "><code><span style="color: #0000cc; "><br />
            </span><span style="color: #00ff00; ">void</span>&nbsp;av_register_input_format<span style="color: #00cc00; ">(</span>AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span>format<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVInputFormat&nbsp;<span style="color: #00cc00; ">*</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span>first_iformat<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">while</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">!</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">)</span>&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;format<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;format<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span><br />
            <br />
            <span style="color: #00ff00; ">void</span>&nbsp;av_register_output_format<span style="color: #00cc00; ">(</span>AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span>format<span style="color: #00cc00; ">)</span><br />
            <span style="color: #00cc00; ">{</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;AVOutputFormat&nbsp;<span style="color: #00cc00; ">*</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span>first_oformat<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00ff00; ">while</span>&nbsp;<span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">!</span><span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">)</span>&nbsp;p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #00cc00; ">&amp;</span><span style="color: #00cc00; ">(</span><span style="color: #00cc00; ">*</span>p<span style="color: #00cc00; ">)</span><span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #00cc00; ">*</span>p&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;format<span style="color: #00cc00; ">;</span><br />
            &nbsp;&nbsp;&nbsp;&nbsp;format<span style="color: #00cc00; ">-</span><span style="color: #00cc00; ">&gt;</span>next&nbsp;<span style="color: #00cc00; ">=</span>&nbsp;<span style="color: #ff0000; ">NULL</span><span style="color: #00cc00; ">;</span><br />
            <span style="color: #00cc00; ">}</span></code></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.cppblog.com/Khan/aggbug/196233.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:24 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196233.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之二(文件协议)(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:21:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196232.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196232.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196232.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196232.html</trackback:ping><description><![CDATA[<div><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">(不知原始出处, 方便请告知, 此处转载于&nbsp;</span><span style="color: #aaaaaa; font-family: georgia, Verdana, Helvetica, Arial; font-size: 13px; line-height: 18px; text-align: justify; ">http://hi.baidu.com/monkeyifox</span><span style="font-size: 13px; line-height: 18px; text-align: justify; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">)</span></div>
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><br />
</span></div>
URL协议结构:</span>
<p style="margin-right: 5px; margin-left: 5px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; line-height: 19px; font-size: 10pt; "><code>typedef struct URLProtocol {<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;const char *name;<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_open)(URLContext *h, const char *url, int flags);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_read)(URLContext *h, unsigned char *buf, int size);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_write)(URLContext *h, unsigned char *buf, int size);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int64_t (*url_seek)(URLContext *h, int64_t pos, int whence);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_close)(URLContext *h);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;struct URLProtocol *next;<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_read_pause)(URLContext *h, int pause);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int64_t (*url_read_seek)(URLContext *h, int stream_index,<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int64_t timestamp, int flags);<br style="font-size: 10pt; " />
&nbsp;&nbsp;&nbsp;&nbsp;int (*url_get_file_handle)(URLContext *h);<br style="font-size: 10pt; " />
} URLProtocol;</code></p>
<code style="color: #454545; background-color: #ffffff; "><br />
</code><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "></span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">libavformat/file.c文件的file协议:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>static int file_open(URLContext *h, const char *filename, int flags)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int access;<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; av_strstart(filename, "file:", &amp;filename);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (flags &amp; URL_RDWR) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_CREAT | O_TRUNC | O_RDWR;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else if (flags &amp; URL_WRONLY) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_CREAT | O_TRUNC | O_WRONLY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access = O_RDONLY;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
#ifdef O_BINARY<br />
&nbsp;&nbsp;&nbsp;&nbsp; access |= O_BINARY;<br />
#endif<br />
&nbsp;&nbsp;&nbsp;&nbsp; fd = open(filename, access, 0666);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (fd == -1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return AVERROR(errno);<br />
&nbsp;&nbsp;&nbsp;&nbsp; h-&gt;priv_data = (void *) (intptr_t) fd;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}<br />
<br />
static int file_read(URLContext *h, unsigned char *buf, int size)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return read(fd, buf, size);<br />
}<br />
<br />
static int file_write(URLContext *h, unsigned char *buf, int size)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return write(fd, buf, size);<br />
}<br />
<br />
/* XXX: use llseek */<br />
static int64_t file_seek(URLContext *h, int64_t pos, int whence)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (whence == AVSEEK_SIZE) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct stat st;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int ret = fstat(fd, &amp;st);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ret &lt; 0 ? AVERROR(errno) : st.st_size;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;return lseek(fd, pos, whence);<br />
}<br />
<br />
static int file_close(URLContext *h)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int fd = (intptr_t) h-&gt;priv_data;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return close(fd);<br />
}<br />
<br />
static int file_get_handle(URLContext *h)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return (intptr_t) h-&gt;priv_data;<br />
}<br />
<br />
URLProtocol file_protocol = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;"file",<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_open,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_read,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_write,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_seek,<br />
&nbsp;&nbsp;&nbsp;&nbsp; file_close,<br />
&nbsp;&nbsp;&nbsp;&nbsp;.url_get_file_handle = file_get_handle,<br />
};<br />
</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">libavformat/allformats.c文件的av_register_all函数注册了file协议:</span>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_PROTOCOL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern URLProtocol x##_protocol; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PROTOCOL) av_register_protocol(&amp;x##_protocol); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void av_register_all(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 省略部分代码 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* protocols */<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PROTOCOL (FILE, file);<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 省略部分代码 */<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">把注册协议函数也贴出来吧:</span>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>URLProtocol *first_protocol = NULL;</code></p>
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code><br />
int av_register_protocol(URLProtocol *protocol)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; URLProtocol **p;<br />
&nbsp;&nbsp;&nbsp;&nbsp; p = &amp;first_protocol;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (*p != NULL) p = &amp;(*p)-&gt;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;*p = protocol;<br />
&nbsp;&nbsp;&nbsp;&nbsp; protocol-&gt;next = NULL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br />
}</code></p>
<img src ="http://www.cppblog.com/Khan/aggbug/196232.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:21 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196232.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg分析系列之一(注册该注册的)(转载)</title><link>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 17:18:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196231.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/14/196231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196231.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196231.html</trackback:ping><description><![CDATA[<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;(不知原始出处, 方便请告知, 此处转载于 </span>http://hi.baidu.com/monkeyifox<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">)</span>
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><br />
</span></div>
<div><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">hello，各位好，本人是一名嵌入式软件工程师，目前正使用ffmpeg开发一款嵌入式多媒体播放器，《ffmpeg分析》系列博文是本人在阅读ffmpeg源代码时所做的笔记，希望对各位有点帮助。分析过程结合下面的例程：&nbsp;&nbsp;&nbsp;&nbsp;</span><a href="http://dranger.com/ffmpeg/tutorial05.c" style="color: #3fa7cb; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">http://dranger.com/ffmpeg/tutorial05.c</a><span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;一. 调用av_register_all函数注册所有的格式和编码解码器. 1.1 先调用avcodec_register_all函数注册所有的编码解码器. 1. 下面列出与H264相关的注册:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>&nbsp;&nbsp; // 注册硬件加速器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_HWACCEL (H264_DXVA2, h264_dxva2);<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_HWACCEL (H264_VAAPI, h264_vaapi);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册解码器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_DECODER (H264, h264);<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_DECODER (H264_VDPAU, h264_vdpau);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册编码器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_ENCODER (LIBX264, libx264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册分析器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PARSER (H264, h264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册位流分离器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">2. 下面列出注册宏:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_HWACCEL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVHWAccel x##_hwaccel; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_HWACCEL) av_register_hwaccel(&amp;x##_hwaccel); }<br />
<br />
#define REGISTER_ENCODER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodec x##_encoder; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_ENCODER) avcodec_register(&amp;x##_encoder); }<br />
<br />
#define REGISTER_DECODER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodec x##_decoder; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_DECODER) avcodec_register(&amp;x##_decoder); }<br />
<br />
#define REGISTER_ENCDEC(X,x) REGISTER_ENCODER(X,x); REGISTER_DECODER(X,x)<br />
<br />
#define REGISTER_PARSER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVCodecParser x##_parser; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PARSER) av_register_codec_parser(&amp;x##_parser); }<br />
<br />
#define REGISTER_BSF(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extern AVBitStreamFilter x##_bsf; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_BSF) av_register_bitstream_filter(&amp;x##_bsf); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">3. 分析一下注册函数, 以avcodec_register函数为例:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void avcodec_register(AVCodec *codec)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp; AVCodec **p;<br />
&nbsp;&nbsp;&nbsp;&nbsp; avcodec_init();<br />
&nbsp;&nbsp;&nbsp;&nbsp; p = &amp;first_avcodec;<br />
&nbsp;&nbsp;&nbsp;&nbsp;while (*p != NULL) p = &amp;(*p)-&gt;next;<br />
&nbsp;&nbsp;&nbsp;&nbsp;*p = codec;<br />
&nbsp;&nbsp;&nbsp;&nbsp; codec-&gt;next = NULL;<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 可以看到avcodec_register函数把输入的AVCodec连成一个链表, 其它注册函数与之类似, 就不多言了.</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">4. 上面调用了avcodec_init函数:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>void avcodec_init(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;static int initialized = 0;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (initialized != 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />
&nbsp;&nbsp;&nbsp;&nbsp; initialized = 1;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp; dsputil_static_init ();<br />
}</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 这个函数只会真正执行一次. 5. 上面调用了dsputil_static_init函数:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>av_cold void dsputil_static_init(void)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int i;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;256;i++) ff_cropTbl[i + MAX_NEG_CROP] = i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;MAX_NEG_CROP;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_cropTbl[i] = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_cropTbl[i + MAX_NEG_CROP + 256] = 255;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt;512;i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ff_squareTbl[i] = (i - 256) * (i - 256);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0; i&lt;64; i++) inv_zigzag_direct16[ff_zigzag_direct[i]]= i+1;<br />
}</code></p>
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; &nbsp;&nbsp; 可以看到, 它初始化了一些静态数据. 1.2 注册所有的格式和外部库及协议.</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">1. 下面列出与H264相关的注册:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>&nbsp;&nbsp; // 注册分离器和混合器<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_MUXDEMUX (H264, h264);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// 注册文件协议<br />
&nbsp;&nbsp;&nbsp;&nbsp; REGISTER_PROTOCOL (FILE, file);</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">2. 下面列出注册宏:</span><br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<p style="margin: 0px; padding: 0px; color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; "><code>#define REGISTER_MUXER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern AVOutputFormat x##_muxer; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_MUXER) av_register_output_format(&amp;x##_muxer); }<br />
<br />
#define REGISTER_DEMUXER(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern AVInputFormat x##_demuxer; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_DEMUXER) av_register_input_format(&amp;x##_demuxer); }<br />
<br />
#define REGISTER_MUXDEMUX(X,x) REGISTER_MUXER(X,x); REGISTER_DEMUXER(X,x)<br />
<br />
#define REGISTER_PROTOCOL(X,x) { \<br />
&nbsp;&nbsp;&nbsp;&nbsp;extern URLProtocol x##_protocol; \<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(CONFIG_##X##_PROTOCOL) av_register_protocol(&amp;x##_protocol); }</code></p>
<br style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; " />
<span style="color: #454545; font-family: tahoma, helvetica, arial; background-color: #ffffff; ">&nbsp;&nbsp; 这些注册函数与avcodec_register函数类似, 就不多言了.</span>
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&amp;file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
</div><img src ="http://www.cppblog.com/Khan/aggbug/196231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-14 01:18 <a href="http://www.cppblog.com/Khan/archive/2012/12/14/196231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ffmpeg for ios 交叉编译 (支持i686 armv7 armv7s) 包含lame支持</title><link>http://www.cppblog.com/Khan/archive/2012/12/13/196216.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 13 Dec 2012 08:45:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2012/12/13/196216.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/196216.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2012/12/13/196216.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/196216.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/196216.html</trackback:ping><description><![CDATA[<div>
<div><br />
</div>
</div>
<div><br />
</div>
<div>
<div>由于项目还需要mp3 音频编码, &nbsp;所以先需要下载lame源码搭建交叉环境, 在lame目录下录入如下编译脚本 &nbsp;</div>
<div>build.sh</div>
<div>
<div style="padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; width: 1088px; word-break: break-all; "><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">!&nbsp;/bin/sh</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;SDK_VERSION=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">6.0</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;rm&nbsp;-rf&nbsp;build<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #0000ff; ">mkdir</span>&nbsp;build<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;function&nbsp;build_lame()<br />
<span style="color: #008080; ">10</span>&nbsp;{<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;distclean<br />
<span style="color: #008080; ">12</span>&nbsp;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;./configure&nbsp;\<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFLAGS=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">-isysroot&nbsp;/Applications/Xcode.app/Contents/Developer/Platforms/${SDK}.platform/Developer/SDKs/${SDK}${SDK_VERSION}.sdk</span><span style="font-weight: bold; ">"</span>&nbsp;\<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CC=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">/Applications/Xcode.app/Contents/Developer/Platforms/${SDK}.platform/Developer/usr/bin/gcc&nbsp;-arch&nbsp;${PLATFORM}</span><span style="font-weight: bold; ">"</span>&nbsp;\<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--prefix=/Users/khan/Downloads/lame-<span style="color: #800000; ">3.99</span>.<span style="color: #800000; ">5</span>&nbsp;\<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--host=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">arm-apple-darwin9</span><span style="font-weight: bold; ">"</span>&nbsp;\<br />
<span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--disable-shared&nbsp;\<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--enable-static&nbsp;\<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--disable-decoder&nbsp;\<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--disable-frontend<br />
<span style="color: #008080; ">22</span>&nbsp;<br />
<span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cp&nbsp;<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">libmp3lame/.libs/libmp3lame.a</span><span style="font-weight: bold; ">"</span>&nbsp;<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">build/libmp3lame-${PLATFORM}.a</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">25</span>&nbsp;}<br />
<span style="color: #008080; ">26</span>&nbsp;<br />
<span style="color: #008080; ">27</span>&nbsp;PLATFORM=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">i686</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">28</span>&nbsp;SDK=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">iPhoneSimulator</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">29</span>&nbsp;build_lame<br />
<span style="color: #008080; ">30</span>&nbsp;<br />
<span style="color: #008080; ">31</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">armv6和armv7&nbsp;比较难共存<br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #008000; ">#PLATFORM="armv6"<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #008000; ">#SDK="iPhoneOS"<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #008000; ">#build_lame</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #008000; "></span><br />
<span style="color: #008080; ">36</span>&nbsp;PLATFORM=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">armv7</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">37</span>&nbsp;SDK=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">iPhoneOS</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">38</span>&nbsp;build_lame<br />
<span style="color: #008080; ">39</span>&nbsp;<br />
<span style="color: #008080; ">40</span>&nbsp;PLATFORM=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">armv7s</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">41</span>&nbsp;SDK=<span style="font-weight: bold; ">"</span><span style="font-weight: bold; ">iPhoneOS</span><span style="font-weight: bold; ">"</span><br />
<span style="color: #008080; ">42</span>&nbsp;build_lame<br />
<span style="color: #008080; ">43</span>&nbsp;<br />
<span style="color: #008080; ">44</span>&nbsp;lipo&nbsp;-create&nbsp;build/*&nbsp;-output&nbsp;build/libmp3lame.a</div>
</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div>
<div>首先去https://github.com/yuvi/gas-preprocessor/</div>
<div>下载gas-preprocessor.pl, 然后 复制到 /usr/sbin/目录下(当然, 你可以放在任何目录下, 只要保证--as='/${path}/gas-preprocessor.pl'路径正确)<br />
<br />
<div>http://ffmpeg.org/download.html 下载ffmpeg源码,&nbsp;git或者直接下载<br />
<br />
终端执行以下指令<br />
</div>
</div>
<div>#armv7s</div>
<div>./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-pic --enable-cross-compile --enable-decoder=h264&nbsp;--enable-libmp3lame&nbsp;\</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --arch=arm --disable-asm \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --cpu=cortex-a8 \</div>
<div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-cflags='-arch&nbsp;armv7s -I/Users/khan/Downloads/lame-3.99.5/include ' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-ldflags='-arch&nbsp;armv7s -L/Users/khan/Downloads/lame-3.99.5/build -lmp3lame &nbsp;-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk' \</div>
</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --prefix=/Users/khan/Downloads/ffmpeg/arm7s.lib<br />
make<br />
make install<br />
<br />
make clean</div>
<div>#armv7</div>
<div>./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-pic --enable-cross-compile --enable-decoder=h264&nbsp;--enable-libmp3lame&nbsp;\</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --disable-asm &nbsp;--arch=arm \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --cpu=cortex-a8 \</div>
<div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-cflags='-arch&nbsp;armv7&nbsp;-I/Users/khan/Downloads/lame-3.99.5/include ' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-ldflags='-arch&nbsp;armv7&nbsp;-L/Users/khan/Downloads/lame-3.99.5/build -lmp3lame &nbsp;-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk' \</div>
</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --prefix=/Users/khan/Downloads/ffmpeg/arm7.lib<br />
make<br />
make install<br />
<br />
make clean</div>
<div>#i686</div>
<div>
<div>./configure --disable-doc --disable-ffmpeg --disable-ffplay --disable-ffserver --enable-pic --enable-cross-compile --enable-decoder=h264 --enable-libmp3lame \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --disable-asm --arch=i686 --cpu=i686 --disable-armv5te \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --target-os=darwin --cc=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --as='gas-preprocessor.pl /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/gcc' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --sysroot=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-ldflags=-L/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.0.sdk/usr/lib/system \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-cflags='-arch i686 -I/Users/khan/Downloads/lame-3.99.5/include ' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --extra-ldflags='-arch i686 -L/Users/khan/Downloads/lame-3.99.5/build -lmp3lame ' \</div>
<div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; --prefix=/Users/khan/Downloads/ffmpeg/i686.lib</div>
</div>
<div>
<br />
make<br />
make install<br />
make clean<br />
<br />
--prefix=/Users/khan/Downloads/ffmpeg/i686.lib/里为编译后的目标文件<br />
然后将各个目录下的lib lipo一下 就可以同时在模拟器和各种该指令集的真机上运行了<br />
<br />
<div>lipo -create i686.lib/lib/libavcodec.a arm7.lib/lib/libavcodec.a arm7s.lib/lib/libavcodec.a &nbsp; &nbsp; &nbsp; -output build/libavcodec.a</div>
<div>lipo -create i686.lib/lib/libavdevice.a arm7.lib/lib/libavdevice.a arm7s.lib/lib/libavdevice.a &nbsp; &nbsp;-output build/libavdevice.a</div>
<div>lipo -create i686.lib/lib/libavfilter.a arm7.lib/lib/libavfilter.a arm7s.lib/lib/libavfilter.a &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -output build/libavfilter.a</div>
<div>lipo -create i686.lib/lib/libavformat.a arm7.lib/lib/libavformat.a arm7s.lib/lib/libavformat.a &nbsp;-output build/libavformat.a<br />
<div>lipo -create i686.lib/lib/libavutil.a arm7.lib/lib/libavutil.a arm7s.lib/lib/libavutil.a &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; -output build/libavutil.a</div>
<div>lipo -create i686.lib/lib/libswresample.a arm7.lib/lib/libswresample.a arm7s.lib/lib/libswresample.a &nbsp; -output build/libswresample.a</div>
<div>lipo -create i686.lib/lib/libswscale.a arm7.lib/lib/libswscale.a arm7s.lib/lib/libswscale.a &nbsp; &nbsp; &nbsp; &nbsp; -output build/libswscale.a</div>
</div>
</div>
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div><br />
</div>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><br />
</div><img src ="http://www.cppblog.com/Khan/aggbug/196216.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2012-12-13 16:45 <a href="http://www.cppblog.com/Khan/archive/2012/12/13/196216.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IOS 4.2 AirPrint调用</title><link>http://www.cppblog.com/Khan/archive/2011/10/20/158744.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 20 Oct 2011 05:20:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/10/20/158744.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/158744.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/10/20/158744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/158744.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/158744.html</trackback:ping><description><![CDATA[<div><div>#pragma mark -</div><div>#pragma mark Application lifecycle</div><div>#define pdfUrl&nbsp;</div><div>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { &nbsp; &nbsp;</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; // Override point for customization after application launch.</div><div>#if __IPHONE_OS_VERSION_MAX_ALLOWED &gt; 40100</div><div></div><div><span style="white-space:pre">		</span>UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];</div><div><span style="white-space:pre">		</span>UIPrintInfo *printInfo = [UIPrintInfo printInfo];</div><div><span style="white-space:pre">		</span>printInfo.outputType = UIPrintInfoOutputGeneral;</div><div><span style="white-space:pre">		</span>printInfo.jobName = @"Air Print test";</div><div><span style="white-space:pre">		</span>printInfo.duplex = UIPrintInfoDuplexLongEdge;</div><div><span style="white-space:pre">		</span>controller.printInfo = printInfo;</div><div><span style="white-space:pre">		</span>controller.showsPageRange = YES;</div><div><span style="white-space:pre">		</span>controller.printingItem = @"asfasdf";</div><div></div><div><span style="white-space:pre">		</span>void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) =</div><div><span style="white-space:pre">		</span>^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {</div><div><span style="white-space:pre">			</span>//self.content = nil;</div><div><span style="white-space:pre">			</span>if (!completed &amp;&amp; error)</div><div><span style="white-space:pre">				</span>NSLog(@"FAILED! due to error in domain %@ with error code %u",</div><div><span style="white-space:pre">					</span> &nbsp;error.domain, error.code);</div><div><span style="white-space:pre">		</span>};</div><div>//<span style="white-space:pre">		</span></div><div>//<span style="white-space:pre">		</span>if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {</div><div>//<span style="white-space:pre">			</span>[controller presentFromRect:printBtn.frame</div><div>//<span style="white-space:pre">								</span> inView:self.view</div><div>//<span style="white-space:pre">							</span> &nbsp; animated:YES</div><div>//<span style="white-space:pre">					</span> &nbsp;completionHandler:completionHandler];</div><div>//<span style="white-space:pre">		</span>} else {</div><div><span style="white-space:pre">			</span>[controller presentAnimated:YES completionHandler:completionHandler];</div><div><span style="white-space:pre">	</span>//<span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div>#endif</div><div><span style="white-space:pre">	</span></div><div>&nbsp; &nbsp; [self.window makeKeyAndVisible];</div><div>&nbsp; &nbsp;&nbsp;</div><div>&nbsp; &nbsp; return YES;</div><div>}</div></div><div></div><img src ="http://www.cppblog.com/Khan/aggbug/158744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-10-20 13:20 <a href="http://www.cppblog.com/Khan/archive/2011/10/20/158744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于iphone accessory的理解</title><link>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Sun, 09 Oct 2011 06:47:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/157871.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/10/09/157871.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/157871.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/157871.html</trackback:ping><description><![CDATA[转载自cocoachina&nbsp;<a href="http://www.cocoachina.com/">http://www.cocoachina.com<br /><br /></a><font class="Apple-style-span" face="Verdana" size="2"><div><div><span style="line-height: normal;">首先，如果我们的应用程序想跟外设传输数据，先要透过iphone的操作系统，也就是iphoneOS，而最开始的认证过程也是在外设和iphoneOS之间发生的，苹果为这个过程提供了一颗认证芯片(这颗芯片的作用是用来让iphoneOS识别这个外设是经过苹果公司承认的，他的通信方式是I2C总线，而且每出一个产品苹果都会收几美元的认证费用，苹果用心何其毒也~~~)</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; IphoneOS承认外设分两个步骤，识别和认证，我们先说说识别过程。</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 识别过程是使用纯物理连接来实现的，在这个过程中iphone的30pin有三个引脚被用到，分别是Accessory Identify，Accessory Detect，Accessory Power，Accessory Identify接549k欧姆的电阻，告知iphoneOS使用串口通信，Accessory Detect直接接地，告知iphoneOS有外设插入，Accessory Power相当于iphoneOS的信号，待机时这个引脚没有输出，否则会有3.3V的电压输出。如果按照以上连接就完成了识别过程。</span></div><div><span style="line-height: normal;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;下面开始认证过程，认证过程也叫IDPS过程，这些就牵扯到苹果指定的通信协议了，苹果给自己的通信协议起了一个名字叫Lingo，Lingo分好多种有音频的lingo还有显示遥控的lingo，而我们认证使用的lingo叫做General Lingo。可能大家这时有点晕，那我就给大家看一个iphone的命令包。</span></div><div><span style="line-height: normal;">StartIDPS packet</span></div><div><span style="line-height: normal;">Byte &nbsp; &nbsp; Value &nbsp; &nbsp;Comment</span></div><div><span style="line-height: normal;">0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XFF &nbsp; &nbsp;Sync byte（required only for UART serial）</span></div><div><span style="line-height: normal;">1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X55 &nbsp; &nbsp;Start of packet(SOP)</span></div><div><span style="line-height: normal;">2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;Length of packet payload</span></div><div><span style="line-height: normal;">3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X00 &nbsp; &nbsp;General Lingo</span></div><div><span style="line-height: normal;">4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0X38 &nbsp; &nbsp;StartIDPS</span></div><div><span style="line-height: normal;">5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;transID [bit 15:8] Transaction ID&nbsp;</span></div><div><span style="line-height: normal;">6 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;transID [bit 7:0]</span></div><div><span style="line-height: normal;">7 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;0XNN &nbsp; &nbsp;校验</span></div><div><span style="line-height: normal;">这是iphone的命令包，大家看到这个应该就明白了。开始IDPS过程首先要发送StartIDPS命令，这样，外设与iphoneOS之间的认证过程就开始了。其中咱们应用中EAAccessory关于一些外设的属性，都是在这个过程中外设发给操作系统的，具体还是大家加入苹果的mfi(made for ipod)，拿到资料后，才能更明白。稍后我会将iphone串口通信的源码发出来。</span></div><div><span style="line-height: normal;"><br /></span></div><div><span style="line-height: normal;">MFI地址：http://developer.apple.com/programs/mfi/<br /><br /><br /><br />以下部分转载自&lt;iphone应用编程指南&gt;</span></div></div></font><span class="Apple-style-span" style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; line-height: normal; background-color: #ffffff; "><h2 class="jump section2" style="margin-top: 1.75em; font-size: 22px; color: #3c4c6c; padding-bottom: 2px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #5088c5; ">和配件进行通讯</h2><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在iPhone OS 3.0及之后的系统上，External Accessory<dfn class="pediaLink"><span class="pediaLink" data-header="框架" data-contents="框架是一个包含共享库及相关资源（比如nib文件、图像文件、和头文件）的程序包（即一个具有特定结构的目录）。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Framework.html#//apple_ref/doc/uid/TP40008195-CH56" target="_top" style="color: #3366cc; text-decoration: none; ">框架</a></span></dfn><code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">（ExternalAccessory.framework</code>）提供了一种管道机制，使应用程序可以和iPhone或iPod touch设备的配件进行通讯。通过这种管道，应用程序开发者可以将配件级别的功能集成到自己的程序中。</p><div class="notebox clear" style="clear: both; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #5088c5; border-right-color: #5088c5; border-bottom-color: #5088c5; border-left-color: #5088c5; background-color: #ffffff; margin-top: 1.667em; margin-right: 0px; margin-bottom: 1.75em; margin-left: 0px; padding-right: 0.667em; padding-bottom: 0.083em; padding-left: 0.75em; text-align: left; "><p style="margin-top: 0.583em; margin-bottom: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">请注意：</strong>下面部分将向您展示iPhone应用程序如何连接配件。如果您有兴趣成为iPhone或iPod touch配件的开发者，可以在<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; "><a href="http://developer.apple.com/" class="browserLink" style="color: #3366cc; text-decoration: none; ">http://developer.apple.com</a></span>网站上找到相应的信息。</p></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">为了使用External Accessory框架的接口，您必须将<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">ExternalAccessory.framework</code>加入到Xcode工程，并连接到相应的目标中。此外，还需要在相应的源代码文件的顶部包含一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">#import &lt;ExternalAccessory/ExternalAccessory.h&gt;</code>语句，才能访问该框架的类和头文件。有关如何为工程添加框架的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/index.html#//apple_ref/doc/uid/TP40006917" target="_top" style="color: #3366cc; text-decoration: none; ">Xcode工程管理指南</a></em>中的<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; "><a href="http://developer.apple.com/iphone/library/documentation/DeveloperTools/Conceptual/XcodeProjectManagement/040-Files_in_Projects/project_files.html#//apple_ref/doc/uid/TP40002666" target="_top" style="color: #3366cc; text-decoration: none; ">工程中的文件</a></span>部分；有关External Accessory框架中类的一般信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/ExternalAccessoryFrameworkReference/index.html#//apple_ref/doc/uid/TP40008235" target="_top" style="color: #3366cc; text-decoration: none; ">External Accessory框架参考</a></em>。</p><br /><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">配件的基础</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在和配件进行通讯之前，需要与配件的制造商紧密合作，理解配件提供的服务。制造商必须在配件的硬件中加入显式的支持，才能和iPhone OS进行通讯。作为这种支持的一部分，配件必须支持至少一种命令<strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">协议</strong>，也就是支持一种定制的通讯模式，使配件和应用程序之间可以进行数据传输。苹果并不维护一个协议的注册表，支持何种协议及是否使用其他制造商支持的定制或标准协议是由制造商自行决定的。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">作为和配件制造商通讯的一部分，您必须找出给定的配件支持什么协议。为了避免名字空间发生冲突，协议的名称由反向的DNS字符串来指定，形式是<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">com.apple.myProtocol</code>。这使得每个配件制造商都可以根据自己的需要定义协议，以支持不同的配件产品线。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">应用程序通过打开一个使用指定协议的会话来和配件进行通讯。打开会话的方法是创建一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EASession_class/Reference/Reference.html#//apple_ref/occ/cl/EASession" target="_top" style="color: #3366cc; text-decoration: none; ">EASession</a></code>类的实例，该类中包含<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSInputStream_Class/Reference/Reference.html#//apple_ref/occ/cl/NSInputStream" target="_top" style="color: #3366cc; text-decoration: none; ">NSInputStream</a></code>和<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSOutputStream_Class/Reference/Reference.html#//apple_ref/occ/cl/NSOutputStream" target="_top" style="color: #3366cc; text-decoration: none; ">NSOutputStream</a></code>对象，可以和配件进行通讯。通过这些流对象，应用程序可以向配件发送未经加工的数据包，以及接收来自配件的类似数据包。因此，您必须按照期望的协议来理解每个数据包的格式。</p><a name="//apple_ref/doc/uid/TP40007072-CH14-SW26" title="Declaring the Protocols Your Application Supports" style="color: #3366cc; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">声明应用程序支持的协议</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">能够和配件通讯的应用程序应该在其<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">Info.plist</code>文件中声明支持的协议，使系统知道在相应的配件接入时，该应用程序可以被启动。如果当前没有应用程序可以支持接入的配件，系统可以选择启动App Store并指向支持该设备的应用程序。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">为了声明支持的协议，您必须在应用程序的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">Info.plist</code>文件中包含<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">UISupportedExternalAccessoryProtocols</code>键。该键包含一个字符串<dfn class="pediaLink"><span class="pediaLink" data-header="群体" data-contents="群体是Foundation框架中的一种对象，其主要作用是将对象存储为数组、字典、和集合。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Collection.html#//apple_ref/doc/uid/TP40008195-CH10" target="_top" style="color: #3366cc; text-decoration: none; ">数组</a></span></dfn>，用于标识应用程序支持的通讯协议。您的应用程序可以在这个列表中以任意顺序包含任意数量的协议。系统并不使用这个列表来确定应用程序应该选择哪个协议，而只是用它来确定应用程序是否能够和相应的配件进行通讯。您的代码需要在开始和配件进行对话时选择适当的通讯协议。</p><a name="//apple_ref/doc/uid/TP40007072-CH14-SW27" title="Connecting to an Accessory at Runtime" style="color: #3366cc; text-decoration: none; width: 20px; height: 20px; text-indent: 20px; background-image: url(http://www.cppblog.com/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif); background-repeat: no-repeat no-repeat; "></a><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">在运行时连接配件</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在配件接入系统并做好通讯准备之前，通过External Accessory框架无法看到配件。当配件变为可见时，您的应用程序就可以获取相应的配件对象，然后用其支持的一或多个协议打开会话。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">共享的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/occ/cl/EAAccessoryManager" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryManager</a></code>对象为应用程序寻找与之通讯的配件提供主入口点。该类包含一个已经接入的配件对象的数组，您可以对其进行<dfn class="pediaLink"><span class="pediaLink" data-header="枚举" data-contents="枚举是顺序操作某个对象元素的过程&#8212;该对象通常是一个集合&#8212;每个元素最多操作一次，每次操作一个元素。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Enumeration.html#//apple_ref/doc/uid/TP40008195-CH17" target="_top" style="color: #3366cc; text-decoration: none; ">枚举</a></span></dfn>，看看是否存在应用程序支持的配件。<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessory_class/Reference/Reference.html#//apple_ref/occ/cl/EAAccessory" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessory</a></code>对象中的绝大多数信息（比如名称、制造商、和型号信息）都只是用于显示。如果您要确定应用程序是否可以连接一个配件，必须看配件的协议，确认应用程序是否支持其中的某个协议。</p><div class="notebox clear" style="clear: both; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #5088c5; border-right-color: #5088c5; border-bottom-color: #5088c5; border-left-color: #5088c5; background-color: #ffffff; margin-top: 1.667em; margin-right: 0px; margin-bottom: 1.75em; margin-left: 0px; padding-right: 0.667em; padding-bottom: 0.083em; padding-left: 0.75em; text-align: left; "><p style="margin-top: 0.583em; margin-bottom: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">请注意：</strong>多个配件对象支持同一协议是可能的。如果发生这种情况，您的代码必须负责选择使用哪个配件对象。</p></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">对于给定的配件对象，每次只能有一个指定协议的会话。<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">EAAccessory</code>对象的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessory_class/Reference/Reference.html#//apple_ref/occ/instp/EAAccessory/protocolStrings" target="_top" style="color: #3366cc; text-decoration: none; ">protocolStrings</a></code>属性包含一个<dfn class="pediaLink"><span class="pediaLink" data-header="群体" data-contents="群体是Foundation框架中的一种对象，其主要作用是将对象存储为数组、字典、和集合。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Collection.html#//apple_ref/doc/uid/TP40008195-CH10" target="_top" style="color: #3366cc; text-decoration: none; ">字典</a></span></dfn>，字典的键是配件支持的协议。如果您试图用一个已经在使用的协议创建会话，External Accessory框架就会产生错误。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; "><span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; ">程序清单8-1</span>展示了如何检查接入配件的列表并从中取得应用程序支持的第一个配件。它为指定的协议创建一个会话，并对会话的输入和输出流进行配置。在这个方法返回会话对象时，已经完成和配件的连接，并可以开始发送和接收数据了。</p><br /><p class="codesample clear" style="margin-top: 1.667em; margin-bottom: -0.85em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; clear: both; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">程序清单8-1&nbsp;&nbsp;</strong>创建和配件的通讯会话<br /><br /></p><div><div>- (EASession *)openSessionForProtocol:(NSString *)protocolString{</div><div>&nbsp; &nbsp; NSArray *accessories = [[EAAccessoryManager sharedAccessoryManager]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;connectedAccessories];</div><div>&nbsp; &nbsp; EAAccessory *accessory = nil;</div><div>&nbsp; &nbsp; EASession *session = nil;</div><div>&nbsp;</div><div>&nbsp; &nbsp; for (EAAccessory *obj in accessories) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if ([[obj protocolStrings] containsObject:protocolString]) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; accessory = obj;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp;</div><div>&nbsp; &nbsp; if (accessory) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; session = [[EASession alloc] initWithAccessory:accessory</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forProtocol:protocolString];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; if (session) {</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] setDelegate:self];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forMode:NSDefaultRunLoopMode];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session inputStream] open];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] setDelegate:self];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] scheduleInRunLoop:[NSRunLoop currentRunLoop]</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;forMode:NSDefaultRunLoopMode];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[session outputStream] open];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [session autorelease];</div><div>&nbsp; &nbsp; &nbsp; &nbsp; }</div><div>&nbsp; &nbsp; }</div><div>&nbsp; &nbsp; return session;</div><div>}</div></div><p>&nbsp;</p><div class="codesample clear" style="clear: both; font-size: 12px; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "></div><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">在配置好输入输出流之后，最好一步就是处理和流相关的数据了。程序清单<span class="content_text" style="margin-top: 0px; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; margin-bottom: 0.833em; padding-bottom: 0.833em; vertical-align: top; ">8-2</span>展示了在<dfn class="pediaLink"><span class="pediaLink" data-header="委托" data-contents="委托是一种简单而强大的模式。在这种模式中，一个对象可以代表另一个对象进行动作或协调它的行为。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14" target="_top" style="color: #3366cc; text-decoration: none; ">委托</a></span></dfn>方法中处理流事件的基本代码结构。清单中的方法可以响应来自配件输入输出流的事件。当配件向应用程序发送数据时，事件发生表示有数据可供读取；类似地，当配件准备好接收应用程序数据时，也通过事件来表示（当然，您并不一定要等到这个事件发生才向流写出数据，应用程序也可以调用流的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSInputStream_Class/Reference/Reference.html#//apple_ref/occ/instm/NSInputStream/hasBytesAvailable" target="_top" style="color: #3366cc; text-decoration: none; ">hasBytesAvailable</a></code>方法来确认配件是否还能够接收数据）。有关流及如何处理流事件的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Streams/index.html#//apple_ref/doc/uid/10000188i" target="_top" style="color: #3366cc; text-decoration: none; ">Cocoa流编程指南</a></em>。</p><br /><p class="codesample clear" style="margin-top: 1.667em; margin-bottom: -0.85em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; clear: both; "><strong style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 12px; font-weight: bold; ">程序清单8-2&nbsp;&nbsp;</strong>处理流事件<br /><br /></p><div><div>// Handle communications from the streams.</div><div>- (void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent{</div><div>&nbsp; &nbsp; switch (streamEvent){</div><div>&nbsp; &nbsp; &nbsp; &nbsp; case NSStreamHasBytesAvailable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Process the incoming stream data.</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; case NSStreamEventHasSpaceAvailable:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Send the next queued command.</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; default:</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;</div><div>&nbsp; &nbsp; }</div><div>}</div></div><p>&nbsp;</p><div class="codesample clear" style="clear: both; font-size: 12px; margin-top: 1.5em; margin-right: 0px; margin-bottom: 1.5em; margin-left: 0px; "></div><h3 class="jump section3" style="margin-top: 1.5em; margin-bottom: 0.25em; font-size: 17px; color: #000000; ">监控与配件有关的事件</h3><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">当配件接入或断开时，External Accessory框架都可以发送<dfn class="pediaLink"><span class="pediaLink" data-header="通告" data-contents="通告是发给一个或多个观察者对象的消息，目的是通知它们程序中发生的事件。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Notification.html#//apple_ref/doc/uid/TP40008195-CH35" target="_top" style="color: #3366cc; text-decoration: none; ">通告</a></span></dfn>。但是这些通告并不自动发送，如果您的应用程序感兴趣，必须调用EAAccessoryManager类的<a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/occ/instm/EAAccessoryManager/registerForLocalNotifications" target="_top" style="color: #3366cc; text-decoration: none; ">registerForLocalNotifications</a>方法来显式请求。当配件接入、认证、并准备好和应用程序进行交互时，框架可以发出一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/c/data/EAAccessoryDidConnectNotification" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDidConnectNotification</a></code>通告；而当配件断开时，框架则可以发送一个<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryManager_class/Reference/Reference.html#//apple_ref/c/data/EAAccessoryDidDisconnectNotification" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDidDisconnectNotification</a></code>通告。您可以通过缺省的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html#//apple_ref/occ/cl/NSNotificationCenter" target="_top" style="color: #3366cc; text-decoration: none; ">NSNotificationCenter</a></code>来注册接收这些通告。两种通告都包含受影响的配件的信息。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">除了通过缺省的通告中心接收通告之外，当前正在和配件进行交互的应用程序可以为相应的<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; ">EAAccessory</code>对象分配一个<dfn class="pediaLink"><span class="pediaLink" data-header="委托" data-contents="委托是一种简单而强大的模式。在这种模式中，一个对象可以代表另一个对象进行动作或协调它的行为。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14" target="_top" style="color: #3366cc; text-decoration: none; ">委托</a></span></dfn>，使它在发生变化的时候得到通知。委托对象必须遵循<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intf/EAAccessoryDelegate" target="_top" style="color: #3366cc; text-decoration: none; ">EAAccessoryDelegate</a></code><dfn class="pediaLink"><span class="pediaLink" data-header="协议" data-contents="协议用于声明某种编程接口，任何类都可以选择实现这种接口。" style="color: #3366cc; text-decoration: none; font-style: normal; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #3366cc; white-space: nowrap; cursor: pointer; -webkit-transition-property: color, background-color, border-bottom, border-top-left-radius, border-top-right-radius, padding, margin; -webkit-transition-duration: 0.25s; "><a href="http://www.apple.com.cn/developer/iphone/library/documentation/General/Conceptual/DevPedia-CocoaCore/Protocol.html#//apple_ref/doc/uid/TP40008195-CH45" target="_top" style="color: #3366cc; text-decoration: none; ">协议</a></span></dfn>，该协议目前包含名为<code style="font-size: 12px; font-family: Courier, Consolas, monospace; color: #666666; "><a href="http://developer.apple.com/iphone/library/documentation/ExternalAccessory/Reference/EAAccessoryDelegate_protocol/Reference/Reference.html#//apple_ref/occ/intfm/EAAccessoryDelegate/accessoryDidDisconnect:" target="_top" style="color: #3366cc; text-decoration: none; ">accessoryDidDisconnect:</a></code>的可选方法，您可以通过这个方法来接收配件断开通告，而不需要事先配置通告观察者。</p><p style="margin-top: 0px; margin-bottom: 0.833em; font: normal normal normal 100%/normal 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; ">有关如何注册接收通告的更多信息，请参见<em><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/Notifications/index.html#//apple_ref/doc/uid/10000043i" target="_top" style="color: #3366cc; text-decoration: none; ">Cocoa通告编程主题</a></em>。</p></span><font class="Apple-style-span" face="Verdana" size="2"><div><div><span style="line-height: normal;"><br /><br /></span></div></div></font><img src ="http://www.cppblog.com/Khan/aggbug/157871.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-10-09 14:47 <a href="http://www.cppblog.com/Khan/archive/2011/10/09/157871.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ios5 xcode 4.2 中 release 显示编译警告或错误的解决方法</title><link>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 21 Jul 2011 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/151559.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/07/21/151559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/151559.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/151559.html</trackback:ping><description><![CDATA[<span style="font-family: Arial; line-height: 26px; color: #333333; ">
<p><span style="color: red; ">由于 iOS5 xcode4.2 引入了ARC (AutomicReferenceCounting) ， 使用xcode4.2 新建项目时，会有一些小小的变化。</span></p>
<p><span style="color: red; ">&nbsp;&nbsp; NSAutoReleasePool&nbsp; 被&nbsp;@&nbsp;</span><span style="color: red; ">{Autoreleasepool</span>&nbsp;<span style="font-style: italic; color: red; ">/ / Code for autoreleasepool</span>&nbsp;<span style="color: red; ">}</span><span style="color: red; ">&nbsp;block 取代了。</span></p>
<p><span style="color: red; ">&nbsp; 新增了__strong , __weak 编译指令。</span></p>
<p><span style="color: red; ">&nbsp; 如果需要在项目中关闭 ARC 功能，在项目属性中将CLANG_ENABLE_OBJC_ARC&nbsp; 设置为NO即可。否则在编译时，会对 release ,retainCount, retain 等内存相关操作在编译时出现红色警告。</span></p>
<p><br />
</p>
<p><br />
</p>
<p><span style="color: red; ">先不讨论这arc这死人东西好不好. &nbsp;去掉先, &nbsp;不当小白鼠</span></p>
</span><img src ="http://www.cppblog.com/Khan/aggbug/151559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-07-21 16:44 <a href="http://www.cppblog.com/Khan/archive/2011/07/21/151559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>iPhone/Mac Objective-C内存管理教程和原理剖析</title><link>http://www.cppblog.com/Khan/archive/2011/06/29/149723.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Wed, 29 Jun 2011 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2011/06/29/149723.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/149723.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2011/06/29/149723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/149723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/149723.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 版权声明此文版权归作者Vince Yuan (vince.yuan#gmail.com)所有。欢迎非营利性转载，转载时必须包含原始链接http://vinceyuan.cnblogs.com/，且必须包含此版权声明的完整内容。版本&nbsp;1.1&nbsp;&nbsp;发表于2010-03-08前言初学objectice-C的朋友都有一个困惑，总觉得对objective-C的...&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2011/06/29/149723.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/149723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2011-06-29 11:47 <a href="http://www.cppblog.com/Khan/archive/2011/06/29/149723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OCI for Windows 环境手工配置</title><link>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 23 Mar 2010 09:30:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/110361.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2010/03/23/110361.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/110361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/110361.html</trackback:ping><description><![CDATA[本来公司的项目是在linux下处理的. 由于近期人员调动. 需要增加几个新人. 为了让不熟悉linux开发环境的新人能够尽快上手使用公司的基础类库, 所以我承担了搭建windows下的开发环境搭建工作<br><br>其中第一项就是将公司使用的基于oci的封装ocicpp编译出一个mingw32的版本<br><br>1. 必要工具<br>
<h1><span class="topstoryhead">Instant Client Downloads</span><span class="parahead2"> for Microsoft Windows<br></span></h1>
http://www.oracle.com/technology/software/tech/oci/instantclient/htdocs/winsoft.html<br>oracle instant Client<br><br>
<h1><span class="parahead2">mingw32</span></h1>
自行搜索下载地址, 本人使用3.42<br>gcc的win32版本<br><br>
<h1><span class="parahead2"> pexports for mingw32</span></h1>
自行搜索下载地址<br>将c的dll导出为def的工具, 如果你的mingw没有自带. 请自行下载. 并放到path可以找到的地方, 不支持c++的dll. <br><br>以上工具自行安装<br>instantclient解压到D:\Develop\Cplus\instantclient_11_1\<br>mingw32安装到D:\Develop\Cplus\MinGW\<br>pexports.exe解压到D:\Develop\Cplus\MinGW\bin\<br><br><br>2. 生成能被mingw32调用的oci lib<br>由于oracle 官方的oci sdk并无提供可供mingw link的包. 所以我们需要手工根据dll做一个<br><br>使用dll产生mingw32的lib<br>导出def<br>D:\Develop\Cplus\instantclient_11_1\sdk\lib&gt;pexports oci.dll &gt; oci.def<br><br>生成lib<br>D:\Develop\Cplus\instantclient_11_1\sdk\lib&gt;dlltool --dllname oci.dll --def oci.def --output-lib liboci.a<br><br>这样我们就有了一个可以mingw32 link的 liboci.a了<br><br><br>3.配置oracle instant Client<br>只需要3个环境变量<br>TNS_ADMIN=D:\Develop\Cplus\instantclient_11_1<br>NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK<br>PATH=%PATH%;%TNS_ADMIN%\<br><br><br>4.编译执行测试程序.<br>保密协议导致我无法公开ocicpp的源码.<br>但是可以贴基于ocicpp的测试程序<br><br>#include &lt;unistd.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;iostream&gt;<br>#include "ocicpp/ocicpp.h"<br>#include "ocicpp/db.h"<br><br>using&nbsp;&nbsp;&nbsp; namespace&nbsp;&nbsp;&nbsp; OCICPP;<br><br><br>bool InsertDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "INSERT INTO testOCICPP (TestId, UserName, PassWord, Address ) VALUES(13, 'xxxxx', '!@#$1234', 'xxxxx')";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool UpdateDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "UPDATE testOCICPP SET PassWord = '&amp;*()7890'";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "UpdateDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool DelRecordBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "DELETE FROM testOCICPP";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "DelRecordBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br>bool FetchDataBySQL(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br><br>&nbsp;&nbsp;&nbsp; strSQL = "SELECT MEMBERID,MOBILE,PASSWD,ADDRESS FROM tblmember where rownum&lt;20";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;execQuery(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; while (cursor.fetch())&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; ".......... Record .........." &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "TestId: " &lt;&lt; cursor.getInt("MEMBERID") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "UserName: " &lt;&lt; cursor.getStr("MOBILE") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "PassWord: " &lt;&lt; cursor.getStr("PASSWD") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "Address: " &lt;&lt; cursor.getStr("ADDRESS") &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;transCommit();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "FetchDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool InsertDataByProcedure(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; Cursor&nbsp;&nbsp;&nbsp; cursor;<br>&nbsp;&nbsp;&nbsp; string strSQL;<br>&nbsp;&nbsp;&nbsp; int iRetCode=0;<br>&nbsp;&nbsp;&nbsp; strSQL = "BEGIN testProcInsert(13, 'xxxxx', '!@#$1234', 'xxxxx', :RetCode); END;";<br><br>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; pConn-&gt;prepare(strSQL, cursor);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.bind(":RetCode", iRetCode);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.execute();&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cursor.drop();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; catch (OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataBySQL Exception: " &lt;&lt;&nbsp; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return false;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "InsertDataByProcedure RetCode: " &lt;&lt; iRetCode &lt;&lt; endl;<br><br>&nbsp;&nbsp;&nbsp; return true;<br>}<br><br>bool UpdateDataByProcedure(Connection* pConn)<br>{<br><br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>bool DelRecordByProcedure(Connection* pConn)<br>{<br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br><br>bool FetchDataByProcedure(Connection* pConn)<br>{<br><br>&nbsp;&nbsp;&nbsp; return false;<br>}<br><br>int StartRun(int p_iMode)<br>{<br>&nbsp;&nbsp;&nbsp; Connection&nbsp;&nbsp;&nbsp; dbConn;<br><br>&nbsp;&nbsp;&nbsp; OCICPP::db::init();<br><br>&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; OCICPP::db::connect("smsdb", "point", "point1234", dbConn);<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch(p_iMode)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 1:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InsertDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 2:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UpdateDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 3:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DelRecordBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 4:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FetchDataBySQL(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 5:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; InsertDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 6:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; UpdateDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 7:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DelRecordByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case 8:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FetchDataByProcedure(&amp;dbConn);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } catch(OraError err) {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "OraError Exception: " &lt;&lt; err.message &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>int main(int argc, char* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; if (argc != 2)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "Please input run mode (1 - 6): " &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 1:&nbsp; InsertDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 2:&nbsp; UpdateDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 3:&nbsp; DelRecordBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 4:&nbsp; FetchDataBySQL" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 5:&nbsp; InsertDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 6:&nbsp; UpdateDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 7:&nbsp; DelRecordByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; "&nbsp;&nbsp;&nbsp; 8:&nbsp; FetchDataByProcedure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cout &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; int iMode = atoi(argv[1]);<br><br>&nbsp;&nbsp;&nbsp; //pid_t iPid;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //iPid = fork();<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //if (iPid == 0)<br>&nbsp;&nbsp;&nbsp; //{<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StartRun(iMode);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; exit(0);<br>&nbsp;&nbsp;&nbsp; //}<br>&nbsp;&nbsp;&nbsp; //else if (iPid &lt; 0)<br>&nbsp;&nbsp;&nbsp; //{<br>&nbsp;&nbsp;&nbsp; //&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Fork Failure" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; //}<br>&nbsp;&nbsp;&nbsp; //sleep(3);<br>&nbsp;&nbsp;&nbsp; cout &lt;&lt; "................. Finish ................." &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br><br>/*****************************************************************<br>CREATE TABLE testOCICPP<br>(<br>&nbsp;&nbsp;&nbsp; TestId&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; number(10, 0)&nbsp;&nbsp;&nbsp; DEFAULT 1 NOT NULL,<br>&nbsp;&nbsp;&nbsp; UserName&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(16)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL,<br>&nbsp;&nbsp;&nbsp; PassWord&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(16)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL,<br>&nbsp;&nbsp;&nbsp; Address&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; varchar2(128)&nbsp;&nbsp;&nbsp; DEFAULT ' ' NOT NULL<br>)tablespace rism_db;<br><br><br>CREATE OR REPLACE PROCEDURE testProcInsert(<br>&nbsp;&nbsp;&nbsp; p_iTestId IN number, p_sUserName IN string, p_sPassWord IN string,<br>&nbsp;&nbsp;&nbsp; p_sAddress IN string, p_iRetCode OUT number)<br>IS<br>BEGIN<br>&nbsp;&nbsp;&nbsp; p_iRetCode := 0;<br>&nbsp;&nbsp;&nbsp; INSERT INTO testOCICPP(TestId, UserName, PassWord, Address)<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; VALUES(p_iTestId, p_sUserName, p_sPassWord, p_sAddress);<br>&nbsp;&nbsp;&nbsp; COMMIT;<br><br>&nbsp;&nbsp;&nbsp; EXCEPTION<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; WHEN OTHERS THEN<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; p_iRetCode := SQLCODE;<br>END;<br>/<br><br><br><br>*****************************************************************/<br><br><br>编译成ocicpp.exe<br><br>此时需要两个dll文件与ocicpp.exe在同一个目录<br>在oracle instant Client安装目录下找到oraociei11.dll oci.dll<br>根据版本不同. oraociei11.dll这个文件名或许会有差异.<br>也可以将俩dll扔到system32目录下<br><br><br>本人服务器端为rhel 3.4 ,数据库环境为9.2.04<br>客户端环境为windows mingw32-gcc3.42<br>  <img src ="http://www.cppblog.com/Khan/aggbug/110361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2010-03-23 17:30 <a href="http://www.cppblog.com/Khan/archive/2010/03/23/110361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tcp/IP数据包分析</title><link>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Thu, 21 Jan 2010 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/106122.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2010/01/21/106122.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/106122.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/106122.html</trackback:ping><description><![CDATA[<span style="font-family: courier new;">10:08:51.006836 IP 58.16.246.110.25479 &gt; 58.16.246.220.5016: P 33025:33041(16) ack 33228 win 5840</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0000:&nbsp; 4500 0038 d14f 4000 4006 0805 3a10 f66e&nbsp; E..8.O@.@...:..n</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0010:&nbsp; 3a10 f6dc 6387 1398 2e78 1088 5a1a ac28&nbsp; :...c....x..Z..(</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0020:&nbsp; 5018 16d0 6196 0000 0000 000c 8000 0015&nbsp; P...a...........</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0030:&nbsp; 0000 0000 a716 f4f8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ........<br><br style="font-family: courier new;"><span style="font-family: courier new;">IP Header</span><br style="font-family: courier new;"><span style="font-family: courier new;">45</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议版本 ipv4&nbsp;&nbsp;&nbsp; 4bit</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IHL位 20字节, 表示IP Header长度 以32bit为除数计算出的IP头部长度&nbsp;&nbsp; 本区域值 = IP头部长度 / 32 最长的IP包头长度可以为480bit</span><br style="font-family: courier new;"><span style="font-family: courier new;">00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 服务类型 Type of Service</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp; &nbsp; Precedence和TOS。定义IP协议包的处理方法，它包含如下子字段</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过程字段(优先权)：3位，设置了数据包的重要性，取值越大数据越重要，取值范围为：0(正常)~ 7（网络控制) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 延迟(时延)字段：1位，取值：0(正常)、1(期特低的延迟) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 流量(吞吐量)字段：1位，取值：0(正常)、1(期特高的流量) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可靠性字段：1位，取值：0(正常)、1(期特高的可靠性) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 成本(开销)字段：1位，取值：0(正常)、1(期特最小成本) </span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 未使用(保留位)：1位,恒设为0</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TOS目前不太使用。而Precedence则用于QOS应用。(TOS字段的详细描述RFC 1340 1349)</span><br style="font-family: courier new;"><span style="font-family: courier new;">00 38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IP数据报文总长</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">d1 4f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标识符(Identifier):长度16比特。该字段和Flags和Fragment Offest字段联合使用，对大的上层数据包进行分段(fragment)操作。如果数据包原始长度超过MTU,那么将他分段为更小的数据包.然后路由器在每片数据包的标志字段打上相同的标记,以便接收设备可以识别出属于一个数据包的分段.分段的数据包不会在数据链路的另外一端重新组合,直到最终目的地才会重组.</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">40 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //标记(Flags)：长度3比特&nbsp; 分段序号(Fragment Offset)：长度13比特</span><br style="font-family: courier new;"><span style="font-family: courier new;">40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //TTL</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //协议(Protocol)：长度8比特。标识了上层所使用的协议。TCP=06 UDP=17 ICMP=01 其他请查看cat /etc/protocols</span><br style="font-family: courier new;"><span style="font-family: courier new;" lang="ZH-CN">08 05&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //头部校验(Header Checksum)：长度16位，由于IP包头是变长的，所以提供一个头部校验来保证IP包头中信息的正确性。</span><br style="font-family: courier new;"><span style="font-family: courier new;">3a 10 f6 6e&nbsp;3a 10 f6 dc </span><br style="font-family: courier new;"><br style="font-family: courier new;"><span style="font-family: courier new;">tcp Header</span><br style="font-family: courier new;"><span style="font-family: courier new;">6387&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //src port&nbsp; 本地端口25479</span><br style="font-family: courier new;"><span style="font-family: courier new;">1398&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //dest port 目标端口5016</span><br style="font-family: courier new;"><span style="font-family: courier new;">2e78 1088&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Sequence Number 顺序号</span><br style="font-family: courier new;"><span style="font-family: courier new;">5a1a ac28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //ack num 确认号</span><br style="font-family: courier new;"><span style="font-family: courier new;">5018&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //tcp头长度 20字节&nbsp;&nbsp; 5018&nbsp; 2进制01010000 00011000</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp;&nbsp;&nbsp; 5 0101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //表示tcp长度 20字节</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp; &nbsp; 0000 00&nbsp;&nbsp;&nbsp;&nbsp; //保留 无意义</span><br style="font-family: courier new;"><span style="font-family: courier new;">&nbsp; &nbsp; 011000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //6bit 标志位</span><br style="font-family: courier new;">
<p style="font-family: courier new;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URG: (Urgent Pointer field significant)紧急指针。用到的时候值为1，用来处理避免TCP数据流中断<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACK: (Acknowledgment fieldsignificant)置1时表示确认号(AcknowledgmentNumber)为合法，为0的时候表示数据段不包含确认信息，确认号被忽略。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PSH: (Push Function)，PUSH标志的数据，置1时请求的数据段在接收方得到后就可直接送到应用程序，而不必等到缓冲区满时才传送。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RST: (Reset the connection)用于复位因某种原因引起出现的错误连接，也用来拒绝非法数据和请求。如果接收到RST位时候，通常发生了某些错误。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SYN: (Synchronize sequence numbers)用来建立连接，在连接请求中，SYN=1，ACK=0，连接响应时，SYN=1，ACK=1。即，SYN和ACK来区分 Connection Request和Connection Accepted。　<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FIN: (No more data from sender)用来释放连接，表明发送方已经没有数据发送了。　</p>
<span style="font-family: courier new;">
16d0 6196 0000 </span><br style="font-family: courier new;"><br style="font-family: courier new;"><span style="font-family: courier new;">data</span><br style="font-family: courier new;"><span style="font-family: courier new;">0000 000c 8000 0015 0000 0000 a716 f4f8&nbsp;&nbsp; //承载的数据体<br><br><br></span>  <img src ="http://www.cppblog.com/Khan/aggbug/106122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2010-01-21 12:38 <a href="http://www.cppblog.com/Khan/archive/2010/01/21/106122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在指定cpu的核心上执行线程</title><link>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Tue, 29 Dec 2009 08:57:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/104384.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/12/29/104384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/104384.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/104384.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: linux windows  指定线程或进程在某个cpu或核心执行&nbsp;&nbsp;<a href='http://www.cppblog.com/Khan/archive/2009/12/29/104384.html'>阅读全文</a><img src ="http://www.cppblog.com/Khan/aggbug/104384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-12-29 16:57 <a href="http://www.cppblog.com/Khan/archive/2009/12/29/104384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C99 柔性数组结构成员</title><link>http://www.cppblog.com/Khan/archive/2009/12/23/103757.html</link><dc:creator>Khan</dc:creator><author>Khan</author><pubDate>Wed, 23 Dec 2009 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/Khan/archive/2009/12/23/103757.html</guid><wfw:comment>http://www.cppblog.com/Khan/comments/103757.html</wfw:comment><comments>http://www.cppblog.com/Khan/archive/2009/12/23/103757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Khan/comments/commentRss/103757.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Khan/services/trackbacks/103757.html</trackback:ping><description><![CDATA[【柔性数组结构成员 <br>　　C99中，结构中的最后一个元素允许是未知大小的数组，这就叫做柔性数组成员，但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配，并且分配的内存应该大于结构的大小，以适应柔性数组的预期大小。】 <br>C语言大全，&#8220;柔性数组成员&#8221; <br><br>【柔性数组结构成员 <br>　　C99中，结构中的最后一个元素允许是未知大小的数组，这就叫做柔性数组成员，但结构中的柔性数组成员前面必须至少一个其 他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配，并且分配的内存应该大于结构的大小，以适应柔性数组的预期大小。】 <br>C语言大全，&#8220;柔性数组成员&#8221; <br><br>看看 C99 标准中 灵活数组成员： <br><br>结构体变长的妙用——0个元素的数组 <br>有时我们需要产生一个结构体，实现了一种可变长度的结构。如何来实现呢？ <br>看这个结构体的定义： <br>typedef struct st_type <br>{ <br>&nbsp; int nCnt; <br>&nbsp; int item[0]; <br>}type_a; <br><br>（有些编译器会报错无法编译可以改成：） <br>typedef struct st_type <br>{ <br>&nbsp; int nCnt; <br>&nbsp; int item[]; <br>}type_a; <br><br>这样我们就可以定义一个可变长的结构，用sizeof(type_a)得到的只有4，就是sizeof(nCnt)=sizeof(int)那 个0个元素的数组没有占用空间，而后我们可以进行变长操作了。 <br>C语言版： <br>type_a *p = (type_a*)malloc(sizeof(type_a) + 100*sizeof(int)); <br><br>C++语言版: <br>type_a *p = (type_a*)new char[sizeof(type_a) + 100*sizeof(int)]; <br>这样我们就产生了一个长为100的type_a类型的东西用p-&gt;item[n]就能简单地访问可变长元素，原理十分简单 ，分配了比sizeof(type_a)多的内存后int item[];就有了其意义了，它指向的是int nCnt;后面的内容，是没 有内存需要的，而在分配时多分配的内存就可以由其来操控，是个十分好用的技巧。 <br>而释放同样简单： <br>C语言版： <br>free(p); <br><br>C++ 语言版： <br>delete []p; <br><br>其实这个叫灵活数组成员(fleible array member)C89不支持这种东西，C99把它作为一种特例加入了标准。但 是，C99所支持的是incomplete type，而不是zero array，形同int item[0];这种形式是非法的，C99支持的 形式是形同int item[];只不过有些编译器把int item[0];作为非标准扩展来支持，而且在C99发布之前已经有 了这种非标准扩展了，C99发布之后，有些编译器把两者合而为一。 <br><br><br>  <img src ="http://www.cppblog.com/Khan/aggbug/103757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Khan/" target="_blank">Khan</a> 2009-12-23 09:35 <a href="http://www.cppblog.com/Khan/archive/2009/12/23/103757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>