<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_海阔凭鱼跃，天高任鸟飞</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/65660/rss</id><updated>2012-02-13T03:16:40Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/65660/rss"/><entry><id>http://www.cnblogs.com/absolute8511/archive/2012/02/07/2342038.html</id><title type="text">使用Python和vim插件结合让Vim支持多文件夹比较</title><summary type="text">在Vim的官方网站上有一个支持2个文件夹比较的插件DirDiff, 链接:http://www.vim.org/scripts/script.php?script_id=102. 不过仅支持2个文件夹, 我对齐进行研究并改进后让其支持多个文件夹的文件进行比较.DirDiff插件的基本原理就是先生成要比较的几个文件夹中的所有文件列表文件, 该文件的每一行对应于一个文件以及它所在的文件夹. 启用文件夹比较模式时, 会载入这个列表文件, 当选中一行时会解析出文件路径, 然后以diff模式分别打开这个文件在不同文件夹下对应的文件进行比较.这里为了方便, 我就使用Python来生成这个特定格式的文件列表</summary><published>2012-02-07T14:52:00Z</published><updated>2012-02-07T14:52:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2012/02/07/2342038.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2012/02/07/2342038.html"/><content type="html">&lt;p&gt;在Vim的官方网站上有一个支持2个文件夹比较的插件DirDiff, 链接:&amp;nbsp;http://www.vim.org/scripts/script.php?script_id=102. 不过仅支持2个文件夹, 我对齐进行研究并改进后让其支持多个文件夹的文件进行比较.&lt;/p&gt;&lt;p&gt;DirDiff插件的基本原理就是先生成要比较的几个文件夹中的所有文件列表文件, 该文件的每一行对应于一个文件以及它所在的文件夹. 启用文件夹比较模式时, 会载入这个列表文件, 当选中一行时会解析出文件路径, 然后以diff模式分别打开这个文件在不同文件夹下对应的文件进行比较.&lt;/p&gt;&lt;p&gt;这里为了方便, 我就使用Python来生成这个特定格式的文件列表, 然后启动vim 并启动文件夹插件比较.&lt;/p&gt;&lt;p&gt;Python脚本如下:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt; 1&lt;/span&gt; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;!/usr/bin/env python&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 2&lt;/span&gt; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; coding:UTF-8&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 3&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt; 4&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; os,sys,shutil,subprocess&lt;br /&gt;&lt;span style="color: #008080;"&gt; 5&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;from&lt;/span&gt; os &lt;span style="color: #0000ff;"&gt;import&lt;/span&gt; path&lt;br /&gt;&lt;span style="color: #008080;"&gt; 6&lt;/span&gt; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 将dirlist中的目录列表下的文件放在一个文件词典filesdict中,&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 7&lt;/span&gt; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 词典的key是dirlist中某个目录下的文件名(不含该目录名),&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 8&lt;/span&gt; &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; value是dirlist中存在对应的key的所有目录&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 9&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; getfilesfromdirs(dirlist):&lt;br /&gt;&lt;span style="color: #008080;"&gt;10&lt;/span&gt;     filesdict = {}&lt;br /&gt;&lt;span style="color: #008080;"&gt;11&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; onedir &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; dirlist:&lt;br /&gt;&lt;span style="color: #008080;"&gt;12&lt;/span&gt;         onedir = path.realpath(onedir)  &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 规范化目录名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;13&lt;/span&gt;         &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;处理目标路径下(含子目录下)的所有文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;14&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; root,dirs,files &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; os.walk(onedir):&lt;br /&gt;&lt;span style="color: #008080;"&gt;15&lt;/span&gt;             &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 记录每个文件名所属的目录,同名文件则会属于多个不同目录.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;16&lt;/span&gt;             &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 这样就生成了文件名到文件所在目录的倒排索引&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;17&lt;/span&gt;             &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; onefile &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; files:&lt;br /&gt;&lt;span style="color: #008080;"&gt;18&lt;/span&gt;                 &lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 若该文件名的键值还未创建则先创建&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;19&lt;/span&gt;                 onefile = os.path.join(root,onefile)[len(onedir):]&lt;br /&gt;&lt;span style="color: #008080;"&gt;20&lt;/span&gt;                 &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; onefile &lt;span style="color: #0000ff;"&gt;not&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; filesdict:&lt;br /&gt;&lt;span style="color: #008080;"&gt;21&lt;/span&gt;                     filesdict[onefile] = []&lt;br /&gt;&lt;span style="color: #008080;"&gt;22&lt;/span&gt;                 filesdict[onefile] += [onedir]&lt;br /&gt;&lt;span style="color: #008080;"&gt;23&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; filesdict&lt;br /&gt;&lt;span style="color: #008080;"&gt;24&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;25&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;def&lt;/span&gt; vimDirDiffN(diffdirs):&lt;br /&gt;&lt;span style="color: #008080;"&gt;26&lt;/span&gt;     diffbuffer = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;./vimdirdiffntmpbuffer&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;27&lt;/span&gt;     filesdict = getfilesfromdirs(diffdirs)&lt;br /&gt;&lt;span style="color: #008080;"&gt;28&lt;/span&gt;     fileslines = []&lt;br /&gt;&lt;span style="color: #008080;"&gt;29&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; key,values &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; filesdict.iteritems():&lt;br /&gt;&lt;span style="color: #008080;"&gt;30&lt;/span&gt;         fileslines += [&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;    File: &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;+key+&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt; @ &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;.join(values)]&lt;br /&gt;&lt;span style="color: #008080;"&gt;31&lt;/span&gt;     write2fileline = str(len(diffdirs))&lt;br /&gt;&lt;span style="color: #008080;"&gt;32&lt;/span&gt;     fileslines = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;.join(fileslines)&lt;br /&gt;&lt;span style="color: #008080;"&gt;33&lt;/span&gt;     dirsymbol = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;A&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;34&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; onedir &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; diffdirs:&lt;br /&gt;&lt;span style="color: #008080;"&gt;35&lt;/span&gt;         dirline = &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + dirsymbol + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;=&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + onedir&lt;br /&gt;&lt;span style="color: #008080;"&gt;36&lt;/span&gt;         write2fileline += &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + dirline&lt;br /&gt;&lt;span style="color: #008080;"&gt;37&lt;/span&gt;         fileslines = fileslines.replace(onedir,&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + dirsymbol + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;38&lt;/span&gt;         dirsymbol = chr(ord(dirsymbol) + 1)&lt;br /&gt;&lt;span style="color: #008080;"&gt;39&lt;/span&gt;     write2fileline += &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + fileslines&lt;br /&gt;&lt;span style="color: #008080;"&gt;40&lt;/span&gt;     fp = open(diffbuffer,&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;41&lt;/span&gt;     fp.write(write2fileline)&lt;br /&gt;&lt;span style="color: #008080;"&gt;42&lt;/span&gt;     fp.close()&lt;br /&gt;&lt;span style="color: #008080;"&gt;43&lt;/span&gt;     subprocess.Popen(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;gvim -c ":DirDiffN &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt; + path.join(os.getcwd(),diffbuffer) + &lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,shell=True)&lt;br /&gt;&lt;span style="color: #008080;"&gt;44&lt;/span&gt; &lt;br /&gt;&lt;span style="color: #008080;"&gt;45&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; &lt;span style="color: #800080;"&gt;__name__&lt;/span&gt; == &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;46&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; len(sys.argv) &amp;gt; 2:&lt;br /&gt;&lt;span style="color: #008080;"&gt;47&lt;/span&gt;         diffdirs = sys.argv[1:]&lt;br /&gt;&lt;span style="color: #008080;"&gt;48&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; index &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; range(0,len(diffdirs)):&lt;br /&gt;&lt;span style="color: #008080;"&gt;49&lt;/span&gt;             diffdirs[index] = path.realpath(diffdirs[index])&lt;br /&gt;&lt;span style="color: #008080;"&gt;50&lt;/span&gt;         vimDirDiffN(diffdirs)&lt;br /&gt;&lt;span style="color: #008080;"&gt;51&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;52&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;print&lt;/span&gt; &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Interactive Mode.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #008080;"&gt;53&lt;/span&gt;         diffdirs = raw_input(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;input the dirs you want to diff(in List["A","B"]): &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;br /&gt;&lt;span style="color: #008080;"&gt;54&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; diffdirs == &lt;span style="color: #800000;"&gt;''&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;55&lt;/span&gt;             diffdirs = [&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;f:/PYOutput/old&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;f:/PYOutput/new&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;,&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;f:/PYOutput/third_merge&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;]&lt;br /&gt;&lt;span style="color: #008080;"&gt;56&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;:&lt;br /&gt;&lt;span style="color: #008080;"&gt;57&lt;/span&gt;             diffdirs = eval(diffdirs)&lt;br /&gt;&lt;span style="color: #008080;"&gt;58&lt;/span&gt;         &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; index &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; range(0,len(diffdirs)):&lt;br /&gt;&lt;span style="color: #008080;"&gt;59&lt;/span&gt;             diffdirs[index] = path.realpath(diffdirs[index])&lt;br /&gt;&lt;span style="color: #008080;"&gt;60&lt;/span&gt;         vimDirDiffN(diffdirs)&lt;br /&gt;&lt;span style="color: #008080;"&gt;61&lt;/span&gt;         raw_input(&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;press to exit.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;)&lt;/div&gt;&lt;p&gt;这个脚本就是读入用户输入需要比较的文件夹列表, 然后扫描文件生成一个比较列表, 启动vim并执行我修改后的多文件夹比较插件DirDiffN.&lt;/p&gt;&lt;p&gt;修改后的DirDiffN插件比较多, 可以从附件下载. &amp;nbsp;&lt;a href="http://files.cnblogs.com/absolute8511/DirDiffN.vim.zip" target="_blank"&gt;DirDiffN插件下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;将DirDiffN放入Vim的插件目录下即可.&lt;/p&gt;&lt;p&gt;效果预览图:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/110076/2012021311163161.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/2342038.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2012/02/07/2342038.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2011/05/29/2061519.html</id><title type="text">Ｗindows安全机制</title><summary type="text">最近研究了点关于Ｗindows安全机制以及COM的 Reg-Free方案。研究的原因是试图构造一个安全的第三方插件的沙箱环境，而第三方插件是实现为COM组件的，因此又涉及到在受限环境下的COM调用的问题，为了解决受限环境的COM注册问题引入了Reg-Free的方案。整个插件环境是和主程序隔离的，每个插件都使用一个独立进程，插件的宿主进程是一个进程外的COM组件，主进程启动宿主进程后，有宿主进程负责创建相应的插件对象，插件被创建起来后就在宿主进程中运行。为了保证插件不影响用户的系统，需要在宿主进程创建插件对象之前将宿主进程放进一个受限的沙箱环境中。Ｗindows的安全模型主要由2个部分组成， 一</summary><published>2011-05-28T16:53:00Z</published><updated>2011-05-28T16:53:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2011/05/29/2061519.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2011/05/29/2061519.html"/><content type="html">&lt;meta charset="utf-8" /&gt;&lt;div&gt;&lt;br /&gt;&lt;span&gt;最近研究了点关于Ｗindows安全机制以及COM的 Reg-Free方案。研究的原因是试图构造一个安全的第三方插件的沙箱环境，而第三方插件是实现为COM组件的，因此又涉及到在受限环境下的COM调用的问题，为了解决受限环境的COM注册问题引入了Reg-Free的方案。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;整个插件环境是和主程序隔离的，每个插件都使用一个独立进程，插件的宿主进程是一个进程外的COM组件，主进程启动宿主进程后，有宿主进程负责创建相应的插件对象，插件被创建起来后就在宿主进程中运行。为了保证插件不影响用户的系统，需要在宿主进程创建插件对象之前将宿主进程放进一个受限的沙箱环境中。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ｗindows的安全模型主要由2个部分组成， 一个是用于授权的Ａccess Ｔoken，一个是用于保护安全对象的Ｓecurity Ｄescriptor。一个进程访问某个安全对象时，系统会使用对象的&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ｓecurity Ｄescriptor检查当前进程的Ｔoken是否有权限访问该对象。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ａccess Ｔoken包含了一些SID用于标示它拥有的安全身份，另外还包含一些Ｐrivilege信息以及其他授权信息。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ｓecurity Ｄescriptor包含了用于控制访问权限的DACL列表以及用于审核的SACL列表。ACL列表是一系列的ACE信息，每个ACE包含了某个SID的访问权限，当一个进程访问一个对象时，系统会逐个检查对象的ACE项，如果该进程的Ｔoken中包含的SID匹配ACE中的SID,那么系统就会执行ACE中对该SID的访问控制操作（拒绝或者允许），需要注意的是系统是按照列表从头到尾的顺序逐个检测ACE,一旦有拒绝或者允许的匹配项，都会立刻停止检测后继的ACE项。（除非token中有指定ＲestrictedSID）.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;下图是2个不同线程访问一个安全对象的过程：&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;img src="https://lh5.googleusercontent.com/GabE_fFqnEpnKIqFIMu5uGnGnv3M8xfeM6W2OE1ocLkaCPhAwBJyjiFpNQ_NdEZXpem2bMztqh6rlN7nfiwlpCZHDLdWkQWloJxjSTk38NmjnlIyhLA" width="384px;" height="259px;" /&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;关于Ｗindows安全机制，它提供了几种机制来确保安全性，主要有ＲestrictedToken，Ｊob Object，Ａlternate Ｄesktop，以及在Ｖista引入的IntegrityLevel的方案来简化和加强 &lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ｗindows下的安全隔离。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;对于ＲestrictedToken可以使用ＣreateＲestrictedToke函数创建一个受限的Ｔoken，然后使用ＣreateProcessAsUser以受限的token来启动受限进程。而Ｊob可以限制一个进程使用的系统资源，比如CPU使用率，内存使用率，活动进程，剪切版的使用等，在XP下还可以给Ｊob设置安全token来设置job的安全属性（Ｖista以上不支持job的安全属性了）。Ｖista以后引入的IntegrityLevel有四个级别分别为Ｌow, Medium, High, System，低级别的属性不能访问具有高级别的对象，默认所有安全对象都是Ｍedium级别的。另外IntegrityLevel还对注册表的访问和文件的操作做了一些重定向的处理，以保证程序的兼容性。特别是COM调用相关的一些处理，使得即使在最低的级别下一些COM的调用仍然能成功。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;由于XP,和XP以上的系统在安全机制上的一些区别，不得不做2种不同的处理。在XP系统下，主要使用Job以及其安全属性，使用JOBOBJECT_EXTENDED_LIMIT_INFORMATION, JOBOBJECT_BASIC_UI_RESTRICTIONS以及JOBOBJECT_SECURITY_LIMIT_INFORMATION设置一个受限的JOB并将进程放入该Job中，同时还要使用AdjustTokenPrivileges将进程的一些Ｐrivilege信息删除。而在Ｖista以后的系统中，无法使用JOBOBJECT_SECURITY_LIMIT_INFORMATION设置Job的安全属性，改用IntegrityLevel将进程的安全级别设置为Ｌow。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;在上述的受限环境中，进程的写权限几乎被完全禁止了（除了设定为较低安全级别的对象），仅剩下读权限，这样基本能防止插件对系统造成损害了。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;当然，在这种受限环境下,经过测试，XP系统下的COM进程间通信会有一些问题，而Ｖista下的IntegrityLevel似乎对这种情况专门做了处理，因此发现vista下在受限环境下的COM进程间通信一切顺利。为了处理XP下在受限环境下的COM调用和注册，引入一种COM的免注册方案，即Registration-Free 技术。主要就是利用manifest文件让COM的注册脱离注册表依赖。关于Ｒeg-Ｆree技术参考文献有2篇文章写的已经很详细了。需要注意的是，XP和Ｖista之后的manifest文件的都去顺序问题，XP系统是先尝试读取外部manifest文件，没找到才尝试读取dll文件本身嵌入的manifest资源，而vista之后刚好反过来了。另外，进程外的COM组件是不支持Ｒeg-Ｆree的。(经测试，XP下使用reg-free的方案好像只能解决COM进程内的接口调用，对于进程间的接口调用还得另做处理。)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;最后，还有一个需要注意的是Ｗin7下的Ｊob处理，由于Ｗin7下的explorer进程会将进程放入一个PCA的Ｊob中，为了避免使用我们自己的Ｊob失败，我们需要防止Ｗin7的这种自作主张的行为，需要在manifest文件中加入以下内容，&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;lt;?xml version="1.0" encoding="utf-8" standalone="yes"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;lt;assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&amp;lt;v3:trustInfo xmlns:v3="urn:schemas-microsoft-com:asm.v3"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;v3:security&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;v3:requestedPrivileges&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;v3:requestedExecutionLevel level="asInvoker" uiAccess="false" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;/v3:requestedPrivileges&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/v3:security&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&amp;lt;/v3:trustInfo&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&amp;lt;compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;application&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;!--The ID below indicates application support for Windows Vista --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;!--The ID below indicates application support for Windows 7 --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&lt;span&gt;&lt;/span&gt;&amp;lt;supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&amp;lt;/application&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &amp;nbsp;&amp;lt;/compatibility&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;lt;/assembly&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;关于Ｗindows安全方面更多详细的资料可以查看以下参考文献。&lt;/span&gt;&lt;br /&gt;&lt;span&gt;参考文献：&lt;/span&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa379570(v=vs.85).aspx"&gt;&lt;span&gt;http://msdn.microsoft.com/en-us/library/aa379570(v=vs.85).aspx&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa379570(v=vs.85).aspx"&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tenouk.com/ModuleH.html"&gt;&lt;span&gt;http://www.tenouk.com/ModuleH.html&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.tenouk.com/ModuleH.html"&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480244.aspx"&gt;&lt;span&gt;http://msdn.microsoft.com/en-us/library/aa480244.aspx&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa480244.aspx"&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.google.co.uk/patents/about?id=m40IAAAAEBAJ"&gt;&lt;span&gt;http://www.google.co.uk/patents/about?id=m40IAAAAEBAJ&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;about COM Reg-Free,&lt;/span&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/junfeng/archive/2006/05/17/registration-free-com-net-interop.aspx"&gt;&lt;span&gt;http://blogs.msdn.com/b/junfeng/archive/2006/05/17/registration-free-com-net-interop.aspx&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms973913.aspx"&gt;&lt;span&gt;http://msdn.microsoft.com/en-us/library/ms973913.aspx&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/magazine/cc188708.aspx"&gt;&lt;span&gt;http://msdn.microsoft.com/en-us/magazine/cc188708.aspx&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/2061519.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2011/05/29/2061519.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/12/31/1923415.html</id><title type="text">使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)</title><summary type="text">值此新年即将到来之际,在这献上今年最后一篇文章.产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太麻烦了,没找到现成的工具可以实现我的需求.于是有了下面这个脚本,正好熟悉下刚刚学会的Python. 如果有人知道有什么工具可以完成的话不妨留言告知:).下面脚本实现的就是在dest目录及其子目录下面,寻找和src目录下的文件对应的同名文件,如果找到唯一的一个同名文件,用src里面的新文件替换dest里面对应的老文件. 如果没找到同名或</summary><published>2010-12-31T11:48:00Z</published><updated>2010-12-31T11:48:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/12/31/1923415.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/12/31/1923415.html"/><content type="html">&lt;p&gt;值此新年即将到来之际,在这献上今年最后一篇文章.&lt;/p&gt;&lt;p&gt;产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太麻烦了,没找到现成的工具可以实现我的需求.于是有了下面这个脚本,正好熟悉下刚刚学会的Python. 如果有人知道有什么工具可以完成的话不妨留言告知:).&lt;/p&gt;&lt;p&gt;下面脚本实现的就是&lt;strong&gt;在dest目录及其子目录&lt;/strong&gt;下面,寻找&lt;strong&gt;和src目录下的文件对应的同名文件&lt;/strong&gt;,如果找到&lt;strong&gt;唯一&lt;/strong&gt;的一个同名文件,用src里面的新文件替换dest里面对应的老文件. 如果没找到同名或有多个同名的,就忽略.因为这种情况下需要人工接入是否替换,不过这样工作量已经少了很多了.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码通过扫描一遍dest目录及其子目录,建立了以文件名为索引,文件所在目录名为键值的倒排索引. 然后对src目录下的每个文件名去刚刚建立的倒排索引中寻找键值,如果键值中刚好只有一个目录名,说明找到了对应的唯一同名文件,替换之.其他的忽略.&lt;/p&gt;&lt;p&gt;代码如下:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('9c0890e2-a142-4b4b-a2b5-027056913e15')"&gt;&lt;div id="cnblogs_code_open_9c0890e2-a142-4b4b-a2b5-027056913e15"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;!/usr/bin/env python&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; coding:UTF-8&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; os,sys,shutil&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&lt;span style="color: #000000;"&gt; os &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; path&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;def&lt;/span&gt;&lt;span style="color: #000000;"&gt; findandreplace(src,dest):&lt;br /&gt;    srcfiles &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.listdir(src)&lt;br /&gt;    destfilesdict &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; {}&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;处理目标路径下(含子目录下)的所有文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; root,dirs,files &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.walk(dest):&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 记录每个文件名所在的路径,多个同名文件则会有多个不同路径.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 这样就生成了文件名到文件所在路径的一个倒排索引&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; onefile &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; files:&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 若该文件名的键值还未创建则先创建&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; onefile &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;not&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; destfilesdict:&lt;br /&gt;                destfilesdict[onefile] &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; []&lt;br /&gt;            destfilesdict[onefile] &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [root]&lt;br /&gt;    multisamename &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; []; &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 存储目标目录及其子目录下有多个同名文件的文件名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; srcfile &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; srcfiles:&lt;br /&gt;        fullsrcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.path.join(src,srcfile)&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.path.isfile(fullsrcfile):&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; srcfile &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; destfilesdict:&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; len(destfilesdict[srcfile])&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;                    multisamename &lt;/span&gt;&lt;span style="color: #000000;"&gt;+=&lt;/span&gt;&lt;span style="color: #000000;"&gt; [srcfile]&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 有且只有唯一的一个同名文件,那么肯定是要替换的那个&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;                    shutil.copy(fullsrcfile,destfilesdict[srcfile][0]&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;srcfile)&lt;br /&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; srcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt; replace success.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;following files has more than one in dest directory, replace skipped.&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;.join(multisamename);&lt;br /&gt;        &lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;__name__&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;__main__&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;    args &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; sys.argv&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; len(args) &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;        src &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; args[&lt;/span&gt;&lt;span style="color: #000000;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;        dest &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; args[&lt;/span&gt;&lt;span style="color: #000000;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;all files under the &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;dest&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(including the subdirectory) will be replaced by the files under &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;\&lt;br /&gt;              src&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; where they have the same name.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; raw_input(&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;Sure(y/n?): &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;y&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;            findandreplace(src,dest)&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;print&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Not enough arguments!&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;测试代码如下:&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('3e64c946-6ee8-4646-82bb-fb42a412737d')"&gt;&lt;div id="cnblogs_code_open_3e64c946-6ee8-4646-82bb-fb42a412737d"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt;!/usr/bin/env python&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; coding:UTF-8&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; os,sys&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; shutil&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt; findandreplace&lt;br /&gt;&lt;br /&gt;rootdir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;d:/test/&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;testsrcdir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;testsrc&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;testdestdir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;testdest&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;testfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; { &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;notexist&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt; : [&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;001&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;002&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;003&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;004&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;005&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],  &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 替换目标不存在的文件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;             &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;onlyone&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;  : [&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;101&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;102&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;103&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;104&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;105&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;],  &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 有唯一对应的文件存在的&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;             &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;morethanone&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:[&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;201&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;202&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;203&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;204&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;205&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;]} &lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; 多于一个同名存在的&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;testfileext &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; clear old test files&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;shutil.rmtree(os.path.join(rootdir,testsrcdir),True)&lt;br /&gt;shutil.rmtree(os.path.join(rootdir,testdestdir),True)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; generate src files&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;os.makedirs(os.path.join(rootdir,testsrcdir))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; key,values &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; testfile.iteritems():&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; filestr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; values:&lt;br /&gt;        srcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; open(os.path.join(rootdir,testsrcdir,filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;testfileext),&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        srcfile.write(filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;srcfile&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;        srcfile.close()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;#&lt;/span&gt;&lt;span style="color: #008000;"&gt; generate dest files&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;os.makedirs(os.path.join(rootdir,testdestdir))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; key,values &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; testfile.iteritems():&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; key &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;notexist&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;pass&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt;&lt;span style="color: #000000;"&gt; key &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;onlyone&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; filestr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; values:&lt;br /&gt;            newdir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.path.join(rootdir,testdestdir,filestr)&lt;br /&gt;            os.makedirs(newdir)&lt;br /&gt;            srcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; open(os.path.join(newdir,filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;testfileext),&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.write(filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;destfile&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.close()&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;elif&lt;/span&gt;&lt;span style="color: #000000;"&gt; key&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;morethanone&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; filestr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; values:&lt;br /&gt;            newdir &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; os.path.join(rootdir,testdestdir,filestr)&lt;br /&gt;            os.makedirs(newdir)&lt;br /&gt;            srcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; open(os.path.join(newdir,filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;testfileext),&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.write(filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;destfile&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.close()&lt;br /&gt;            srcfile &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; open(os.path.join(rootdir,testdestdir,filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;testfileext),&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;w&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.write(filestr&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #800000;"&gt;destfile&lt;/span&gt;&lt;span style="color: #800000;"&gt;'&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;            srcfile.close()&lt;br /&gt;&lt;br /&gt;findandreplace.findandreplace(os.path.join(rootdir,testsrcdir),os.path.join(rootdir,testdestdir))&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/p&gt;&lt;p&gt;Python真是提高效率的利器哈.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1923415.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/12/31/1923415.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/12/04/1896671.html</id><title type="text">用python实现一个按需生成用于vim跳转的tags文件的小程序</title><summary type="text">初学python，找个有用的来练手。选定了一个我早就想做的让vim按需生成tags跳转文件的小程序。vim的tags用于跳转的好处自是不用多说，但是如何生成tags确实困扰我的一大问题，用VS的都知道，VS会为每个解决方案生成一个ncb文件用于自动提示，相当于tags的功能，这个ncb文件很智能，它会根据你所包含的头文件来自动处理。这样，你只需包含一个头文件，就可以出现该头文件相关的自动提示了。但是vim就没有像VS这么智能了，目前我的做法就是在某个目录下调用ctags，然后加上递归参数，这样的缺点就是会生成一个很大的tags文件，里面很多都是项目根本没用到的头文件的tags。为了改善这种情况</summary><published>2010-12-04T14:57:00Z</published><updated>2010-12-04T14:57:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/12/04/1896671.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/12/04/1896671.html"/><content type="html">&lt;p&gt;初学python，找个有用的来练手。选定了一个我早就想做的让vim按需生成tags跳转文件的小程序。&lt;/p&gt;&lt;p&gt;vim的tags用于跳转的好处自是不用多说，但是如何生成tags确实困扰我的一大问题，用VS的都知道，VS会为每个解决方案生成一个ncb文件用于自动提示，相当于tags的功能，这个ncb文件很智能，它会根据你所包含的头文件来自动处理。这样，你只需包含一个头文件，就可以出现该头文件相关的自动提示了。&lt;/p&gt;&lt;p&gt;但是vim就没有像VS这么智能了，目前我的做法就是在某个目录下调用ctags，然后加上递归参数，这样的缺点就是会生成一个很大的tags文件，里面很多都是项目根本没用到的头文件的tags。为了改善这种情况，需要有一个按所用到的头文件来生成tags的方法，让ctags按需生成tags。&lt;/p&gt;&lt;p&gt;ctags本身是支持从一个文件中读入需要生成tags的文件列表的，因此剩下的问题就是如何找到项目所用到的所有相关的C++文件，然后让ctags从这些文件中生成tags。这就是我拿来练手的小程序了。&lt;/p&gt;&lt;p&gt;python的好处就是不用像C++那样考虑那么多不相关的细节，专注于你想做的。代码如下，应该还算精简吧。有更好的方法不妨评论分享下，:)&lt;/p&gt;&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;# -*- coding: utf8 -*- &amp;nbsp;# by absolute8511 2010-12-04import os,sys&lt;br/&gt;from os import path&lt;br/&gt;import string,re&lt;br/&gt;&lt;br/&gt;#在系统头文件目录下查找系统头文件,可以自行添加头文件路径&lt;br/&gt;def findsysinclude(filename,includepath):&lt;br/&gt;    if filename==None:&lt;br/&gt;        return None&lt;br/&gt;    sysincludepath = ['/usr/include/','/usr/include/c++/4.4/',&lt;br/&gt;            '/usr/lib/gcc/i486-linux-gnu/4.4/include/','/usr/include/c++/4.4/i486-linux-gnu/']   #系统头文件目录&lt;br/&gt;    includepath += sysincludepath&lt;br/&gt;    for onepath in includepath:&lt;br/&gt;        if path.isfile(onepath+filename):&lt;br/&gt;            return onepath+filename&lt;br/&gt;    print 'Not found: '+filename&lt;br/&gt;    return None&lt;br/&gt;&lt;br/&gt;#读取用户传入的头文件路径参数&lt;br/&gt;args = sys.argv&lt;br/&gt;print args&lt;br/&gt;retest = re.compile(r'\.cpp$|\.c$|\.h$|\.hpp$|\.cc$',re.IGNORECASE)&lt;br/&gt;cppfiles = []&lt;br/&gt;#查找用户项目路径下的所有源文件&lt;br/&gt;for root,dirs,files in os.walk(os.getcwd()):&lt;br/&gt;    oldlen = len(cppfiles)&lt;br/&gt;    cppfiles += filter(lambda x:retest.search(x)&amp;lt;&amp;gt;None,files)        #过滤非C/C++文件&lt;br/&gt;    for index in range(oldlen,len(cppfiles)):&lt;br/&gt;        cppfiles[index] = root + '/' + cppfiles[index];&lt;br/&gt;&lt;br/&gt;oldstdout = sys.stdout&lt;br/&gt;sys.stdout= logfile = open('maketags.log','w')&lt;br/&gt;&lt;br/&gt;print 'total cpp files: ' + str(len(cppfiles))&lt;br/&gt;includetest = re.compile(r'\s*#include\s*((&amp;lt;(?P&amp;lt;sysincludefile&amp;gt;.*?)&amp;gt;)|("(?P&amp;lt;userincludefile&amp;gt;.*?)"))')  ## *?代表不贪婪匹配&lt;br/&gt;&lt;br/&gt;#对每个C++源文件，查找它包含的头文件以及它的头文件所包含的头文件，以次递归直到全部包含&lt;br/&gt;#由于已经遍历过用户目录了，因次只需要再把系统头文件加近来即可&lt;br/&gt;for cppfile in cppfiles:&lt;br/&gt;    try:&lt;br/&gt;        fp = open(cppfile,'r')&lt;br/&gt;        print 'finding in file: '+cppfile&lt;br/&gt;        for line in fp:&lt;br/&gt;            result = includetest.search(line)   #正则匹配头文件&lt;br/&gt;            if result &amp;lt;&amp;gt; None:&lt;br/&gt;                print 'Matched include line is:'+result.group()&lt;br/&gt;                tmp = findsysinclude(result.group('sysincludefile'),args[1:])&lt;br/&gt;                tmp2 = findsysinclude(result.group('userincludefile'),args[1:]) #用户头文件也去找系统目录&lt;br/&gt;                if tmp&amp;lt;&amp;gt;None and cppfiles.count(tmp)==0:&lt;br/&gt;                    cppfiles += [tmp]&lt;br/&gt;                    print 'Added sys files: '+tmp&lt;br/&gt;                # tmp2 = path.abspath(path.dirname(cppfile)+'/'+result.group('userincludefile'))&lt;br/&gt;                if tmp2&amp;lt;&amp;gt;None and cppfiles.count(tmp2)==0:&lt;br/&gt;                    cppfiles += [tmp2]&lt;br/&gt;                    print 'Added user files: '+tmp2&lt;br/&gt;    finally:&lt;br/&gt;        fp.close()&lt;br/&gt;try:&lt;br/&gt;    filelist = open('python_tags_filelist','w')&lt;br/&gt;    filelist.writelines('\n'.join(cppfiles))&lt;br/&gt;finally:&lt;br/&gt;    filelist.close()&lt;br/&gt;&lt;br/&gt;print 'total cpp and include files:'+str(len(cppfiles))&lt;br/&gt;# print 'after delete duplicate files: ' + str(len(set(cppfiles)))&lt;br/&gt;sys.stdout = oldstdout&lt;br/&gt;logfile.close()&lt;br/&gt;&lt;br/&gt;os.system('ctags --c++-kinds=+p --fields=+iaS --extra=+q -L python_tags_filelist')&lt;br/&gt;&lt;/div&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1896671.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/12/04/1896671.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/10/02/1841465.html</id><title type="text">Kindle 3 初步体验感受与经验分享</title><summary type="text">大概一周前让别人从美国带了个kindle3回来，经过几天的体验，得到了第一手的经验，在这里分享一下，给准备买的同学一个参考。总体感觉，kindle 3 看电子书的感受非常好，由于是背光，不主动发光，眼睛看久了也不会不舒服。虽然和纸制书有差别，但已经很接近了。听歌功能也不错，虽然简单，但是看闲书的时候听听歌还是不错的。然后上网功能就比较弱了，看纯文字的还好，可以看看下面我截的google reade...</summary><published>2010-10-02T14:15:00Z</published><updated>2010-10-02T14:15:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/10/02/1841465.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/10/02/1841465.html"/><content type="html">&lt;p&gt;大概一周前让别人从美国带了个kindle3回来，经过几天的体验，得到了第一手的经验，在这里分享一下，给准备买的同学一个参考。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;总体感觉，kindle 3 看电子书的感受非常好，由于是背光，不主动发光，眼睛看久了也不会不舒服。虽然和纸制书有差别，但已经很接近了。听歌功能也不错，虽然简单，但是看闲书的时候听听歌还是不错的。然后上网功能就比较弱了，看纯文字的还好，可以看看下面我截的google reader移动版的效果。我认为值得一提的就是全文搜索，随时查阅词典，加备注这三个功能了。这三个功能是纸制书不能比拟的。&lt;/p&gt;&lt;p&gt;缺陷：偶尔会出现卡机甚至死机的情况，这种情况就要强制重启了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;下面放几个截图，kindle自带的截图功能：&lt;/p&gt;&lt;p&gt;kindle store中的书籍介绍&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vt9Po/GFptR.gif" alt="kindle store中的书籍介绍" width="864" height="1152" /&gt;&lt;/p&gt;&lt;p&gt;kindle store中的书籍分类列表&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vssEd/zhlwf.gif" alt="" width="864" height="1152" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;阅读扫描版的pdf书籍&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vrWaQ/9EuCb.gif" alt="" width="864" height="1152" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;全文搜索的结果&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vrgrA/TaNgv.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看rss订阅生成的mobi格式文章&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vr8oM/7n6HX.gif" alt="" width="864" height="1152" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;看优化过的6寸pdf文件&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vq3yO/5tZgw.gif" alt="" width="864" height="1152" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;chm格式文件转换成mobi格式后的阅读效果&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vpm3o/dhPi6.gif" alt="" width="1152" height="864" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;kindle的home界面，按collection方式显示&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7vped8/uGzUk.gif" alt="" width="1152" height="864" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;最后来一个阅读google reader移动版的截图给大家看看浏览网页的悲剧效果吧：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic.yupoo.com/absolute8511/Aw7R38RN/OWMkl.gif" alt="" /&gt;&lt;/p&gt;&lt;p&gt;kindle相关资源：&lt;/p&gt;&lt;p&gt;rss新闻mobi格式在线地址：&lt;a href="http://dogear.mobi/"&gt;kindle看新闻 - kindle's rss reader&lt;/a&gt;&lt;/p&gt;&lt;p&gt;推荐文件转换工具：mobi creator 和calibre，建议转化成mobi，prc格式，针对kindle3优化过的pdf和txt一般可以不转.&lt;/p&gt;&lt;p&gt;推荐kindle讨论bbs：&lt;a href="http://www.hi-pda.com/forum/forumdisplay.php?fid=59"&gt;http://www.hi-pda.com/forum/forumdisplay.php?fid=59&lt;/a&gt;&amp;nbsp;hipda的eink板块&lt;/p&gt;&lt;p&gt;推荐电子书下载的几个：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.inien.com/w/#/Index"&gt;Index - 亿年书海 - 电子书 wiki 网&lt;/a&gt;&amp;nbsp;和hipda，其他的电子书可以下载普通的pdf格式然后转换一下。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ps:在amazon注册你的kindle的时候，记得地址选择美国，这样在kindle store才能看到更多的电子书哦。&lt;/p&gt;&lt;p&gt;ps2：有个多看系统还在测试中，感兴趣的可以刷一下，我目前还没有需要刷机的需求。&lt;/p&gt;&lt;p&gt;希望我的这点东西能帮助你更好的选择，:)&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1841465.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/10/02/1841465.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/08/23/1806734.html</id><title type="text">COM组件弱引用的简单实现（C++）</title><summary type="text">COM组件弱引用的简单实现The simple implementation of the weak reference of the COM object.说明：我们知道boost用shared_ptr,weak_ptr实现了指针的智能化管理，使用它们可以防止C＋＋常见的内存泄露问题。COM组件的管理和指针类似却又不同，COM组件同样需要在使用的时候调用AddRef和Release来管理组件的引...</summary><published>2010-08-23T11:31:00Z</published><updated>2010-08-23T11:31:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/08/23/1806734.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/08/23/1806734.html"/><content type="html">&lt;p align="center" class="Heading1"&gt;&lt;strong&gt;COM组件弱引用的简单实现&lt;/strong&gt;&lt;/p&gt;&lt;p align="center" class="Textbody"&gt;The simple implementation of the weak reference of the COM object.&lt;/p&gt;&lt;p align="center" class="Textbody"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="Textbody"&gt;说明：我们知道boost用shared_ptr,weak_ptr实现了指针的智能化管理，使用它们可以防止C＋＋常见的内存泄露问题。COM组件的管理和指针类似却又不同，COM组件同样需要在使用的时候调用AddRef和Release来管理组件的引用计数，为了方便管理，ATL库提供了CComPtr等智能组件指针来简化COM组件的使用。可是我的问题是如何去观察一个com组件而不影响它的引用计数，并能在合适的时候将观察对象转换成真实的COM引用。&lt;/p&gt;&lt;p class="Textbody"&gt;从COM组件的实现原理，我们可以知道COM组件的弱引用并不好实现。原因在于COM组件的引用计数是包含在COM对象中的，如此，当COM对象被销毁时，也就无法通过获取它的引用计数值来判断该COM对象是否存在了，那么弱引用也就无法判断何时可以将弱引用转换成强引用了。&lt;/p&gt;&lt;p class="Textbody"&gt;那么boost的weak_ptr是如何实现的呢？很简单，boost中的shared_ptr,weak_ptr将引用计数和对象本身分离开，这样就算对象本身被销毁了，只要还有弱引用仍在观察该对象，那么弱引用都可以通过判断引用计数中的值来判断对象是否销毁，这样就可以在对象已经销毁后返回失败的强引用即可。&lt;/p&gt;&lt;p class="Textbody"&gt;那么COM组件可以借鉴boost的这种实现方式。但是有几个问题：&lt;/p&gt;&lt;p class="Textbody"&gt;&lt;strong&gt;1.引入额外的引用计数对象后，如何处理内部引用计数和外部引用计数的一致性。&lt;/strong&gt;&lt;/p&gt;&lt;p class="Textbody"&gt;&lt;strong&gt;2.由于需要保证内部引用计数和外部引用计数的一致性，线程安全就成了一个问题，因为需要保证对两个计数变量同时增减，单一变量可以用原子增减，多个变量似乎只能用锁来解决了。Linux下面用pthread_mutex_t来实现锁，windows下可以用关键代码段。&lt;/strong&gt;&lt;/p&gt;&lt;p class="Textbody"&gt;&amp;nbsp;&lt;/p&gt;&lt;p class="Textbody"&gt;我把问题简化了，因此我只是简单实现了类似boost的CComSharedPtr,CComWeakPtr，对于上述两个问题，首先 CcomWeakPtr只能观察由CComSharedPtr封装的COM组件，因此，如果使用了CComPtr来引用一个组件，那么CComWeakPtr是观察不到的，也就是此时即使CComPtr还有效，如果CComSharedPtr管理的组件引用全部失效，那么CComWeakPtr仍然会返回失败。第二，CComSharedPtr中的计数只包含由CComSharedPtr管理的对象个数，而不一定是实际COM组件对象被引用的个数。这样，COM组件对象的引用就包括两个部分：CComSharedPtr管理的和其他指针直接管理的。&lt;/p&gt;&lt;p class="Textbody"&gt;因此CComSharedPtr的使用需要注意：若是整个项目的COM对象全部由CComSharedPtr封装管理，那么CComSharedPtr和 CcomWeakPtr会工作的很好。如果项目代码中还有CComPtr等其他指针对COM进行引用的话，那么CComSharedPtr一切正常使用，但是CComWeakPtr在将COM弱引用转换成强引用时，即使失败了，也不代表COM对象被销毁了，只能代表已经没有对应的CComSharedPtr管理的COM引用了。&lt;/p&gt;&lt;p class="Textbody"&gt;最后，该实现不是线程安全的，如果需要的话，可以修改代码的增减引用计数部分（具体修改可以参见代码注释的pthread_mutex_t部分，windows下可以用关键代码段）。另外，代码草率完成，定有不适之处，有什么问题可以留言告知。&lt;/p&gt;&lt;p class="Textbody"&gt;&lt;strong&gt;PS:COM组件的弱引用的需求在实际项目中可能是设计不当的结果，在此实现完全是为了熟悉弱引用的实现原理。&lt;/strong&gt;&lt;/p&gt;&lt;p class="Textbody"&gt;&lt;strong&gt;源码：&lt;a target="_blank" href="http://files.cnblogs.com/absolute8511/weakcom_pthread.zip"&gt;WeakCom&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class="Textbody"&gt;以下是代码实现：&lt;/p&gt;&lt;p class="Textbody"&gt;借鉴了boost的大量源码：&lt;/p&gt;&lt;p class="Textbody"&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;Code highlighting produced by Actipro CodeHighlighter (freeware)&lt;br /&gt;http://www.CodeHighlighter.com/&lt;br /&gt;&lt;br /&gt;--&gt;&lt;span style="color: #008080;"&gt;  1&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;stdio.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  2&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;memory&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  3&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;boost&lt;/span&gt;&lt;span style="color: #000000;"&gt;/&lt;/span&gt;&lt;span style="color: #000000;"&gt;smart_ptr.hpp&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  4&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;pthread.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  5&lt;/span&gt; &lt;span style="color: #000000;"&gt;#include &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;unistd.h&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  6&lt;/span&gt; &lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; std;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  7&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;这个基类就是为了在com组件之外添加额外的引用计数对象，这个是因为当com对象被销毁时无法&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  8&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;访问com内部的引用来探测com对象是否存在，而通过引入额外的引用计数对象，我们可以通过&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;  9&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用该com对象的弱引用来探测com对象是否存在，直到所有观察该com对象的弱引用全部销毁后，&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 10&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;额外的引用计数对象才会销毁自身。这样就达到了观察com对象却不影响com对象引用计数的目的。&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 11&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;缺点：需要额外维护两个引用计数的一致性，因此无法做到线程安全。而且只能保证维护&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 12&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;CComSharedPtr所管理的com对象，其他如CComPtr不在管理范围内，因此相应的弱引用也只能观察&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 13&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;由CComSharedPtr所管理的com对象，当所有的CComSharedPtr管理的com对象销毁后，弱引用返回&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 14&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_counted_base&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 15&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 16&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 17&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 18&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_base( com_counted_base &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 19&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( com_counted_base &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 20&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 21&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count_;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; #shared&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 22&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; weak_count_;       &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; #weak + (#shared != 0)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 23&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 24&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;//    pthread_mutex_t refmutex;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 25&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 26&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 27&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_base(): use_count_( &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; ), weak_count_( &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 28&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 29&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_init(&amp;amp;refmutex,NULL);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 30&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 31&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 32&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;com_counted_base() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 33&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 34&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_destroy(&amp;amp;refmutex);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 35&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 36&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 37&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; dispose() is called when use_count_ drops to zero, to release&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 38&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; the resources managed by *this.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 39&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 40&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; dispose() &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 41&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; ULONG com_add_ref() &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 42&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; ULONG com_release() &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 43&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 44&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; destroy() is called when weak_count_ drops to zero.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 45&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 46&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; destroy() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 47&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 48&lt;/span&gt; &lt;span style="color: #000000;"&gt;        delete &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 49&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 50&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 51&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; add_ref_copy()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 52&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 53&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_lock(&amp;amp;refmutex);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 54&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;use_count_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 55&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果需要测试线程安全，可以在此加入sleep&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 56&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        usleep(1);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 57&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        com_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 58&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_unlock(&amp;amp;refmutex);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 59&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 60&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 61&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; add_ref_lock() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; true on success&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 62&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 63&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 64&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( use_count_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 65&lt;/span&gt; &lt;span style="color: #000000;"&gt;        add_ref_copy();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 66&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 67&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 68&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 69&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; release() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 70&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 71&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_lock(&amp;amp;refmutex);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 72&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        com_release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 73&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;如果需要测试线程安全，可以在此加入sleep&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 74&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        usleep(1);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 75&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;use_count_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 76&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 77&lt;/span&gt; &lt;span style="color: #000000;"&gt;            dispose();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 78&lt;/span&gt; &lt;span style="color: #000000;"&gt;            weak_release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 79&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 80&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;        pthread_mutex_unlock(&amp;amp;refmutex);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 81&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 82&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; weak_add_ref() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 83&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 84&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_count_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 85&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 86&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 87&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; weak_release() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 88&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 89&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( &lt;/span&gt;&lt;span style="color: #000000;"&gt;--&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_count_  &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 90&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 91&lt;/span&gt; &lt;span style="color: #000000;"&gt;            destroy();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 92&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 93&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 94&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 95&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 96&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 97&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; static_cast&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;volatile&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;( use_count_ );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 98&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt; 99&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;100&lt;/span&gt; &lt;span style="color: #000000;"&gt;template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_counted_impl: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_counted_base&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;101&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;102&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;103&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; px_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;104&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;105&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_impl( com_counted_impl &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;106&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_impl &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ( com_counted_impl &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;107&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;108&lt;/span&gt; &lt;span style="color: #000000;"&gt;    typedef com_counted_impl this_type;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;109&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;110&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;111&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;explicit&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_counted_impl( T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; px, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isaddrefneeded): px_( px )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;112&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;113&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(px_&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;NULL &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; isaddrefneeded)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;114&lt;/span&gt; &lt;span style="color: #000000;"&gt;            com_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;115&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;116&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; ULONG com_add_ref()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;117&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;118&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;AddRef();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;119&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;120&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; ULONG com_release()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;121&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;122&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;123&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;124&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; dispose() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;125&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;126&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;普通数据指针这里需要delete自己，但是com组件指针不用，因为当com组件引用降为0时会删除自己，和普通数据指针不同&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;127&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;128&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;129&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_weak_count;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;130&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;131&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_shared_count&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;132&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;133&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;134&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;135&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_base&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;136&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;137&lt;/span&gt; &lt;span style="color: #000000;"&gt;    friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_weak_count;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;138&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;139&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;140&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;141&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_shared_count(): pi_(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;142&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;143&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;144&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;145&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;explicit&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_shared_count( Y &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; p, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; isaddrefneeded &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ): pi_( &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;146&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;147&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_counted_impl&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;( p , isaddrefneeded);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;148&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;149&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;150&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;151&lt;/span&gt; &lt;span style="color: #000000;"&gt;            p&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;152&lt;/span&gt; &lt;span style="color: #000000;"&gt;            boost::throw_exception( std::bad_alloc() );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;153&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;154&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;155&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;156&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;com_shared_count() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;157&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;158&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;159&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;160&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;161&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_shared_count(com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): pi_(r.pi_) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;162&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;163&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;add_ref_copy();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;164&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;165&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;166&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;explicit&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_shared_count(com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; throws bad_weak_ptr when r.use_count() == 0&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;167&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;168&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_shared_count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;169&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;170&lt;/span&gt; &lt;span style="color: #000000;"&gt;        com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;171&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;172&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_ )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;173&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;174&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) tmp&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;add_ref_copy();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;175&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; ) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;176&lt;/span&gt; &lt;span style="color: #000000;"&gt;            pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;177&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;178&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;179&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;180&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(com_shared_count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;181&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;182&lt;/span&gt; &lt;span style="color: #000000;"&gt;        com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;183&lt;/span&gt; &lt;span style="color: #000000;"&gt;        r.pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;184&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;185&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;186&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;187&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;188&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;189&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;use_count(): &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;190&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;191&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;192&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; unique() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;193&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;194&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;195&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;196&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;197&lt;/span&gt; &lt;span style="color: #000000;"&gt;    friend inline &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;(com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; a, com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; b)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;198&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;199&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; a.pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; b.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;200&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;201&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;202&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;203&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;204&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_weak_count&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;205&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;206&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;207&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;208&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;209&lt;/span&gt; &lt;span style="color: #000000;"&gt;    friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_shared_count;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;210&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;211&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;212&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;213&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_weak_count(): pi_(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;214&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;215&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;216&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;217&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_weak_count(com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): pi_(r.pi_) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;218&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;219&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;220&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;221&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;222&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_weak_count(com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): pi_(r.pi_) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;223&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;224&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;225&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;226&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;227&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;com_weak_count() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;228&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;229&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;230&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;231&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;232&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_weak_count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (com_shared_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;233&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;234&lt;/span&gt; &lt;span style="color: #000000;"&gt;        com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;235&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) tmp&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;236&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;237&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;238&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;239&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;240&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;241&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;242&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_weak_count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; (com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;243&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;244&lt;/span&gt; &lt;span style="color: #000000;"&gt;        com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;245&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) tmp&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_add_ref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;246&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;weak_release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;247&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;248&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;249&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;250&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;251&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;252&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(com_weak_count &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;253&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;254&lt;/span&gt; &lt;span style="color: #000000;"&gt;        com_counted_base &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;255&lt;/span&gt; &lt;span style="color: #000000;"&gt;        r.pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;256&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; tmp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;257&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;258&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;259&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; nothrow&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;260&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;261&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;use_count(): &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;262&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;263&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;264&lt;/span&gt; &lt;span style="color: #000000;"&gt;    friend inline &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt;(com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; a, com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; b)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;265&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;266&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; a.pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; b.pi_;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;267&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;268&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;269&lt;/span&gt; &lt;span style="color: #000000;"&gt;inline com_shared_count::com_shared_count( com_weak_count &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r ): pi_( r.pi_ )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;270&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;271&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;( pi_ &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;pi_&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;add_ref_lock() )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;272&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;273&lt;/span&gt; &lt;span style="color: #000000;"&gt;        boost::throw_exception( boost::bad_weak_ptr() );&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;274&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;275&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;276&lt;/span&gt; &lt;span style="color: #000000;"&gt;template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;277&lt;/span&gt; &lt;span style="color: #000000;"&gt;template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;278&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;279&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;280&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;281&lt;/span&gt; &lt;span style="color: #000000;"&gt;    com_shared_count pn;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;282&lt;/span&gt; &lt;span style="color: #000000;"&gt;    typedef CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; this_type;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;283&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;284&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;285&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComSharedPtr(): px(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;), pn() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws in 1.30+&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;286&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;287&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;288&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #000000;"&gt;~&lt;/span&gt;&lt;span style="color: #000000;"&gt;CComSharedPtr()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;289&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;290&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;291&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;292&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;explicit&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr( T&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; p ): px( p ), pn( p )&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;293&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;294&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;295&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  generated copy constructor, assignment, destructor are fine...&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;296&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;297&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;298&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;299&lt;/span&gt; &lt;span style="color: #000000;"&gt;        px &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;300&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pn; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; shared_count::op= doesn't throw&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;301&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;302&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;303&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;explicit&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr(CComWeakPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): pn(r.pn) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; may throw&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;304&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;305&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; it is now safe to copy r.px, as pn(r.pn) did not throw&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;306&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        px &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;307&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;308&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;309&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): px(r.px), pn(r.pn)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;310&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;311&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;312&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;313&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;314&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComSharedPtr(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r, boost::detail::dynamic_cast_tag): px(dynamic_cast&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r.px)), pn(r.pn)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;315&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;316&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(px &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; need to allocate new counter -- the cast failed&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;317&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;318&lt;/span&gt; &lt;span style="color: #000000;"&gt;            pn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; com_shared_count();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;319&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;320&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;321&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;322&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt; T&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;323&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;324&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;325&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;326&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;327&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用该操作符返回的指针被修改指向新的com组件后，必须调用init_count函数进行计数初始化&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;328&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    T&lt;/span&gt;&lt;span style="color: #000000;"&gt;**&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;329&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;330&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;     BOOST_ASSERT(px==NULL);&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;331&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;332&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;333&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;334&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; init_com_count()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;335&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;336&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化通过获取原始数据指针直接修改的com引用，由于直接修改原始com引用，跳过了&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;337&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;额外引用计数的初始化，因此需要调用该函数进行额外计数初始化。&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;338&lt;/span&gt; &lt;span style="color: #008000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;由于直接修改的com引用必然是已经调用过AddRef的，因此传递false以表示不再需要AddRef了。&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;339&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        com_shared_count temp(px,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;340&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; temp;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;341&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;342&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;343&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; reset() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws in 1.30+&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;344&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;345&lt;/span&gt; &lt;span style="color: #000000;"&gt;        this_type().swap(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;346&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;347&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;348&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; reset(T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; p) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Y must be complete&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;349&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;350&lt;/span&gt; &lt;span style="color: #000000;"&gt;        BOOST_ASSERT(p &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;||&lt;/span&gt;&lt;span style="color: #000000;"&gt; p &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; px); &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; catch self-reset errors&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;351&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        this_type(p).swap(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;352&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;353&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; () &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;354&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;355&lt;/span&gt; &lt;span style="color: #000000;"&gt;        BOOST_ASSERT(px &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;356&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;357&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;358&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;359&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; () &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;360&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;361&lt;/span&gt; &lt;span style="color: #000000;"&gt;        BOOST_ASSERT(px &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;362&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;363&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;364&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;365&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;366&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;367&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;368&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;369&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; implicit conversion to "bool"&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;370&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; () &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;371&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;372&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px &lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;373&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;374&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; operator! is redundant, but some compilers need it&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;375&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt; () &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;376&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;377&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; px &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;378&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;379&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;380&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; unique() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;381&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;382&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pn.unique();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;383&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;384&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;385&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;386&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;387&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pn.use_count();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;388&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;389&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; other)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;390&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;391&lt;/span&gt; &lt;span style="color: #000000;"&gt;        std::swap(px, other.px);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;392&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn.swap(other.pn);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;393&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;394&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;395&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;396&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;397&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;398&lt;/span&gt; &lt;span style="color: #000000;"&gt;template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; T, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; U&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; dynamic_pointer_cast(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;U&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;399&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;400&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(r, boost::detail::dynamic_cast_tag());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;401&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;402&lt;/span&gt; &lt;span style="color: #000000;"&gt;template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;403&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;404&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;405&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;406&lt;/span&gt; &lt;span style="color: #000000;"&gt;    typedef CComWeakPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; this_type;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;407&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;408&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;409&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;410&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComWeakPtr(): px(&lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;), pn() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws in 1.30+&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;411&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;412&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;413&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;414&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  generated copy constructor, assignment, destructor are fine&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;415&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;416&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;417&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;418&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  The "obvious" converting constructor implementation:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;419&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;420&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  template&amp;lt;class Y&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;421&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  weak_ptr(weak_ptr&amp;lt;Y&amp;gt; const &amp;amp; r): px(r.px), pn(r.pn) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;422&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;423&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;424&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;425&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  has a serious problem.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;426&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;427&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  r.px may already have been invalidated. The px(r.px)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;428&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  conversion may require access to *r.px (virtual inheritance).&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;429&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;430&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  It is not possible to avoid spurious access violations since&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;431&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;  in multithreaded programs r.px may be invalidated at any point.&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;432&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;433&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;434&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr(CComWeakPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): pn(r.pn) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;435&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;436&lt;/span&gt; &lt;span style="color: #000000;"&gt;        px &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt;().&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;437&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;438&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;439&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r): px(r.px), pn(r.pn) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;440&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;441&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;442&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;443&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CComWeakPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;444&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;445&lt;/span&gt; &lt;span style="color: #000000;"&gt;        px &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt;().&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;446&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pn;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;447&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;448&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;449&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;typename Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;operator&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; r) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;450&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;451&lt;/span&gt; &lt;span style="color: #000000;"&gt;        px &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.px;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;452&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; r.pn;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;453&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;454&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;455&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;456&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;457&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;458&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#if&lt;/span&gt;&lt;span style="color: #000000;"&gt; defined(BOOST_HAS_THREADS)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;459&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;460&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; optimization: avoid throw overhead&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;461&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;(expired())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;462&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;463&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;464&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;465&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;466&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;467&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;468&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;469&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;470&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;(boost::bad_weak_ptr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;471&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;472&lt;/span&gt; &lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Q: how can we get here?&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;473&lt;/span&gt; &lt;span style="color: #008000;"&gt;            &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; A: another thread may have invalidated r after the use_count test above.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;474&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;475&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;476&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;477&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;478&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;479&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; optimization: avoid try/catch overhead when single threaded&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;480&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; expired()&lt;/span&gt;&lt;span style="color: #000000;"&gt;?&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(): CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;481&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;482&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;483&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;484&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;485&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;long&lt;/span&gt;&lt;span style="color: #000000;"&gt; use_count() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;486&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;487&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pn.use_count();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;488&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;489&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;490&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&lt;span style="color: #000000;"&gt; expired() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;491&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;492&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; pn.use_count() &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;493&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;494&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;495&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; reset() &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws in 1.30+&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;496&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;497&lt;/span&gt; &lt;span style="color: #000000;"&gt;        this_type().swap(&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;498&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;499&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;500&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; swap(this_type &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; other) &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; never throws&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;501&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;502&lt;/span&gt; &lt;span style="color: #000000;"&gt;        std::swap(px, other.px);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;503&lt;/span&gt; &lt;span style="color: #000000;"&gt;        pn.swap(other.pn);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;504&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;505&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;506&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Tasteless as this may seem, making all members public allows member templates&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;507&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; to work in the absence of member template friends. (Matthew Langston)&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;508&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;509&lt;/span&gt; &lt;span style="color: #000000;"&gt;#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;510&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;511&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;512&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;513&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComWeakPtr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;514&lt;/span&gt; &lt;span style="color: #000000;"&gt;    template&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Y&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; friend &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CComSharedPtr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;515&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;516&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endif&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;517&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;518&lt;/span&gt; &lt;span style="color: #000000;"&gt;    T &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt; px;                       &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; contained pointer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;519&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    com_weak_count pn; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; reference counter&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;520&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;521&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;522&lt;/span&gt; &lt;span style="color: #000000;"&gt;HRESULT  CreateComTestInstance(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;const&lt;/span&gt;&lt;span style="color: #000000;"&gt; IID&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt; iid,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;**&lt;/span&gt;&lt;span style="color: #000000;"&gt; ppv)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;523&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;524&lt;/span&gt; &lt;span style="color: #000000;"&gt;    ComTest &lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;t &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ComTest;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;525&lt;/span&gt; &lt;span style="color: #000000;"&gt;    HRESULT hr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; t&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;QueryInterface(iid,ppv);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;526&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;527&lt;/span&gt; &lt;span style="color: #000000;"&gt;    t&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Release();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;528&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; hr;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;529&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;530&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SharedTest&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;531&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;532&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;533&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;534&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IPrintTest&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; spCom;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;535&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComWeakPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IUnknown&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; wkcom;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;536&lt;/span&gt; &lt;span style="color: #000000;"&gt;};&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;537&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;538&lt;/span&gt; &lt;span style="color: #008000;"&gt; *测试多线程的方法，线程安全测试用&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;539&lt;/span&gt; &lt;span style="color: #008000;"&gt; * void* testpthread(void* voidCom)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;540&lt;/span&gt; &lt;span style="color: #008000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;541&lt;/span&gt; &lt;span style="color: #008000;"&gt;    CComSharedPtr&amp;lt;IPrintTest&amp;gt; spCom = *((CComSharedPtr&amp;lt;IPrintTest&amp;gt;*)voidCom);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;542&lt;/span&gt; &lt;span style="color: #008000;"&gt;    int i;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;543&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;544&lt;/span&gt; &lt;span style="color: #008000;"&gt;    usleep(1);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;545&lt;/span&gt; &lt;span style="color: #008000;"&gt;    for(i=0;i&amp;lt;5;i++)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;546&lt;/span&gt; &lt;span style="color: #008000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;547&lt;/span&gt; &lt;span style="color: #008000;"&gt;        CComSharedPtr&amp;lt;IPrintTest&amp;gt; spComtest;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;548&lt;/span&gt; &lt;span style="color: #008000;"&gt;        spComtest = spCom;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;549&lt;/span&gt; &lt;span style="color: #008000;"&gt;        spComtest-&amp;gt;printref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;550&lt;/span&gt; &lt;span style="color: #008000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;551&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;552&lt;/span&gt; &lt;span style="color: #008000;"&gt;    CComSharedPtr&amp;lt;IPrintTest&amp;gt; spComtest2[5];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;553&lt;/span&gt; &lt;span style="color: #008000;"&gt;    for(i=0;i&amp;lt;5;i++)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;554&lt;/span&gt; &lt;span style="color: #008000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;555&lt;/span&gt; &lt;span style="color: #008000;"&gt;        spComtest2[i] = spCom;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;556&lt;/span&gt; &lt;span style="color: #008000;"&gt;        spComtest2[i]-&amp;gt;printref();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;557&lt;/span&gt; &lt;span style="color: #008000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;558&lt;/span&gt; &lt;span style="color: #008000;"&gt;    return 0;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;559&lt;/span&gt; &lt;span style="color: #008000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;560&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;561&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; main()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;562&lt;/span&gt; &lt;span style="color: #000000;"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;563&lt;/span&gt; &lt;span style="color: #000000;"&gt;    SharedTest mysharedtest;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;564&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;565&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;566&lt;/span&gt; &lt;span style="color: #000000;"&gt;        CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IPrintTest&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; spIPT;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;567&lt;/span&gt; &lt;span style="color: #000000;"&gt;        HRESULT hr &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; CreateComTestInstance(IID_IPrintTest,(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;**&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;spIPT);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;568&lt;/span&gt; &lt;span style="color: #000000;"&gt;        spIPT.init_com_count();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;569&lt;/span&gt; &lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (SUCCEEDED(hr))&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;570&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;571&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;572&lt;/span&gt; &lt;span style="color: #000000;"&gt;        mysharedtest.spCom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; spIPT;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;573&lt;/span&gt; &lt;span style="color: #000000;"&gt;        mysharedtest.wkcom &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; spIPT;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;574&lt;/span&gt; &lt;span style="color: #000000;"&gt;        {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;575&lt;/span&gt; &lt;span style="color: #000000;"&gt;            CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IPrintTest&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; spIPTfrom_wk(mysharedtest.wkcom.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),boost::detail::dynamic_cast_tag());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;576&lt;/span&gt; &lt;span style="color: #000000;"&gt;        }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;577&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;578&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt; 测试多线程的线程安全&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;579&lt;/span&gt; &lt;span style="color: #008000;"&gt; * pthread_t pid[10];&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;580&lt;/span&gt; &lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;581&lt;/span&gt; &lt;span style="color: #008000;"&gt;    for(int i=0;i&amp;lt;10;i++)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;582&lt;/span&gt; &lt;span style="color: #008000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;583&lt;/span&gt; &lt;span style="color: #008000;"&gt;        pthread_create(&amp;amp;pid[i],NULL,testpthread,(void*)&amp;amp;mysharedtest.spCom);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;584&lt;/span&gt; &lt;span style="color: #008000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;585&lt;/span&gt; &lt;span style="color: #008000;"&gt;    usleep(1000);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;586&lt;/span&gt; &lt;span style="color: #008000;"&gt;    for(int i=0;i&amp;lt;10;i++)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;587&lt;/span&gt; &lt;span style="color: #008000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;588&lt;/span&gt; &lt;span style="color: #008000;"&gt;        pthread_join(pid[i],NULL);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;589&lt;/span&gt; &lt;span style="color: #008000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;590&lt;/span&gt; &lt;span style="color: #008000;"&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;591&lt;/span&gt; &lt;span style="color: #000000;"&gt;    mysharedtest.spCom.reset();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;592&lt;/span&gt; &lt;span style="color: #000000;"&gt;    CComSharedPtr&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IPrintTest&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; spIPTfrom_wk2(mysharedtest.wkcom.&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;lock&lt;/span&gt;&lt;span style="color: #000000;"&gt;(),boost::detail::dynamic_cast_tag());&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;593&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (spIPTfrom_wk2)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;594&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;595&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;596&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;597&lt;/span&gt; &lt;span style="color: #000000;"&gt;    {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;598&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;599&lt;/span&gt; &lt;span style="color: #000000;"&gt;        printf(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;get strong ref failed. The ref has been deleted.\n&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;600&lt;/span&gt; &lt;span style="color: #000000;"&gt;        mysharedtest.wkcom.reset();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;601&lt;/span&gt; &lt;span style="color: #000000;"&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;602&lt;/span&gt; &lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;603&lt;/span&gt; &lt;span style="color: #000000;"&gt;}&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;604&lt;/span&gt; &lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1806734.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/08/23/1806734.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/08/08/1795149.html</id><title type="text">Milestone手机出现SD卡受损提示的解决方法</title><summary type="text">今天ms开机出现SD卡受损的提示，说是sd卡已损坏，需要格式化，网上查了一下好多android的手机很多会出现这个情况。于是我拷贝sd卡上的所有文件备份一下，拷贝的过程中发现有1个文件拷贝失败，说是不存在该文件，我猜可能sd卡的目录结构有问题，于是用win自带的chkdsk命令检测一下，果然发现有错误，于是修复一下，重启手机，sd卡正常了。终于不用格式化SD卡了。出现同样问题的可以参考一下。不成功...</summary><published>2010-08-08T07:18:00Z</published><updated>2010-08-08T07:18:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/08/08/1795149.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/08/08/1795149.html"/><content type="html">&lt;p&gt;&lt;meta http-equiv="content-type" content="text/html; charset=utf-8" /&gt;&lt;/p&gt;&lt;p&gt;今天ms开机出现SD卡受损的提示，说是sd卡已损坏，需要格式化，网上查了一下好多android的手机很多会出现这个情况。于是我拷贝sd卡上的所有文件备份一下，拷贝的过程中发现有1个文件拷贝失败，说是不存在该文件，我猜可能sd卡的目录结构有问题，于是用win自带的chkdsk命令检测一下，果然发现有错误，于是修复一下，重启手机，sd卡正常了。&lt;/p&gt;&lt;p&gt;终于不用格式化SD卡了。出现同样问题的可以参考一下。不成功的话，可能就是还有其他原因了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1795149.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/08/08/1795149.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/07/28/1786733.html</id><title type="text">[总结]最原始的COM组件调用过程(不使用注册表信息)</title><summary type="text">最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了.一般调用COM都是通过注册表找到它的位置, 然后调用COM库的标准函数. 这些封装无疑使得我这个初学者无法了解里面到底做了什么, 而且注册表和COM库标准函数都是windows提供的, 但是COM这个思想是可以在Linux下实现的. 只要知道它的实现原理就行了. 因此我就试着用最基本的调用方法来使...</summary><published>2010-07-28T03:40:00Z</published><updated>2010-07-28T03:40:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/07/28/1786733.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/07/28/1786733.html"/><content type="html">&lt;p&gt;最近因为项目的关系开始研究COM组件了,以前都认为COM过时了,所以也没怎么接触. 现在好好补补课了.&lt;/p&gt;&lt;p&gt;一般调用COM都是通过注册表找到它的位置, 然后调用COM库的标准函数. 这些封装无疑使得我这个初学者无法了解里面到底做了什么, 而且注册表和COM库标准函数都是windows提供的, 但是COM这个思想是可以在Linux下实现的. 只要知道它的实现原理就行了. 因此我就试着用最基本的调用方法来使用COM组件, 以了解其调用过程和原理.&lt;/p&gt;&lt;p&gt;首先,我用vs的ATL创建了一个简单的ATL项目test, 然后添加了一个简单对象Mytest, 该对象实现了一个IMytest接口,该接口有一个testfunc函数. 编译生成了一堆自动产生的文件, 我们只需要最后的test.dll文件和test.h文件. 有了这两个文件,我们就可以使用该组件中实现的接口了.&lt;/p&gt;&lt;p&gt;然后,我创建了一个win32控制台项目来测试一下如何不使用注册表来调用COM组件中的接口方法. 不使用注册表,那么该test.DLL文件也就不需要使用regsvr32.exe来注册组件了,我们使用手动加载的方式来使用COM组件. (将test.dll放在win32程序运行目录下,将test.H文件放在win32工程目录下)&lt;/p&gt;&lt;p&gt;过程如下:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;// usetest.cpp : 定义控制台应用程序的入口点。&lt;br/&gt;//&lt;br/&gt;#include "stdafx.h"&lt;br/&gt;#include "test.h"&lt;br/&gt;//#import "test.dll"&lt;br/&gt;#include &amp;lt;iostream&amp;gt;&lt;br/&gt;using namespace std;&lt;br/&gt;typedef HRESULT ( __stdcall *CREATEFUNC)(REFCLSID clsid,REFIID iid,void** ppobj);&lt;br/&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br/&gt;{&lt;br/&gt;HINSTANCE hi= ::LoadLibrary(L"test.dll");&lt;br/&gt;if(hi!=NULL)&lt;br/&gt;{&lt;br/&gt;   cout&amp;lt;&amp;lt;"dll loaded."&amp;lt;&amp;lt;endl;&lt;br/&gt;   CREATEFUNC CreateInstance = (CREATEFUNC)::GetProcAddress(hi,"DllGetClassObject");&lt;br/&gt;   if(CreateInstance!=NULL)&lt;br/&gt;   {&lt;br/&gt;    cout&amp;lt;&amp;lt;"get DllGetClassObject method - Success."&amp;lt;&amp;lt;endl;&lt;br/&gt;    IClassFactory* pICF = NULL;&lt;br/&gt;    HRESULT hr = CreateInstance(__uuidof(Mytest),IID_IClassFactory,(void**)&amp;amp;pICF);&lt;br/&gt;    if(SUCCEEDED(hr))&lt;br/&gt;    {&lt;br/&gt;     cout&amp;lt;&amp;lt;"create IClassFactory - Success."&amp;lt;&amp;lt;endl;&lt;br/&gt;     IMytest* pIMytest=NULL;&lt;br/&gt;     HRESULT hr2 = pICF-&amp;gt;CreateInstance(NULL,__uuidof(IMytest),(void**)&amp;amp;pIMytest);&lt;br/&gt;     if (SUCCEEDED(hr2))&lt;br/&gt;     {&lt;br/&gt;      cout&amp;lt;&amp;lt;"get interface - Success."&amp;lt;&amp;lt;endl;&lt;br/&gt;      HRESULT hr3=pIMytest-&amp;gt;testfunc(1);&lt;br/&gt;      if (SUCCEEDED(hr3))&lt;br/&gt;      {&lt;br/&gt;       cout&amp;lt;&amp;lt;"Invoke interface method OK."&amp;lt;&amp;lt;endl;&lt;br/&gt;      }&lt;br/&gt;      pIMytest-&amp;gt;Release();&lt;br/&gt;     }&lt;br/&gt;     pICF-&amp;gt;Release();&lt;br/&gt;    }&lt;br/&gt;   }&lt;br/&gt;   FreeLibrary(hi);&lt;br/&gt;}&lt;br/&gt;return 0;&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;和windows相关的只用到了dll加载相关的API,而这些在其他系统下都有对应的api. 所以如果想在其他系统下实现以下COM的调用, 还是可以的.&lt;/p&gt;&lt;p&gt;更进一步,可以使用xml文件来维护com组件的位置信息, 然后写一套与系统无关的通过xml文件查找com组件的库,这样就可以实现com组件的跨平台了.&lt;/p&gt;&lt;p&gt;哈哈,想法不错,实现起来还是有难度的.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1786733.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/07/28/1786733.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/07/05/1771402.html</id><title type="text">【总结】修复Ubuntu和Win7双系统菜单Grub2</title><summary type="text">win7软解的原因，不能将grub2装在MBR上。因此我将grub2装在我的ubuntu分区上了。 ubuntu是装在逻辑分区里面的，刚开始grub2并不能引导我的ubuntu，一开机就出现win7的启动选择界面。只能手动进入grub4dos来启动ubuntu。在网上找了easybcd添加了linux的启动菜单，但是不管用，可能是easybcd对grub2支持不好吧，easybcd1.7最后更新时...</summary><published>2010-07-05T07:09:00Z</published><updated>2010-07-05T07:09:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/07/05/1771402.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/07/05/1771402.html"/><content type="html">&lt;p&gt;win7软解的原因，不能将grub2装在MBR上。因此我将grub2装在我的ubuntu分区上了。 ubuntu是装在逻辑分区里面的，刚开始grub2并不能引导我的ubuntu，&lt;/p&gt;&lt;p&gt;一开机就出现win7的启动选择界面。只能手动进入grub4dos来启动ubuntu。在网上找了easybcd添加了linux的启动菜单，但是不管用，可能是easybcd对grub2支持不好吧，easybcd1.7最后更新时间是2008年，很久没有改进了。&lt;/p&gt;&lt;p&gt;绝望之中，我找到了下面这个文章&lt;/p&gt;&lt;p&gt;&lt;a href="http://linux.ctocio.com.cn/257/9486757.shtml"&gt;http://linux.ctocio.com.cn/257/9486757.shtml&lt;/a&gt;&lt;/p&gt;&lt;p&gt;教你修复grub2到指定的分区的。&lt;/p&gt;&lt;p&gt;我按照提示将grub2修复到/DEV/SDA5分区上（我的ubuntu是在逻辑分区的第一个），终于开机就能看到grub2的菜单选择界面了。&lt;/p&gt;&lt;p&gt;grub-probe&amp;nbsp;-t&amp;nbsp;device&amp;nbsp;/boot/grub &amp;nbsp;查看grub2的安装位置，显示 /dev/sda5。正和我意。可以不用破坏win7的软解了。&lt;/p&gt;&lt;p&gt;里面英文的步骤很详细，我简化如下：&lt;/p&gt;&lt;p&gt;用光盘livecd启动，加载ubuntu所在的分区sudo&amp;nbsp;mount&amp;nbsp;/dev/sda5&amp;nbsp;/mnt &amp;nbsp;，如果有单独的boot分区，则加载boot分区sudo&amp;nbsp;mount&amp;nbsp;/dev/sdYY&amp;nbsp;/mnt/boot，sdYY为boot所在的独立分区 &amp;nbsp; &amp;nbsp;，依次执行如下内容：&lt;/p&gt;&lt;p&gt;sudo&amp;nbsp;mount&amp;nbsp;--bind&amp;nbsp;/dev/&amp;nbsp;/mnt/dev&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;sudo&amp;nbsp;mount&amp;nbsp;--bind&amp;nbsp;/usr/&amp;nbsp;/mnt/usr&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;sudo&amp;nbsp;mount&amp;nbsp;--bind&amp;nbsp;/proc/&amp;nbsp;/mnt/proc&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;sudo&amp;nbsp;chroot&amp;nbsp;/mnt&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;update-grub&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;grub-install&amp;nbsp;/dev/sda&lt;/p&gt;&lt;p&gt;这样就修复好了。然后&amp;nbsp;CTRL-D退出chroot，sudo&amp;nbsp;umount&amp;nbsp;/mnt/dev，umount&amp;nbsp;/mnt ，然后重启，退出livecd光盘。这样就可以正常进入ubuntu了。&lt;/p&gt;&lt;p&gt;不过现在多重菜单还不完整，进入ubuntu后，再次执行sudo&amp;nbsp;update-grub更新当前安装的系统。然后重启，就可以看到所有安装好的系统了。&lt;/p&gt;&lt;p&gt;终于搞定 ubuntu和win7双系统的问题了，要兼顾MBR还是有点麻烦。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1771402.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/07/05/1771402.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/absolute8511/archive/2010/07/04/1770750.html</id><title type="text">使用C#批量转换文本文件编码为UTF8</title><summary type="text">现在很多地方都要求程序源码用UTF8格式，因此需要将原来的源码转换一下，手动转显然太累了。发现c#还真是简单啊，几行代码就搞定了。 试了一下GBK转换成UTF8编码格式，没什么问题了。</summary><published>2010-07-04T01:28:00Z</published><updated>2010-07-04T01:28:00Z</updated><author><name>absolute</name><uri>http://www.cnblogs.com/absolute8511/</uri></author><link rel="alternate" href="http://www.cnblogs.com/absolute8511/archive/2010/07/04/1770750.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/absolute8511/archive/2010/07/04/1770750.html"/><content type="html">&lt;p&gt;现在很多地方都要求程序源码用UTF8格式，因此需要将原来的源码转换一下，手动转显然太累了。&lt;/p&gt;&lt;p&gt;发现c#还真是简单啊，几行代码就搞定了。 试了一下GBK转换成UTF8编码格式，没什么问题了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;       static void Main(string[] args)&lt;br/&gt;        {&lt;br/&gt;            string dir, filters;&lt;br/&gt;            Console.WriteLine("Please input the directory:");&lt;br/&gt;            dir = Console.ReadLine();&lt;br/&gt;            Console.WriteLine("Please input the filter(such as *.c,*.cpp):");&lt;br/&gt;            filters = Console.ReadLine();&lt;br/&gt;            Console.WriteLine("The following files will be converted:");&lt;br/&gt;            List&amp;lt;string&amp;gt; destfiles = new List&amp;lt;string&amp;gt;();&lt;br/&gt;            foreach (string filter in filters.Split(','))&lt;br/&gt;            {&lt;br/&gt;                foreach (var eachfileinfo in new DirectoryInfo(dir).GetFiles(filter, SearchOption.AllDirectories))&lt;br/&gt;                {&lt;br/&gt;                    destfiles.Add(eachfileinfo.FullName);&lt;br/&gt;                    Console.WriteLine(eachfileinfo.FullName);&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;            Console.WriteLine("You Sure? (y or n)");&lt;br/&gt;            string ans = Console.ReadLine();&lt;br/&gt;            if (ans.Equals("y", StringComparison.OrdinalIgnoreCase))&lt;br/&gt;            {&lt;br/&gt;                foreach (string destfile in destfiles)&lt;br/&gt;                {&lt;br/&gt;                    File.WriteAllText(destfile, File.ReadAllText(destfile,Encoding.Default), Encoding.UTF8);&lt;br/&gt;                }&lt;br/&gt;                Console.WriteLine("finished.");&lt;br/&gt;            }&lt;br/&gt;            else&lt;br/&gt;            {&lt;br/&gt;                Console.WriteLine("Nothing changed.");&lt;br/&gt;            }&lt;br/&gt;            Console.WriteLine("Press any key to exit.");&lt;br/&gt;            Console.ReadLine();&lt;br/&gt;        }&lt;br/&gt;&lt;img src="http://www.cnblogs.com/absolute8511/aggbug/1770750.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/absolute8511/archive/2010/07/04/1770750.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
