﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-FongLuo</title><link>http://www.cppblog.com/FongLuo/</link><description>命运负责洗牌,但是玩牌的是我们自己</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:08:02 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:08:02 GMT</pubDate><ttl>60</ttl><item><title>STL算法概述</title><link>http://www.cppblog.com/FongLuo/archive/2017/05/26/214958.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Fri, 26 May 2017 01:18:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/05/26/214958.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214958.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/05/26/214958.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214958.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214958.html</trackback:ping><description><![CDATA[<p><a href="原文地址">http://www.cnblogs.com/kzloser/archive/2012/11/02/2751424.html</a></p> <h2>目录</h2> <p><strong><a style="text-decoration: none; color: #ff0000" href="#a1">STL算法概述</a><br><a style="text-decoration: none; color: #ff0000" href="#a2">查找算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a3">堆算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a4">关系算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a5">集合算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a6">排列组合算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a7">排序和通用算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a8">删除和替换算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a9">生成和变异算法</a><br><a style="text-decoration: none; color: #ff0000" href="#a10">算数算法</a> </strong></p> <hr>  <h2><a name="a1"></a>STL算法概述</h2> <p><strong>简介:</strong></p> <p style="margin-left: 30px">STL算法部分主要由头文件&lt;algorithm&gt;,&lt;numeric&gt;,&lt;functional&gt;组成。要使用 STL中的算法函数必须包含头文件&lt;algorithm&gt;，对于数值算法须包含&lt;numeric&gt;，&lt;functional&gt;中则定义了一些模板类，用来声明函数对象</p> <p><strong>注意:</strong></p> <p style="margin-left: 30px">编译器无法检测出所传递的迭代器是一个无效形式的迭代器,当然也无法给出算法函数错误的提示,因为迭代器并不是真实的类别,它只是传递给函数模板的一种参数格式而已</p> <p><strong>STL中算法分类:</strong></p> <ul> <li>操作对象  <ul> <li>直接改变容器的内容  <li>将原容器的内容复制一份,修改其副本,然后传回该副本 </li></ul> <li>功能:  <ul> <li>非可变序列算法 指不直接修改其所操作的容器内容的算法  <li>可变序列算法 指可以修改它们所操作的容器内容的算法  <li>排序算法 包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作  <li>数值算法 对容器内容进行数值计算 </li></ul></li></ul> <hr>  <h2><a name="a2"></a>查找算法<span style="font-size: 15px">(13个)：判断容器中是否包含某个值</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">adjacent_find</td> <td>&lt;algorithm&gt;</td> <td>在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator .否则返回last.重载版本使用输入的二元操作符代替相等的判断</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt&gt; FwdIt adjacent_find(FwdIt first, FwdIt last);</td></tr> <tr> <td>template&lt;class FwdIt, class Pred&gt; FwdIt adjacent_find(FwdIt first, FwdIt last, Pred pr);</td></tr> <tr> <td rowspan="3">binary_search</td> <td>&lt;algorithm&gt;</td> <td>在有序序列中查找value,找到返回true.重载的版本实用指定的比较函数对象或函数指针来判断相等</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt, class T&gt; bool binary_search(FwdIt first, FwdIt last, const T&amp; val);</td></tr> <tr> <td>template&lt;class FwdIt, class T, class Pred&gt; bool binary_search(FwdIt first, FwdIt last, const T&amp; val,Pred pr);</td></tr> <tr> <td rowspan="2">count</td> <td>&lt;algorithm&gt;</td> <td>利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class Dist&gt; size_t count(InIt first, InIt last,const T&amp; val, Dist&amp; n);</td></tr> <tr> <td rowspan="2">count_if</td> <td>&lt;algorithm&gt;</td> <td>利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class Pred, class Dist&gt; size_t count_if(InIt first, InIt last, Pred pr);</td></tr> <tr> <td rowspan="3">equal_range</td> <td>&lt;algorithm&gt;</td> <td>功能类似equal，返回一对iterator，第一个表示lower_bound，第二个表示upper_bound</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt, class T&gt; pair&lt;FwdIt, FwdIt&gt; equal_range(FwdIt first, FwdIt last,const T&amp; val);</td></tr> <tr> <td>template&lt;class FwdIt, class T, class Pred&gt; pair&lt;FwdIt, FwdIt&gt; equal_range(FwdIt first, FwdIt last,const T&amp; val, Pred pr);</td></tr> <tr> <td rowspan="2">find</td> <td>&lt;algorithm&gt;</td> <td>利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较.当匹配时,结束搜索,返回该元素的一个InputIterator</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class T&gt; InIt find(InIt first, InIt last, const T&amp; val);</td></tr> <tr> <td rowspan="3">find_end</td> <td>&lt;algorithm&gt;</td> <td>在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现.找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator.重载版本使用用户输入的操作符代替等于操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt1, class FwdIt2&gt; FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);</td></tr> <tr> <td>template&lt;class FwdIt1, class FwdIt2, class Pred&gt; FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2, Pred pr);</td></tr> <tr> <td rowspan="3">find_first_of</td> <td>&lt;algorithm&gt;</td> <td>在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt1, class FwdIt2&gt; FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);</td></tr> <tr> <td>template&lt;class FwdIt1, class FwdIt2, class Pred&gt; FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2, Pred pr);</td></tr> <tr> <td rowspan="2">find_if</td> <td>&lt;algorithm&gt;</td> <td>使用输入的函数代替等于操作符执行find</td></tr> <tr> <td>&nbsp;</td> <td>template&lt;class InIt, class Pred&gt; InIt find_if(InIt first, InIt last, Pred pr);</td></tr> <tr> <td rowspan="3">lower_bound</td> <td>&lt;algorithm&gt;</td> <td>返回一个ForwardIterator，指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置.重载函数使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt, class T&gt; FwdIt lower_bound(FwdIt first, FwdIt last, const T&amp; val);</td></tr> <tr> <td>template&lt;class FwdIt, class T, class Pred&gt; FwdIt lower_bound(FwdIt first, FwdIt last, const T&amp; val, Pred pr);</td></tr> <tr> <td rowspan="3">upper_bound</td> <td>&lt;algorithm&gt;</td> <td>返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置，该位置标志一个大于value的值.重载函数使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt, class T&gt; FwdIt upper_bound(FwdIt first, FwdIt last, const T&amp; val);</td></tr> <tr> <td>template&lt;class FwdIt, class T, class Pred&gt; FwdIt upper_bound(FwdIt first, FwdIt last, const T&amp; val, Pred pr);</td></tr> <tr> <td rowspan="3">search</td> <td>&lt;algorithm&gt;</td> <td>给出两个范围，返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置，查找失败指向last1,重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt1, class FwdIt2&gt; FwdIt1 search(FwdIt1 first1, FwdIt1 last1,FwdIt2 first2, FwdIt2 last2);</td></tr> <tr> <td>template&lt;class FwdIt1, class FwdIt2, class Pred&gt; FwdIt1 search(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2, Pred pr);</td></tr> <tr> <td rowspan="3">search_n</td> <td>&lt;algorithm&gt;</td> <td>在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt, class Dist, class T&gt; FwdIt search_n(FwdIt first, FwdIt last,Dist n, const T&amp; val);</td></tr> <tr> <td>template&lt;class FwdIt, class Dist, class T, class Pred&gt; FwdIt search_n(FwdIt first, FwdIt last,Dist n, const T&amp; val, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a3"></a>堆算法<span style="font-size: 15px">(4个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">make_heap</td> <td>&lt;algorithm&gt;</td> <td>把指定范围内的元素生成一个堆。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void make_heap(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void make_heap(RanIt first, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">pop_heap</td> <td>&lt;algorithm&gt;</td> <td>并不真正把最大元素从堆中弹出，而是重新排序堆。它把first和last-1交换，然后重新生成一个堆。可使用容器的back来访问被"弹出"的元素或者使用pop_back进行真正的删除。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void pop_heap(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void pop_heap(RanIt first, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">push_heap</td> <td>&lt;algorithm&gt;</td> <td>假设first到last-1是一个有效堆，要被加入到堆的元素存放在位置last-1，重新生成堆。在指向该函数前，必须先把元素插入容器后。重载版本使用指定的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt;void push_heap(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void push_heap(RanIt first, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">sort_heap</td> <td>&lt;algorithm&gt;</td> <td>对指定范围内的序列重新排序，它假设该序列是个有序堆。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void sort_heap(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void sort_heap(RanIt first, RanIt last, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a4"></a>关系算法<span style="font-size: 15px">(8个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">equal</td> <td>&lt;algorithm&gt;</td> <td>如果两个序列在标志范围内元素都相等，返回true。重载版本使用输入的操作符代替默认的等于操作符</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2&gt; bool equal(InIt1 first, InIt1 last, InIt2 x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class Pred&gt; bool equal(InIt1 first, InIt1 last, InIt2 x, Pred pr);</td></tr> <tr> <td rowspan="3">includes</td> <td>&lt;algorithm&gt;</td> <td>判断第一个指定范围内的所有元素是否都被第二个范围包含，使用底层元素的&lt;操作符，成功返回true。重载版本使用用户输入的函数</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2&gt; bool includes(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class Pred&gt; bool includes(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, Pred pr);</td></tr> <tr> <td rowspan="3">lexicographical_compare</td> <td>&lt;algorithm&gt;</td> <td>比较两个序列。重载版本使用用户自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2&gt; bool lexicographical_compare(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class Pred&gt; bool lexicographical_compare(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, Pred pr);</td></tr> <tr> <td rowspan="3">max</td> <td>&lt;algorithm&gt;</td> <td>返回两个元素中较大一个。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class T&gt; const T&amp; max(const T&amp; x, const T&amp; y);</td></tr> <tr> <td>template&lt;class T, class Pred&gt; const T&amp; max(const T&amp;&nbsp; x, const T&amp; y, Pred pr);</td></tr> <tr> <td rowspan="3">max_element</td> <td>&lt;algorithm&gt;</td> <td>返回一个ForwardIterator，指出序列中最大的元素。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt&gt; FwdIt max_element(FwdIt first, FwdIt last);</td></tr> <tr> <td>template&lt;class FwdIt, class Pred&gt; FwdIt max_element(FwdIt first, FwdIt last, Pred pr);</td></tr> <tr> <td rowspan="3">min</td> <td>&lt;algorithm&gt;</td> <td>返回两个元素中较小一个。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class T&gt; const T&amp; min(const T&amp; x, const T&amp; y);</td></tr> <tr> <td>template&lt;class T, class Pred&gt; const T&amp; min(const T&amp; x, const T&amp; y, Pred pr);</td></tr> <tr> <td rowspan="3">min_element</td> <td>&lt;algorithm&gt;</td> <td>返回一个ForwardIterator，指出序列中最小的元素。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt&gt; FwdIt min_element(FwdIt first, FwdIt last);</td></tr> <tr> <td>template&lt;class FwdIt, class Pred&gt; FwdIt min_element(FwdIt first, FwdIt last, Pred pr);</td></tr> <tr> <td rowspan="3">mismatch</td> <td>&lt;algorithm&gt;</td> <td>并行比较两个序列，指出第一个不匹配的位置，返回一对iterator，标志第一个不匹配元素位置。如果都匹配，返回每个容器的last。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2&gt; pair&lt;InIt1, InIt2&gt; mismatch(InIt1 first, InIt1 last, InIt2 x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class Pred&gt; pair&lt;InIt1, InIt2&gt; mismatch(InIt1 first, InIt1 last, InIt2 x, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a5"></a>集合算法<span style="font-size: 15px">(4个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">set_union</td> <td>&lt;algorithm&gt;</td> <td>构造一个有序序列，包含两个序列中所有的不重复元素。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class OutIt&gt; OutIt set_union(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Pred&gt; OutIt set_union(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2,OutIt x, Pred pr);</td></tr> <tr> <td rowspan="3">set_intersection</td> <td>&lt;algorithm&gt;</td> <td>构造一个有序序列，其中元素在两个序列中都存在。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class OutIt&gt; OutIt set_intersection(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Pred&gt; OutIt set_intersection(InIt1 first1, InIt1 last1,InIt2 first2,InIt2 last2, OutIt x, Pred pr);</td></tr> <tr> <td rowspan="3">set_difference</td> <td>&lt;algorithm&gt;</td> <td>构造一个有序序列，该序列仅保留第一个序列中存在的而第二个中不存在的元素。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class OutIt&gt; OutIt set_difference(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Pred&gt; OutIt set_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x, Pred pr);</td></tr> <tr> <td rowspan="3">set_symmetric_difference</td> <td>&lt;algorithm&gt;</td> <td>构造一个有序序列，该序列取两个序列的对称差集(并集-交集)</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class OutIt&gt; OutIt set_symmetric_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Pred&gt; OutIt set_symmetric_difference(InIt1 first1, InIt1 last1, InIt2 first2, InIt2 last2, OutIt x, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a6"></a>排列组合算法<span style="font-size: 15px">(2个)提供计算给定集合按一定顺序的所有可能排列组合</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">next_permutation</td> <td>&lt;algorithm&gt;</td> <td>取出当前范围内的排列，并重新排序为下一个排列。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class BidIt&gt; bool next_permutation(BidIt first, BidIt last);</td></tr> <tr> <td>template&lt;class BidIt, class Pred&gt; bool next_permutation(BidIt first, BidIt last, Pred pr);</td></tr> <tr> <td rowspan="3">prev_permutation</td> <td>&lt;algorithm&gt;</td> <td>取出指定范围内的序列并将它重新排序为上一个序列。如果不存在上一个序列则返回false。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class BidIt&gt; bool prev_permutation(BidIt first, BidIt last);</td></tr> <tr> <td>template&lt;class BidIt, class Pred&gt; bool prev_permutation(BidIt first, BidIt last, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a7"></a>排序和通用算法<span style="font-size: 15px">(14个)：提供元素排序策略</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">inplace_merge</td> <td>&lt;algorithm&gt;</td> <td>合并两个有序序列，结果序列覆盖两端范围。重载版本使用输入的操作进行排序</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class BidIt&gt; void inplace_merge(BidIt first, BidIt middle, BidIt last);</td></tr> <tr> <td>template&lt;class BidIt, class Pred&gt; void inplace_merge(BidIt first, BidIt middle, BidIt last, Pred pr);</td></tr> <tr> <td rowspan="3">merge</td> <td>&lt;algorithm&gt;</td> <td>合并两个有序序列，存放到另一个序列。重载版本使用自定义的比较</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class OutIt&gt; OutIt merge(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Pred&gt; OutIt merge(InIt1 first1, InIt1 last1,InIt2 first2, InIt2 last2, OutIt x, Pred pr);</td></tr> <tr> <td rowspan="3">nth_element</td> <td>&lt;algorithm&gt;</td> <td>将范围内的序列重新排序，使所有小于第n个元素的元素都出现在它前面，而大于它的都出现在后面。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void nth_element(RanIt first, RanIt nth, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void nth_element(RanIt first, RanIt nth, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">partial_sort</td> <td>&lt;algorithm&gt;</td> <td>对序列做部分排序，被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void partial_sort(RanIt first, RanIt middle, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void partial_sort(RanIt first, RanIt middle, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">partial_sort_copy</td> <td>&lt;algorithm&gt;</td> <td>与partial_sort类似，不过将经过排序的序列复制到另一个容器</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class RanIt&gt; RanIt partial_sort_copy(InIt first1, InIt last1,RanIt first2, RanIt last2);</td></tr> <tr> <td>template&lt;class InIt, class RanIt, class Pred&gt; RanIt partial_sort_copy(InIt first1, InIt last1,RanIt first2, RanIt last2, Pred pr);</td></tr> <tr> <td rowspan="2">partition</td> <td>&lt;algorithm&gt;</td> <td>对指定范围内元素重新排序，使用输入的函数，把结果为true的元素放在结果为false的元素之前</td></tr> <tr> <td>函数原形</td> <td>template&lt;class BidIt, class Pred&gt; BidIt partition(BidIt first, BidIt last, Pred pr);</td></tr> <tr> <td rowspan="3">random_shuffle</td> <td>&lt;algorithm&gt;</td> <td>对指定范围内的元素随机调整次序。重载版本输入一个随机数产生操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void random_shuffle(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Fun&gt; void random_shuffle(RanIt first, RanIt last, Fun&amp; f);</td></tr> <tr> <td rowspan="2">reverse</td> <td>&lt;algorithm&gt;</td> <td>将指定范围内元素重新反序排序</td></tr> <tr> <td>函数原形</td> <td>template&lt;class BidIt&gt; void reverse(BidIt first, BidIt last);</td></tr> <tr> <td rowspan="2">reverse_copy</td> <td>&lt;algorithm&gt;</td> <td>与reverse类似，不过将结果写入另一个容器</td></tr> <tr> <td>函数原形</td> <td>template&lt;class BidIt, class&amp;nnbsp;OutIt&gt; OutIt reverse_copy(BidIt first, BidIt last, OutIt x);</td></tr> <tr> <td rowspan="2">rotate</td> <td>&lt;algorithm&gt;</td> <td>将指定范围内元素移到容器末尾，由middle指向的元素成为容器第一个元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt&gt; void rotate(FwdIt first, FwdIt middle, FwdIt last);</td></tr> <tr> <td rowspan="2">rotate_copy</td> <td>&lt;algorithm&gt;</td> <td>与rotate类似，不过将结果写入另一个容器</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class OutIt&gt; OutIt rotate_copy(FwdIt first, FwdIt middle, FwdIt last, OutIt x);</td></tr> <tr> <td rowspan="3">sort</td> <td>&lt;algorithm&gt;</td> <td>以升序重新排列指定范围内的元素。重载版本使用自定义的比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class RanIt&gt; void sort(RanIt first, RanIt last);</td></tr> <tr> <td>template&lt;class RanIt, class Pred&gt; void sort(RanIt first, RanIt last, Pred pr);</td></tr> <tr> <td rowspan="3">stable_sort</td> <td>&lt;algorithm&gt;</td> <td>与sort类似，不过保留相等元素之间的顺序关系</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class BidIt&gt; void stable_sort(BidIt first, BidIt last);</td></tr> <tr> <td>template&lt;class BidIt, class Pred&gt; void stable_sort(BidIt first, BidIt last, Pred pr);</td></tr> <tr> <td rowspan="2">stable_partition</td> <td>&lt;algorithm&gt;</td> <td>与partition类似，不过不保证保留容器中的相对顺序</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class Pred&gt; FwdIt stable_partition(FwdIt first, FwdIt last, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a8"></a>删除和替换算法<span style="font-size: 15px">(15个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="2">copy</td> <td>&lt;algorithm&gt;</td> <td>复制序列</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class OutIt&gt; OutIt copy(InIt first, InIt last, OutIt x);</td></tr> <tr> <td rowspan="2">copy_backward</td> <td>&lt;algorithm&gt;</td> <td>与copy相同，不过元素是以相反顺序被拷贝</td></tr> <tr> <td>函数原形</td> <td>template&lt;class BidIt1, class BidIt2&gt; BidIt2 copy_backward(BidIt1 first, BidIt1 last, BidIt2 x);</td></tr> <tr> <td rowspan="2">iter_swap</td> <td>&lt;algorithm&gt;</td> <td>交换两个ForwardIterator的值</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt1, class FwdIt2&gt; void iter_swap(FwdIt1 x, FwdIt2 y);</td></tr> <tr> <td rowspan="2">remove</td> <td>&lt;algorithm&gt;</td> <td>删除指定范围内所有等于指定元素的元素。注意，该函数不是真正删除函数。内置函数不适合使用remove和remove_if函数</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class T&gt; FwdIt remove(FwdIt first, FwdIt last, const T&amp; val);</td></tr> <tr> <td rowspan="2">remove_copy</td> <td>&lt;algorithm&gt;</td> <td>将所有不匹配元素复制到一个制定容器，返回OutputIterator指向被拷贝的末元素的下一个位置</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class OutIt, class T&gt; OutIt remove_copy(InIt first, InIt last, OutIt x, const T&amp; val);</td></tr> <tr> <td rowspan="2">remove_if</td> <td>&lt;algorithm&gt;</td> <td>删除指定范围内输入操作结果为true的所有元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class Pred&gt; FwdIt remove_if(FwdIt first, FwdIt last, Pred pr);</td></tr> <tr> <td rowspan="2">remove_copy_if</td> <td>&lt;algorithm&gt;</td> <td>将所有不匹配元素拷贝到一个指定容器</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class OutIt, class Pred&gt; OutIt remove_copy_if(InIt first, InIt last, OutIt x, Pred pr);</td></tr> <tr> <td rowspan="2">replace</td> <td>&lt;algorithm&gt;</td> <td>将指定范围内所有等于vold的元素都用vnew代替</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class T&gt; void replace(FwdIt first, FwdIt last,const T&amp; vold, const T&amp; vnew);</td></tr> <tr> <td rowspan="2">replace_copy</td> <td>&lt;algorithm&gt;</td> <td>与replace类似，不过将结果写入另一个容器</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class OutIt, class T&gt; OutIt replace_copy(InIt first, InIt last, OutIt x,const T&amp; vold, const T&amp; vnew);</td></tr> <tr> <td rowspan="2">replace_if</td> <td>&lt;algorithm&gt;</td> <td>将指定范围内所有操作结果为true的元素用新值代替</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class Pred, class T&gt; void replace_if(FwdIt first, FwdIt last,Pred pr, const T&amp; val);</td></tr> <tr> <td rowspan="2">replace_copy_if</td> <td>&lt;algorithm&gt;</td> <td>与replace_if，不过将结果写入另一个容器</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class OutIt, class Pred, class T&gt; OutIt replace_copy_if(InIt first, InIt last, OutIt x, Pred pr, const T&amp; val);</td></tr> <tr> <td rowspan="2">swap</td> <td>&lt;algorithm&gt;</td> <td>交换存储在两个对象中的值</td></tr> <tr> <td>函数原形</td> <td>template&lt;class T&gt; void swap(T&amp; x, T&amp; y);</td></tr> <tr> <td rowspan="2">swap_range</td> <td>&lt;algorithm&gt;</td> <td>将指定范围内的元素与另一个序列元素值进行交换</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt1, class FwdIt2&gt; FwdIt2 swap_ranges(FwdIt1 first, FwdIt1 last, FwdIt2 x);</td></tr> <tr> <td rowspan="3">unique</td> <td>&lt;algorithm&gt;</td> <td>清除序列中重复元素，和remove类似，它也不能真正删除元素。重载版本使用自定义比较操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class FwdIt&gt; FwdIt unique(FwdIt first, FwdIt last);</td></tr> <tr> <td>template&lt;class FwdIt, class Pred&gt; FwdIt unique(FwdIt first, FwdIt last, Pred pr);</td></tr> <tr> <td rowspan="3">unique_copy</td> <td>&lt;algorithm&gt;</td> <td>与unique类似，不过把结果输出到另一个容器</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class OutIt&gt; OutIt unique_copy(InIt first, InIt last, OutIt x);</td></tr> <tr> <td>template&lt;class InIt, class OutIt, class Pred&gt; OutIt unique_copy(InIt first, InIt last, OutIt x, Pred pr);</td></tr></tbody></table> <hr>  <h2><a name="a9"></a>生成和变异算法<span style="font-size: 15px">(6个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="2">fill</td> <td>&lt;algorithm&gt;</td> <td>将输入值赋给标志范围内的所有元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class T&gt; void fill(FwdIt first, FwdIt last, const T&amp; x);</td></tr> <tr> <td rowspan="2">fill_n</td> <td>&lt;algorithm&gt;</td> <td>将输入值赋给first到first+n范围内的所有元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class OutIt, class Size, class T&gt; void fill_n(OutIt first, Size n, const T&amp; x);</td></tr> <tr> <td rowspan="2">for_each</td> <td>&lt;algorithm&gt;</td> <td>用指定函数依次对指定范围内所有元素进行迭代访问，返回所指定的函数类型。该函数不得修改序列中的元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class InIt, class Fun&gt; Fun for_each(InIt first, InIt last, Fun f);</td></tr> <tr> <td rowspan="2">generate</td> <td>&lt;algorithm&gt;</td> <td>连续调用输入的函数来填充指定的范围</td></tr> <tr> <td>函数原形</td> <td>template&lt;class FwdIt, class Gen&gt; void generate(FwdIt first, FwdIt last, Gen g);</td></tr> <tr> <td rowspan="2">generate_n</td> <td>&lt;algorithm&gt;</td> <td>与generate函数类似，填充从指定iterator开始的n个元素</td></tr> <tr> <td>函数原形</td> <td>template&lt;class OutIt, class Pred, class Gen&gt; void generate_n(OutIt first, Dist n, Gen g);</td></tr> <tr> <td rowspan="3">transform</td> <td>&lt;algorithm&gt;</td> <td>将输入的操作作用与指定范围内的每个元素，并产生一个新的序列。重载版本将操作作用在一对元素上，另外一个元素来自输入的另外一个序列。结果输出到指定容器</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class OutIt, class Unop&gt; OutIt transform(InIt first, InIt last, OutIt x, Unop uop);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class OutIt, class Binop&gt; OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2,OutIt x, Binop bop);</td></tr></tbody></table> <hr>  <h2><a name="a10"></a>算数算法<span style="font-size: 15px">(4个)</span></h2> <table style="width: 95%" bgcolor="lightyellow" border="1"> <tbody> <tr bgcolor="#182448"> <td><span style="color: #fff">函数名</span></td> <td><span style="color: #fff">头文件</span></td> <td><span style="color: #fff">函数功能</span></td></tr> <tr> <td rowspan="3">accumulate</td> <td>&lt;numeric&gt;</td> <td>iterator对标识的序列段元素之和，加到一个由val指定的初始值上。重载版本不再做加法，而是传进来的二元操作符被应用到元素上</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class T&gt; T accumulate(InIt first, InIt last, T val);</td></tr> <tr> <td>template&lt;class InIt, class T, class Pred&gt; T accumulate(InIt first, InIt last, T val, Pred pr);</td></tr> <tr> <td rowspan="3">partial_sum</td> <td>&lt;numeric&gt;</td> <td>创建一个新序列，其中每个元素值代表指定范围内该位置前所有元素之和。重载版本使用自定义操作代替加法</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class OutIt&gt; OutIt partial_sum(InIt first, InIt last,OutIt result);</td></tr> <tr> <td>template&lt;class InIt, class OutIt, class Pred&gt; OutIt partial_sum(InIt first, InIt last,OutIt result, Pred pr);</td></tr> <tr> <td rowspan="3">product</td> <td>&lt;numeric&gt;</td> <td>对两个序列做内积(对应元素相乘，再求和)并将内积加到一个输入的初始值上。重载版本使用用户定义的操作</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt1, class InIt2, class T&gt; T product(InIt1 first1, InIt1 last1,Init2 first2, T val);</td></tr> <tr> <td>template&lt;class InIt1, class InIt2, class T,class Pred1, class Pred2&gt; T product(InIt1 first1, InIt1 last1,Init2 first2, T val, Pred1 pr1, Pred2 pr2);</td></tr> <tr> <td rowspan="3">adjacent_difference</td> <td>&lt;numeric&gt;</td> <td>创建一个新序列，新序列中每个新值代表当前元素与上一个元素的差。重载版本用指定二元操作计算相邻元素的差</td></tr> <tr> <td rowspan="2">函数原形</td> <td>template&lt;class InIt, class OutIt&gt; OutIt adjacent_difference(InIt first, InIt last,OutIt result);</td></tr> <tr> <td>template&lt;class InIt, class OutIt, class Pred&gt; OutIt adjacent_difference(InIt first, InIt last,OutIt result, Pred pr);</td></tr></tbody></table><img src ="http://www.cppblog.com/FongLuo/aggbug/214958.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-05-26 09:18 <a href="http://www.cppblog.com/FongLuo/archive/2017/05/26/214958.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Listary Pro- 文件浏览与搜索增强的超级神器</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/27/214704.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 27 Feb 2017 00:50:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/27/214704.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214704.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/27/214704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214704.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214704.html</trackback:ping><description><![CDATA[<h3><a href="http://www.cnblogs.com/leftshine/p/Listary.html">Listary Pro- 文件浏览与搜索增强的超级神器</a></h3> <p>Listary 是一款 Windows 文件浏览增强工具，为 Windows 资源管理器增加智能命令、最近文档以及收藏功能。文件小，功能强大。<br><strong>秒杀系统自带搜索功能！！</strong> <p>它是一款非常优秀的 Windows 文件浏览和搜索增强工具，可以为你 Windows 的「文件浏览对话框」、「资源管理器」等增加非常方便的文件快速定位、实时全盘搜索、常用文件夹收藏、打开历史、快速切换到已打开的路径、快捷右键菜单等一系列非常非常实用和高效的功能，它能将 Windows 的便捷性提高到一个新的高度！ <p>这里有一段来自iPlaySoft.com的视频介绍，其中就展现了 Listary 怎样为我们带来的高效操作体验的： <p>如视频演示，使用 Listary 之后，你完全不需像一般的搜索软件那样去找搜索框或启动窗口来进行输入，在资源管理器或对话框的界面下，只需直接按键盘，输入字母就能轻松定位和操作文件了（非常赞的一点是它竟然能支持用拼音缩写来匹配中文文件名），善加使用可以节省大量的鼠标移动和点击，极大的提升文件操作效率。当你习惯了使用 Listary 之后，你一定不会再愿意回到过去！因为你永远都不知道，它以后到底能为你省回多少那些原本被默默浪费掉的生命！又或许，用过之后你才知道，原来 Windows 还能这么个用法！ <h5>Listary 的功能介绍：</h5> <p>Listary 体积小巧，而且运行快速，即便在低配置的电脑上常驻系统使用也不会察觉有丝毫拖慢速度的现象。它提供了简体中文语言，加上前面所说的拼音搜索功能，可以说对中文环境的支持已经达到了完美。虽然官网的介绍视频是英文的，但软件本身也提供了中文的 “教学” 功能，安装后第一次打开，软件会有新手指引，非常人性化，相信大家上手使用应该是无鸭梨的。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170219151618082-2085461549.jpg"> <p>集成在windows资源管理其中，操作非常方便 <h6><strong>方便新手上手，分享一些使用教程：</strong></h6> <p>1、双击Ctrl键，调出搜索界面<br>2、在搜索见面输入欲查找的文件或文件夹（如果是中文，建议用汉字，设置选项里面有模糊匹配）<br>3、搜索结果栏会出现在搜索界面下方，上、下键选择后回车直接调用关联程序。<br>5、建议长期使用者设置成随电脑启动。<br>6、经济条件允许的话，建议购买正版（支持国产软件，虽然不购买此软件也正常使用，只是部分Pro功能限制，正版终身免费升级）。<br>7、此上介绍仅仅只是该软件最大的使用亮点，其实还有很多功能，比如之前搜索过的历史记录可以随时调用等。 <p>Listary 除了支持 Windows 的资源管理器、文件对话框的增强之外，还能提供TotalCommander、WinRAR、FileZillar、7Zip、XYPlorer、FreeCommander 等知名软件的增强支持，配合它们用起来使用效率更加无敌！此外，如果你喜欢使用 Everything 进行文件搜索的话，Listary 还能与它结合，用它替代自身的搜索功能。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170219151922316-1919763793.jpg"> <p>WinRAR等第三方软件中也能用 <p>与第三方程序 Total Commander集成,详细请参考：<a href="http://xbeta.info/tc-listary.htm">Listary+TC: 提高效率，取代传统低效的"打开/保存"对话框</a> <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170219154806910-1541558213.gif" width="824" height="405"> <p>Listary+TC: 提高效率，取代传统低效的"打开/保存"对话框 <h6>免费版与Pro版区别：</h6> <p>除了视频中介绍的那些特性之外，Listary 其实还有很多很实用的增强功能和特性，譬如 Project (项目汇聚搜索)、FuzzyNavigation (搜索当前文件夹里面的所有文件)&nbsp; 等特性大家可以下载回去慢慢试用和体会。不过可惜的是，其中很多优秀的功能（如刚提到的两项、还有视频中按右方向键调用文件的菜单等等）都是 <strong>Listary Pro</strong> 专业版专享的，免费版并不能使用。所以如果你觉得免费版用得不够爽，或者用过觉得这软件确实有用，那么我极度建议你升级到 Pro 版，因为你不仅可以使用目前全部的功能，而且未来版本新增的功能也能全部获得。 <p>Pro版可以到<a href="http://www.listary.com/">官网</a>购买，当然本着互联网分享精神，这里提供一个免费注册Pro方法（相关文件下载链接在文末提供）： <blockquote> <p>Install Listary <p>Close the Program <p>Run (Run as admin) the file "Kill-ListaryService.bat" for stoping the ListaryService <p>Copy the cracked file "MSVCP140.dll" and paste to Listary Installtion Folder(C:\Program Files\Listary) <p>Register the program with following key <p>Name: Mike Rountree<br>Email: soft@instant-demo.com<br>Registration Code: <p>JE4V8T3M96PWT4SUCNZNVZ37XKLBU2QW<br>N64LEJQ3VHY7MPL6KY2R5SQZ76QFFTKP<br>VVE8JBVEAME8MMBRHRGF2P6MAJG7ZSQY<br>MUY2PGTQ2EG3W2YHTU2CFWL7SE6THU3Q<br>TAL3U894S2BWA9629EFCXYYYG3S65WEQ<br>5R234G26AT52UWD27PNENP4GR2EKKDK6 <p>Name: John James Jones<br>Email: john.james.jones@hushmail.com <p>Registration Code:<br>2RJSDKSSNGSXMYNWEEH7E4T6FUVCGPPB<br>CDADQ5LMEABJF76Y369B5LTLVXVFWUN3<br>26KQ58M78J2NNS6WKPT9CG4MJXNXH4MJ<br>YBYXSARTBNPFNVBF6UFXQUVEWXQQGSUY<br>HFF9AVV857AENGWWMPMRN5VLHB884JEA<br>Y48FXJJ5JDY6UVTP8FMJSHDLSAXZB5HE <p>Done</p></blockquote> <h6><strong><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170219160014363-1543086276.jpg"></strong></h6> <h6></h6> <p>成功升级到Pro版本 <h5>相关文件下载地址：</h5> <p>官方网站：<a href="http://www.listary.com/">访问</a> <p>链接：<a href="https://eyun.baidu.com/s/3qYqAZGo">https://eyun.baidu.com/s/3qYqAZGo</a> 密码：leftshine <p>参考文章： <p><a href="http://www.chongbuluo.com/forum.php?mod=viewthread&amp;tid=673">Listary – 文件浏览增强工具</a> <p><a href="http://www.iplaysoft.com/listary.html">Listary Pro - 能极大幅度提高你 Windows 文件浏览与搜索速度效率的「超级神器」</a> <p><a href="http://www.52pojie.cn/thread-576740-1-1.html">windows资源管理器增强工具Listary.Pro.5.0.2581.0最新破解</a><img src ="http://www.cppblog.com/FongLuo/aggbug/214704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-27 08:50 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/27/214704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# winform程序免安装.net framework在XP/win7/win10环境运行！</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/27/214703.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 27 Feb 2017 00:45:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/27/214703.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214703.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/27/214703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214703.html</trackback:ping><description><![CDATA[<h3><a href="http://www.cnblogs.com/xiefengdaxia123/p/6441665.html">C# winform程序免安装.net framework在XP/win7/win10环境运行！</a></h3> <h5><strong>前文：</strong></h5> <p>首先感谢群里的大神<strong>宇内流云 </strong>提供的anyexec for windows版本。 <p>经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后，测试通过,如下是用的xp运行winfrom程序的部分截图 <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225130139445-2029189323.png"> <p>下面是n年前入坑C#写的winform。。。玩毒奶粉用的，勿喷。 <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225130157413-1217025110.png"> <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225130704695-891705366.png"> <p>.net framework 4.5环境的winform程序 <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225130352913-749725817.png"> <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225131457773-1578652797.png"> <p>不过要注意的是，exe引用的自己写的dll需要放在根目录下 <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225131556960-1163669389.png"> <p><strong>整个步骤：</strong> <h5><strong>1、下载anyexec</strong>&nbsp; 链接: http://pan.baidu.com/s/1jIyViC2 密码: ss3a （链接已更新，支持中文名和中文路径）</h5> <h5><strong>2、目录内容介绍</strong></h5> <p>│ <strong>any.exe 运行控制台程序员的，名字要与放入app目录的控制台程序对应</strong><br>│ list.txt<br>│ <strong>winform.exe 运行winform程序的，名字要与放入app目录的控制台程序对应</strong><br>│ 使用说明.txt<br>│ <strong>备用DLL.zip&nbsp; mono环境下的dll，如果缺少了dll，可以将dll解压后，放到runtime\lib目录里面</strong><br>│ 目录结构.bat<br>│<em><em> </em></em> <p><em><em><em><em>├─app <strong>这目录存放你写的exe程序，里面是两个示例demo</strong><br>│ any.exe 示例控制台程序<br>│ winform.exe 示例winform程序<br>│<br>└─runtime mono运行环境<br>├─bin<br>├─etc<br>│ └─mono<br>│ │ browscap.ini<br>│ │<br>│ ├─4.5<br>│ │ │ DefaultWsdlHelpGenerator.aspx<br>│ │ │ machine.config<br>│ │ │ settings.map<br>│ │ │ web.config<br>│ │ │<br>│ │ └─Browsers<br>│ │ Compat.browser<br>│ │<br>│ └─mconfig<br>│ config.xml<br>│<br>└─<strong>lib 如果少了dll去备份dll.zip解压放置到这里</strong><br>│ any.dll<br>│ System.Drawing.dll<strong> winform程序必须的dll</strong><br>│ System.Windows.Forms.dll<strong> <em><em><em><em><strong>winform程序必须的dll</strong></em></em></em></em></strong><br>│<br>└─mono<br>├─4.5<br>└─gac</em></em></em></em> <h5><strong><em><em><em><em><br></em></em></em></em>3、把你写的winform程序放入到app目录</strong></h5> <p><em><em><em><em><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225134110554-150051719.png"></em></em></em></em> <p>exe如果有引用的dll就放在根目录下 <p>如下图，我引用了helper.dll文件 <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225134207851-1626161882.png"> <h5><strong>4、把根目录的winform.exe改成和app目录你放入的exe同名</strong></h5> <p>我这里改成了ShrinkDatabase.exe <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225134349023-55743062.png"> <p><strong>5、运行</strong> <p><img alt="" src="http://images2015.cnblogs.com/blog/564664/201702/564664-20170225134409413-106020591.png"> <p>如果需要linux环境下运行C#程序，请访问<strong>宇内流云</strong>大神的博客 <p><a href="http://www.cnblogs.com/yunei/p/5347590.html">不装mono，你的.NET程序照样可以在Linux上运行！</a> <h5><strong>意义</strong>：</h5> <p>无需在xp,win7下安装.net 4.5和以下的框架就可以直接运行你写的C#程序 <p>你可以制作更多更方便的绿色程序 <p>整个环境大小压缩后只有11.3M，不用的dll还可以删掉，获取更小的体积 <img src ="http://www.cppblog.com/FongLuo/aggbug/214703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-27 08:45 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/27/214703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何一秒钟从头构建一个 ASP.NET Core 中间件</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/27/214702.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 27 Feb 2017 00:43:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/27/214702.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214702.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/27/214702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214702.html</trackback:ping><description><![CDATA[<h3><a href="http://www.cnblogs.com/savorboard/p/generator-aspnetcore-middleware.html">如何一秒钟从头构建一个 ASP.NET Core 中间件</a></h3> <h5>前言</h5> <blockquote> <p>其实地上本没有路，走的人多了，也便成了路。 -- 鲁迅</p></blockquote> <p>就像上面鲁迅说的那样，其实在我们开发中间件的过程中，微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序， 但是其中却存在者一些最佳实践的方法，大多数人来使用这种方法来使应用程序变得更加容易理解并且易于维护，这就叫“路”，在2017年，这叫套路。 <p>在掌握了这些套路之后，能够帮助你迅速的搭建一个中间件的基本框架，并且易于扩展和维护，下面我们就来看看怎么样从头开始开发一个中间件吧。 <p>如果你对 ASP.NET Core HTTP 管道还不太清楚的话，下面这篇文章将有助于你对其进行一个系统的了解：<br><a href="http://www.cnblogs.com/savorboard/p/aspnetcore-http-pipeline.html">http://www.cnblogs.com/savorboard/p/aspnetcore-http-pipeline.html</a> <h5>Getting Started</h5> <p><strong>说明：</strong> 这只是通常情况下，具体的情况还请使用具体的套路。 <h6>Setup 1 创建扩展类</h6> <p>如果你的中间件需要一个向 ASP.NET Core 的 DI 容器中添加默认的一些服务的话，那么你就编写一个需要扩展类，用来在 Startup.cs 中的 ConfigureServices 中注册服务。 <p>举例，<a href="https://github.com/aspnet/BasicMiddleware/tree/dev/src/Microsoft.AspNetCore.ResponseCompression">Microsoft.AspNetCore.ResponseCompression</a> 这是一个用来压缩请求内容的一个中间件，那么它就需要一个服务用来处理压缩相关的东西，所以它扩展了 IServiceCollection 并且添加了自己的 Services。 <p>整个中间件的核心代码并非在这里，这里只是一个开始，那么有同学可能会问了，什么情况下我们需要提前向一个DI里面注入我们中间件需要的服务呢？ 答案是，如果你不知道或者不确定你需要什么样的服务的时候，跳过此步骤，进入下一步，再等你需要的时候再回头来补上就是。 <p>那么，我们先看一下编写一个扩展Service的静态类应该怎么做？ <p>首先，新建一个以 <code>xxxServicesExtensions</code> 文件名结尾的静态类，用来编写注入DI的扩展方法。 <p>类建立完成之后，需要向里面添加内容了。通常情况下，中间件中 Service 的扩展方法都是以 <code>Addxxx(this IServiceCollection services)</code> 开头来命名。在这里有一个需要注意的地方就是它的命名空间，通常情况下我们使用 <strong><code>using Microsoft.AspNetCore.Builder</code></strong> 这个命名空间。 <p>然后，方法里面就是需要注册的服务了。假设我们需要向里面注册一个 <code>IResponseCompressionProvider</code> 和 它的实现类 <code>ResponseCompressionProvider</code>，那么最终的扩展方法可能看起来是这样的。<pre><code>
using System;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace Microsoft.AspNetCore.Builder
{
    public static IServiceCollection AddResponseCompression(this IServiceCollection services)
    {
        if (services == null)
        {
            throw new ArgumentNullException(nameof(services));
        }
    
        services.TryAddSingleton&lt;IResponseCompressionProvider, ResponseCompressionProvider&gt;();
        return services;
    }
}
</code></pre>
<h6>Setup 2 创建配置类</h6>
<p>有的时候，用户在使用我们编写的中间件的时候，我们需要向提供者提供一些配置项，这些配置项在<strong>中间件执行之前</strong>用来传递一些必要参数信息或者是一些设置信息。举个我们熟悉例子，我们在使用 MVC 中间件的时候，可能会看到以下写法：<pre><code>
// Startup.cs
public void ConfigureServices(IServiceCollection services) 
{
  var userDefinedFilter = new xxxFilter();
  services.AddMvc(x =&gt; x.Filters.Add(userDefinedFilter));
 
}
</code></pre>
<p>可以看到，用户可将一些自定义的 Filter 传入到中间件的，然后中间件在运行的时候，我们传入的 Filter 就生效了。
<blockquote>
<p><strong>注意</strong>，中间件使用的配置项有两种添加方法，一种是添加到 <code>AddMiddleware(Action&lt;xxxOptions&gt; option)</code> 另外一种是 <code>UseMiddleware&lt;&gt;(Action&lt;xxxOptions&gt; option)</code>，那么这两种有什么区别呢？<br>那么，前者Add中的配置项一般情况下是中间执行之前就需要的一些信息，也就是说中间件的启动就依赖于这些配置项，他放置于容器配置（Add DI Service）的时候添加进去更加方便或者合适的时候使用它，另外一种（后者）是容器已经构建完毕，不需要依赖于容器提供的配置项可以使用此种方式。</p></blockquote>
<p>同样的道理，当你自己为你的用户编写一个中间件的时候，当你也需要用户可以自定义一些配置或者需要传入一些参数的时候，你也可以这么做。那到底怎么样做呢？ 我们一起来看看。
<p>首先，我们需要一个 <code>xxxOptions</code> 结尾的配置类，用来配置我们中间件需要的一些配置项。我们还是以上面的压缩中间件举例。<pre><code>public class GzipCompressionProviderOptions : IOptions&lt;GzipCompressionProviderOptions&gt;
{
  public CompressionLevel Level { get; set; } = CompressionLevel.Fastest;
  
   GzipCompressionProviderOptions IOptions&lt;GzipCompressionProviderOptions&gt;.Value =&gt; this;
}
</code></pre>
<p>它其中配置了一个压缩的等级 <code>CompressionLevel</code> ，这是一个枚举字段。 然后我们可以看到，这个类它继承了 <code>IOptions&lt;out T&gt;</code> 接口，这是一个知识点，什么意思呢？ <code>IOptions&lt;out TOptions&gt;</code> 是 ASP.NET Core 新的一个配置体系里面的一个接口，当你实现这个接口之后，ASP.NET Core DI 容器提供了了一个 <code>services.Configure&lt;xxxOptions&gt;</code> 这样的方法来让你把配置项注入到容器中，当然你也可以将配置项和 appsetting.json 中的配置关联起来，以便于配置一些在运行期可能需要变动信息。更多关于 <code>IOptions&lt;T&gt;</code> 的信息可以看 <a href="http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_7-configuration.html#使用选项和配置对象">这里的翻译</a>。
<p>这个 <code>xxxOptions</code> 类通常情况下会提供一些默认值，也就是说当用户不提供这些参数的时候，你需要有一个合理的机制或者默认值来正常运行你的中间件。
<p>假如你的配置项有很多，也就是说还有进一步比较细化的配置，那么你可以做一个封装，就像MVC的Options类一样，这样能够给你的中间件提供更加合理的维护和扩展。
<h6>Setup 3 核心中间件</h6>
<p>接下来，就是我们的核心代码类了，通常情况下会有一个 <code>xxxMiddleware</code> 结尾的类用来处理 HTTP 管道请求中的一些业务，这个类的构造函数中已经可以使用在Setup1或者Setup2中向DI容器中注册的服务了。
<p>按照约定，Middleware 类中需要有一个 Invoke 方法，用来处理中间件的核心业务，它的签名如下：<pre><code>
public Task Invoke(HttpContext httpContext);
</code></pre>
<p>注意，这是一个约定方法，并没有接口来约束它。在 <code>Invoke</code> 方法中，是中间件实现的核心代码。 示例如下：<pre><code>public class xxxMiddleware
{
    private readonly RequestDelegate _next;
    
    public xxxMiddleware(RequestDelegate next)
    {
        if (next == null)
        {
            throw new ArgumentNullException(nameof(next));
        } 
        _next = next;
    }
    
    public async Task Invoke(HttpContext context)
    {
       // ......
       await _next(context);
       return;
    }
}
</code></pre>
<p>在 <code>xxxMiddleware</code> 这个里面有一个构造函数参数 <code>RequestDelegate</code>，它是一个委托，代表的需要执行的下一个中间件，通常情况下我们会把它放到我们业务代码的末尾。
<h6>Setup 4 中间件扩展注册</h6>
<blockquote>
<p>中间件有三种注册方法（Run，Map，Use），我们暂不考虑Run和Map，因为他们只适用于很小和少的一些情况</p></blockquote>
<p>完成了以上工作后，接下来，我们需要把中间件注册到我们的 ASP.NET Core 的执行，这个时候我们需要一个 <code>xxxBuilderExtensions</code> 类，它也是一个静态类，注意它的命名空间通常为<br><strong><code>Microsoft.AspNetCore.Builder</code></strong>，因为这个用户在使用我们的中间件的时候就不必再添加额外的命令空间，依靠 Visual Studio 的智能提示就可以很快速的搜索到。我们来看一下示例：<pre><code>
using System;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;

namespace Microsoft.AspNetCore.Builder
{
    public static class xxxBuilderExtensions
    {
        public static IApplicationBuilder UseResponseCompression(this IApplicationBuilder builder)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }

            return builder.UseMiddleware&lt;xxxMiddleware&gt;();
        }
    }
}
</code></pre>
<h5>Yeoman 一秒钟</h5>
<p>有同学可能会说了，这些套路既然是这样的，那么有没有什么代码生成工具来帮我做这些事情呢？答案是肯定的。
<p>博主已经帮你们把工具做好了，它使用的是当今最流行的脚手架工具 npm 中的 Yeoman 。使用它可以帮助你迅速的搭建一个中间件解决方案代码模板，让你专注于业务开发。
<p>我已经把这个模板上传于 Yeoman 的仓库中，你只需要按照如下命令就可以帮你自动生成一套 ASP.NET Core 中间件解决方案代码模板了，当然单元测试也包含其中。
<p>npm 工具的安装相信你自己可以的。下面是安装 Yeoman 工具和博主的模板工具。<pre><code>// 安装 Yeoman 脚手架工具  -g 命令为全局安装
npm install -g yo

// 安装博主的 Yeoman(ASP.NET Core Middleware)模板
npm install -g generator-aspnetcore-middleware</code></pre>
<p>然后选择你需要生成解决方案的文件夹，使用如下命令生成。<pre><code>
yo aspnetcore-middleware</code></pre>
<p>注意：生成的过程中需要输入你中间件的名称。按要求输入即可。
<p><img src="http://images2015.cnblogs.com/blog/250417/201702/250417-20170221160526820-573144934.png">
<p><img src="http://images2015.cnblogs.com/blog/250417/201702/250417-20170221160917335-163568868.png">
<h5>总结</h5>
<p>本篇文章主要讲述了从头创建一个 ASP.NET Core 的流程，这适用于大多数场合，但是并不代表所有的场合，在实际开发的过程中还需要具体的考虑一下。接着博主提供了一个yo自动化脚手架模板用来快速创建一个中间件解决方案。
<p>如果你觉得这篇文章对你有帮助的话，谢谢你的【推荐】。
<p>如果你对 .NET Core 感兴趣可以关注我，我会定期在博客分享关于 .NET Core 的学习心得。
<hr>

<blockquote>
<p>本文地址：<a href="http://www.cnblogs.com/savorboard/p/generator-aspnetcore-middleware.html">http://www.cnblogs.com/savorboard/p/generator-aspnetcore-middleware.html</a><br>作者博客：<a href="http://www.cnblogs.com/savorboard">Savorboard</a><br>欢迎转载，请在明显位置给出出处及链接</p></blockquote><img src ="http://www.cppblog.com/FongLuo/aggbug/214702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-27 08:43 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/27/214702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>轻量却超强&amp;mdash;&amp;mdash;推荐几款好用的截图工具</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/27/214701.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 27 Feb 2017 00:41:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/27/214701.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214701.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/27/214701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214701.html</trackback:ping><description><![CDATA[<h3><a href="http://www.cnblogs.com/leftshine/p/screenshot.html">轻量却超强——推荐几款好用的截图工具</a></h3> <blockquote> <p><a name="catalog"></a>阅读导览(点击快速跳转）： <p>1.<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#FScapture">FScapture</a> <p>2.<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#Snipaste">Snipaste</a> <p>3.<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#Picpick">Picpick</a> <p><a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#flie-and-url">相关文件下载及链接</a></p></blockquote> <h4><a name="FScapture"></a>1.FScapture（<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#catalog">返回目录</a>）</h4> <p>FScapture全名为 FastStone Capture，它还有一款兄弟软件叫做 <a href="http://www.cnblogs.com/leftshine/p/FastStoneImageViewer.html">FastStoneImageViewer</a> 是一个图片浏览器，有兴趣的可以下载体验。 <p>博主自用，文章里面的图就是用它截的，其自带的图像查看/编辑器，功能强大，可以满足截图后，对图像的各种标注、裁切调节等需求，其功能不亚于 Windows 的画图板，做教程很是方便！ <p>强大：是一款不可多得的多功能小工具，兼有各种模式的截图、屏幕录像、屏幕取色、屏幕标尺以及对图片的编辑功能！ <p>小巧：解压下来所有文件只有2.66MB，是不是很小呢？ <p>快捷：还可以配合自带“PrtScreen”快捷键使用 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220223730366-807097851.png"> <p>滚动截图快捷键 <h5>主要功能介绍</h5> <p><strong>截屏</strong><br>包括了全屏截取，当前活动窗口截取，截取选定区域，多边形截取和截取滚动页面等，基本上常用的都有了。<strong>特别是滚动截取</strong>，许多朋友为了这个功能，不惜安装各种重量级的截屏软件，甚至四处下载各种软件的破解补丁。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220223847585-1850524366.png" width="609" height="308"> <p>主界面 <p><strong>图像浏览 / 编辑</strong><br>FS Capture还包括快速（浏览/编辑图像）的功能，可以点击主窗口的“打开”图标快速打开一幅图片，进行简单的缩放、裁切、旋转、加文字等轻量级的操作。把网页中图片拖到 FS Capture 的窗口上，会快速打开图像浏览窗口。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220223956616-86033003.png" width="595" height="325"> <p>编辑界面 <p><strong><a name="FScapture-ScreenRcord"></a>视频录制</strong><br>7.0 版本开始具备的功能，只需点击“视频录制”按钮，即可选择一个录制范围，可以选择“Window/Object”（窗口或对象）、“Rectangular Area”(矩形区域)、“Full Screen Without Taskbar”(无任务栏全屏)、“Full Screen”(全屏)等范围。选择范围后，即可点击 Record 按钮，非全屏范围，还需要选择好一个区域，然后在弹出的窗口点，击“Start”按钮，即可开始录制了，最后可以按F11键停止。<br>录制的过程如“视频录制”视频所示。录制的视频格式是 Wmv，录制完成后，会打开媒体播放器，进行播放。7.3 版本开始，支持同时录制麦克风和扬声器的音频。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220224218445-2017717268.png"> <p>屏幕录像 <h5><strong>小功能介绍</strong></h5> <p>附带的其他两个小功能：取色器和屏幕放大镜。对抓取的图像，提供缩放、旋转、剪切、颜色调整等功能。只要点点鼠标，就能随心抓取屏幕上的任何东西，拖放支持可以直接从系统、浏览器或其他程序中导入图片。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220224258304-2146205876.png"> <p>小功能 <p><strong>屏幕取色器</strong><br>现在网上各式各样的取色器应该不少了，包括之前一直用的蓝色经典推荐的 ColorSPY， Firefox 下还有一个，专门的取色器扩展 ColorZilla，这些都是很好的软件。但自从使用了 FS Capture 之后，这些我都很少用到了。原因很简单，各种取色软件的功能，都大同小异，FS Capture 非常小巧，既然有这样一个小软件，能够包含取色器、屏幕放大镜和截屏的功能，为什么还要为这些功能，而分开多个软件呢？FastStone Capture 的取色支持 RGB、Dec 和 Hex 三种格式的色值，而且还有一个混色器，取到颜色之后，可以再编辑。 <p><strong>屏幕放大镜</strong><br>这确实是一个不错的功能，特别是现在，我们已经习惯用 DIV 来对页面定位，DIV之间的对齐不像表格那样容易控制，有时为了调整几个像素的偏差，不得不对着屏幕盯很久。有这样一个放大镜，就方便多了。使用时，只需点击一下，FS Capture 窗口上的放大镜图标，鼠标变成一个放大镜的样子，然后在需要放大的地方，按下右键就可以了，就像手里真的拿着一个放大镜一样。可以设置放大倍率，放大镜的尺寸，外观（圆形，矩形以及圆角矩形）以及是否平滑显示，按 ESC 键或单击右键可退出放大镜。 <p><strong>屏幕标尺</strong><br>FastStone Capture 还有屏幕标尺功能， 点击后会屏幕上会出现一个尺子，方便测试屏幕某区域的像素大小。 <p><strong>将图像转换为 PDF 文件</strong> <p>图片可以直接转为PDF <p><strong>发送到 PowerPoint，Word，FTP</strong> <p>截图后可一键发送到文档中正在编辑的位置，非常方便 <blockquote> <p>最后送一枚可能会用到的注册码： <p>用户名：1028<br>注册码：AXJQI-RWMDW-YBXZC-LOPHI <p>喜欢的话请支持正版。</p></blockquote> <p><strong>相关文件下载及链接在文末提供</strong> <hr>  <h4>2.<a name="Snipaste"></a>Snipaste（<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#catalog">返回目录</a>）</h4> <p>Snipaste=Snip + Paste =截图 + 贴图。 <h3>开发了三年的截图工具，但不只是截图</h3> <p>它将 <strong>截图</strong> 与 <strong>贴图 </strong>整合在了一起，你可以将刚刚的截图随意放置在桌面上而不需要打开图片浏览器 <p><strong>Snipaste</strong> 的功能有点多，首先这是一款截图工具，能够进行各种简单、高级的截图，并可以编辑截图。其次可以将截图、文字、图片、网页、代码等剪贴板内的东西以图片的形式贴在屏幕上。 <p>我们还是从作者眼花缭乱的演示动画中来看看具体怎么玩吧： <blockquote> <p>有人问博主这些酷炫gif怎么录制的，这里有工具推荐：<a href="http://www.cnblogs.com/leftshine/p/ScreenRecord.html">【录教程必备】推荐几款屏幕录制工具（可录制GIF）</a></p></blockquote> <h5>截图</h5> <p>贴图，即是使图片成为一个窗口并置顶显示： <p>贴图窗口可以旋转、缩放、<strong>半透明</strong>、鼠标穿透： <p>以上功能也许并不新奇，但<a href="http://www.shaoit.com/snipaste.html">Snipaste</a>还有很多特别的地方。 <p>精确控制截图范围： <p>截图记录回放： <p>是的，不只是回放全屏的截图，之前截图中的<strong>画图过程</strong>也能重现。 <p>取色（不只是显示取色框，能复制当前像素点的 RGB 值）： <p>取色之后，还能把颜色贴出来（同时可得到各种颜色格式的转换）： <p>普通的纯文本，可以转换成图片： <p>HTML 格式的文本，也可以： <p>配合支持 HTML 格式复制的代码编辑器食用更佳： <p>图片编辑功能不止在截图时可用，贴图窗口亦可： <p>有马克笔、马赛克、高斯模糊、橡皮擦功能： <p>文字可旋转： <p>当然，截图和贴图还可以结合得更紧密。 <p>截图后复制到剪贴板里的图片，贴出来可以就在原来截图的位置： <p>也可以一步到位： <p>还有炫酷一点的，在贴图窗口播放 GIF ： <p>不喜欢默认的蓝色界面也没关系，主题色任你选，通知栏图标也随你定制： <p>换个截图遮罩的颜色： <p><strong>相关文件下载及链接在文末提供</strong> <hr>  <h4><a name="Picpick"></a>3.Picpick（<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#catalog">返回目录</a>）</h4> <p>PicPick具备了截取全屏、活动窗口、指定区域、固定区域、手绘区域功能，支持滚动截屏，屏幕取色，支持双显示器，具备白板、屏幕标尺、直角坐标或极坐标显示与测量，具备强大的图像编辑和标注功能。 <p>截图可以保存到剪贴板、自动或手动命名的文件（png/gif/jpg/bmp）。 <p><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220235529257-1743525456.png"> <h5><strong>软件特色</strong></h5> <p><strong><img alt="" src="http://images2015.cnblogs.com/blog/738404/201702/738404-20170220235446866-977223542.png" width="600"></strong> <p>1、<strong>屏幕截图</strong>：支持全屏、活动窗口、滚动窗口 、窗口控制、区域、 固定区域、手绘 、重复捕捉； <p>2、<strong>Ribbon界面图像编辑器</strong>： 箭头、 线条等绘图工具。模糊、 锐化、、 像素化、 旋转、 翻转，框架等特效。 <p>3、<strong>拾色器和调色板</strong>：支持RGB、HTML、 c + + 、Delphi等代码类型，Photoshop风格转换，保存颜色； <p>4、<strong>屏幕放大镜、量角器、屏幕坐标计算</strong>功能；为你的演示文稿把屏幕当作白板自由绘画! <p>5、界面友好，直观、易用、 快速便捷，支持所有 Windows 系统 （完美兼容 Windows7 和 Windows 8 ），而且所有的功能都完全支持双屏幕环境。  <p>6、多语言支持（30种语言），此处提供的文件精简了语言，只保留中文和英文语言。 <p>7、软件不更改任何注册表内容 ，不访问到系统文件夹（你可以将软件复制到便携式USB）。 <p>8、软件已经集成注册信息，喜欢请支持正版 <p><strong>相关文件下载及链接在文末提供</strong> <hr>  <h4><a name="flie-and-url"></a>相关文件下载及链接（<a href="http://www.cnblogs.com/leftshine/archive/2017/02/21/screenshot.html#catalog">返回目录</a>）</h4> <blockquote> <h5>FScapture</h5> <p>官方主页：<a href="http://www.faststone.org/">http://www.faststone.org/</a> <p>链接：https://eyun.baidu.com/s/3hsBQhla 密码：leftshine <h5>Snipaste</h5> <p>官方主页：<a href="https://www.snipaste.com/">https://www.snipaste.com/</a> <p>下载地址: <a href="https://dl.snipaste.com/win-xp-cn">XP</a> / <a href="https://dl.snipaste.com/win-x86-cn">X86</a> / <a href="https://dl.snipaste.com/win-x64-cn">X64</a> <h5>Picpick</h5> <p>官方主页：<a href="https://www.baidu.com/link?url=u7B3uogEwq0mtggzLeUri8G1kOlCoeJtkhx7a4imHJCrxN6FRSpATWPWzk_HwPyV&amp;ck=3978.8.0.0.0.391.239.0&amp;shh=www.baidu.com&amp;wd=&amp;eqid=e216684f00000be70000000658ab0e57">www.<strong>picpick</strong>.org/</a> <p>官方下载：http://ngwin.com/picpick/download <p>以上文件在百度云都有备份： <p>链接：https://eyun.baidu.com/s/3hsBQhla 密码：leftshine</p></blockquote> <p>参考文章： <p>http://bbs.chongbuluo.com/thread-29-1-1.html<br>http://www.shaoit.com/snipaste.html</p><img src ="http://www.cppblog.com/FongLuo/aggbug/214701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-27 08:41 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/27/214701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AtomineerUtils爆破过程记录</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/22/214692.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Wed, 22 Feb 2017 04:39:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/22/214692.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214692.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/22/214692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214692.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214692.html</trackback:ping><description><![CDATA[<h3><a href="http://www.cnblogs.com/hbccdf/p/atomineerutilscrack.html">AtomineerUtils爆破过程记录</a></h3> <p>AtomineerUtils是国外的一款用于生成源代码注释的一款VS插件，官方网站：<a href="http://www.atomineerutils.com/products.php">http://www.atomineerutils.com/products.php</a> <p>通过链接，可以看出这款插件的功能十分强大，不像GhostDoc那样，只支持C#，这款插件，支持C、C++、C++/CLI、C#、Java语言等，由此可以看出其强大，注释的风格可以灵活配置。 <p>虽然他功能十分强大，但是由于是收费的软件，所以当使用超过30天后，就无法再继续适用了。虽然价格不贵，只有40美刀，但是由于时间紧急，必须立刻使用他的功能，所以没有时间去购买license。 <p>那么能不能试着破解他呢，或者继续使用。说到破解，我的水平也就只能研究一下未混淆的.Net程序，如果这个插件是用C++写的话，那么不好意思，破不了。 <p>用Reflector试着打开，发现能识别，如下： <p><a href="http://images.cnitblog.com/blog/367940/201407/101801592076486.png"><img title="Atomineer版本" border="0" alt="Atomineer版本" src="http://images.cnitblog.com/blog/367940/201407/101801595825672.png" width="461" height="194"></a> <p>同时也可以看到这个版本号是：8.16.5174.40541。这是最新版本了。 <p>既然是.Net的DLL，那么相对来说就好说了，至少和C++相比来说，有希望了。 <p>既然是VS的插件，那么肯定要遵守VS的插件接口规范。（VS的插件接口不在本篇中介绍） <p>首先找到它的OnConnect方法: <p><a href="http://images.cnitblog.com/blog/367940/201407/101802000049843.png"><img title="OnConnect方法" border="0" alt="OnConnect方法" src="http://images.cnitblog.com/blog/367940/201407/101802004894230.png" width="903" height="99"></a> <p>然后从OnConnect方法入手进行研究，最终定位到这里： <p><a href="http://www.cnblogs.com/hbccdf/p/"><img src="http://images.cnblogs.com/cnblogs_com/hbccdf/545117/o_minus.gif" width="9" height="9"> Collapse</a> <p><a href="http://www.cnblogs.com/hbccdf/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a><pre>internal static bool b(bool A_0, bool A_1 = false)
{
    bool flag = true;
    int num = (((DateTime.Today.Year - 2010) * 365) + DateTime.Today.DayOfYear) &lt;&lt; 8;
    int num2 = 0;
    try
    {
        num2 = Convert.ToInt32(c(f, "0", string.Empty));
    }
    catch
    {
    }
    int num3 = (num - num2) &gt;&gt; 8;
    if (num3 &gt; 19)
    {
        if (e[0][0] == 'I')
        {
            for (int i = 0; i &lt; e.Length; i++)
            {
                StringBuilder builder = new StringBuilder();
                for (int j = 0; j &lt; e[i].Length; j++)
                {
                    builder.Append((char) (e[i][j] ^ (16 | (j % 16))));
                }
                e[i] = builder.ToString();
            }
        }
        if (num3 &gt; 29)
        {
            flag = false;
            Commands.f();
            if ((num3 == g) || A_1)
            {
                return false;
            }
            MessageBox.Show(e[0] + Environment.NewLine + Environment.NewLine + e[1] + Environment.NewLine + Environment.NewLine + e[2], "Atomineer Pro Documentation", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
        }
        else
        {
            if ((num3 == g) || !A_0)
            {
                return true;
            }
            string[] strArray2 = new string[] { e[3], (30 - num3).ToString(), e[4], Environment.NewLine, Environment.NewLine, e[5] };
            if (MessageBox.Show(string.Concat(strArray2), "Atomineer Pro Documentation", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) != DialogResult.Yes)
            {
                return true;
            }
        }
        k.h("t~e}xzws");
        g = num3;
    }
    return flag;
}</pre>
<p><a href="http://www.cnblogs.com/hbccdf/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a>
<p>根据上面的逻辑，只要不执行 num3 &gt; 29的逻辑，并且返回值为true即可，可以做如下修改：
<p><a href="http://www.cnblogs.com/hbccdf/p/"><img src="http://images.cnblogs.com/cnblogs_com/hbccdf/545117/o_minus.gif" width="9" height="9"> Collapse</a><pre>bool flag = true;
...
int num3 = (num2 - num2) &gt;&gt; 8;</pre>
<p>这样，num3等于0，而且返回值为true。
<p>那么如何修改这些代码呢，基于Reflector的Reflexil插件，来修改IL代码，然后另存为dll文件即可。
<p>如下，是修改后的截图：
<p><a href="http://images.cnitblog.com/blog/367940/201407/101802009578685.png"><img title="Atomineer破解后" border="0" alt="Atomineer破解后" src="http://images.cnitblog.com/blog/367940/201407/101802015046585.png" width="424" height="289"></a>
<p>这样，整个插件就算是被破解了，可以无限期使用了。
<img src ="http://www.cppblog.com/FongLuo/aggbug/214692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-22 12:39 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/22/214692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MFC多文档MDI_&amp;quot;打开文件&amp;quot;默认后缀名修改,根据需要添加</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/13/214678.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 13 Feb 2017 05:03:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/13/214678.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214678.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/13/214678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214678.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214678.html</trackback:ping><description><![CDATA[<p>参考：<a href="http://blog.csdn.net/segen_jaa/article/details/8489917">http://blog.csdn.net/segen_jaa/article/details/8489917</a> <p>应用背景： <p>我用的是MDI框架，需要调用同事给的dll，才能确定本程序解析何种格式的文件。如他给了dll1，dll2，dll3，dll4，后缀分别是.format1，.format2，.format3，.format4。以后还可能会有（dll5,format5），（dll6,format6） <p>因此在MDI加载文档模板之前就要获得全部后缀名，然后动态的传给MDI。 <p>首先，需要修改打开文件的后缀名。需要重载CMultiDocTemplate，参考文章的后缀也是在主程序中写好的，不是我想要的， <p>很简单，在继承类中多加一个参数 char *suffix， <p>具体实现如下： <p><b>[cpp]</b> <a href="http://blog.csdn.net/memeai/article/details/10524515#">view plain</a> <a href="http://blog.csdn.net/memeai/article/details/10524515#">copy</a> <ol> <li>#pragma once <li>#include "afxwin.h" <li> <li>class CMultiDocTemplateSuffixEx :&nbsp;&nbsp; public CMultiDocTemplate&nbsp;&nbsp; <li>{&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; CString m_strSuffix;&nbsp;&nbsp; <li>public:&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; CMultiDocTemplateSuffixEx(char *suffix,UINT nIDResource, CRuntimeClass* pDocClass,&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CRuntimeClass* pFrameClass, CRuntimeClass* pViewClass):\&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CMultiDocTemplate( nIDResource, pDocClass, pFrameClass, pViewClass )&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_strSuffix.Format("%s",suffix);&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <li> <li>virtual BOOL GetDocString(CString&amp; rString, enum DocStringIndex index) const <li>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>if(index == CDocTemplate::filterExt)&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rString = "."+m_strSuffix;&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <li>else if( index == CDocTemplate::fileNewName || index == CDocTemplate::filterName )&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rString = m_strSuffix+"(*."+m_strSuffix+")";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <li>else <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; __super::GetDocString(rString,index);&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <li>return TRUE;&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; };&nbsp;&nbsp; <li>};&nbsp; </li></ol> <p>使用： <p><b>[cpp]</b> <a href="http://blog.csdn.net/memeai/article/details/10524515#">view plain</a> <a href="http://blog.csdn.net/memeai/article/details/10524515#">copy</a> <ol> <li>CMultiDocTemplate *pDocTemplate0;&nbsp;&nbsp; <li>char *curSuffix[]={"format1","format2","format3"};&nbsp;&nbsp; <li>for(int i=0; i&lt;3; i++)&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pDocTemplate0 = new CMultiDocTemplateSuffixEx&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (curSuffix[i],IDR_MAINFRAME,&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RUNTIME_CLASS(CTestDoc),&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RUNTIME_CLASS(CChildFrm),&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RUNTIME_CLASS(CTestView));&nbsp;&nbsp; <li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddDocTemplate(pDocTemplate0);&nbsp;&nbsp; <li> <li>&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp; <li>}&nbsp; </li></ol> <p><img alt="" src="http://img.blog.csdn.net/20130829160051781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWVtZWFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center"><img src ="http://www.cppblog.com/FongLuo/aggbug/214678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-13 13:03 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/13/214678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PageHeap，调试Heap问题的工具</title><link>http://www.cppblog.com/FongLuo/archive/2017/02/03/214645.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Fri, 03 Feb 2017 08:35:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/02/03/214645.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214645.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/02/03/214645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214645.html</trackback:ping><description><![CDATA[<p>《Windows用户态程序高效排错》第二章主要介绍用户态调试相关的知识和工具。本文主要讲了PageHeap，调试Heap问题的工具. <p>AD：<a href="http://www.cnblogs.com/lidabo/category/542683.html">http://www.cnblogs.com/lidabo/category/542683.html</a> <p>&nbsp; <p><strong>2.4.2&nbsp; PageHeap，调试Heap问题的工具</strong> <p>幸运的是，Heap Manager的确提供了主动检查错误的功能。只需要在注册表里面做对应的修改，操作系统就会根据设置来改变Heap Manager的行为。Pageheap是用来配置该注册表的工具。关于heap的详细信息和原理请参考：<pre>How to use Pageheap.exe in Windows XP and Windows 2000<br><a href="http://support.microsoft.com/kb/286470/en-us">http://support.microsoft.com/kb/286470/en-us</a>   </pre>
<p>Pageheap，Gflag和后面介绍的Application Verifier工具一样，都是方便修改对应注册表的工具。如果不使用这两个工具，直接修改注册表也可以达到一样的效果。3个工具里面Application Verifier是目前的主流，Gflag是老牌。除了heap问题外，这两个工具还可以修改其他的调试选项，后面都有说明。Pageheap.exe工具主要针对heap问题，使用起来简单方便。目前gflag.exe包含在调试器的安装包中，Application Verifier可以单独下载安装。如果调试安装包中没有包含pageheap.exe，可以从这里下载： <pre><a href="http://www.heijoy.com/debugdoc/pageheap.zip">http://www.heijoy.com/debugdoc/pageheap.zip</a><br><a href="http://blogs.msdn.com/lixiong/attachment/2792912.ashx">http://blogs.msdn.com/lixiong/attachment/2792912.ashx</a>   </pre>
<p><strong>简单例子的多种情况</strong>
<p>看几个简单的但是却很有意义的例子：
<p>用release模式编译运行下面的代码：<pre> char *p=(char*)malloc(1024);<br>p[1024]=1;   </pre>
<p>这里往分配的空间多写一个字节。但是在release模式下运行，程序不会崩溃。
<p>假设上面的代码编译成mytest.exe，用下面的方法可以对mytest.exe激活pageheap：<pre>C:\Debuggers\pageheap&gt;pageheap /enable mytest.exe /full    </pre>
<p>直接运行pageheap可以查看当前pageheap的激活状态：<pre>C:\Debuggers\pageheap&gt;pageheap<br>mytest.exe: page heap enabled with flags (full traces )    </pre>
<p>当激活pageheap后，重新运行一次上面的代码，程序就崩溃了。 
<p>（直接双击运行程序和在Windbg中用调试模式运行程序，观察到的崩溃有差别。在Windbg中运行，pageheap会首先触发break point异常，同时pageheap还会在调试器中输出额外的调试信息方便调试。）
<p>上面的例子说明了pageheap能够让错误尽快暴露出来。接下来我们稍微修改一下代码：<pre> char *p=(char*)malloc(1023);<br>p[1023]=1;   </pre>
<p>试试看，修改后的代码还会导致程序崩溃吗？ 
<p>根据我的测试，分配1023字节的情况下，哪怕激活pageheap，也不会崩溃。你能说明原因吗？如果看不出来，可以检查一下每次malloc返回的地址的数值，注意对这个数值在二进制上敏感一点，然后结合Heap Manager和pageheap的原理思考一下，看看有没有发现。
<p>对于上面两种代码，如果用debug模式编译，激活pageheap，程序会崩溃吗？根据我的测试，无论是否激活pageheap，debug模式都不会崩溃的。你能想到原因吗？
<p>再来看下面一段代码：<pre> char *p=(char*)malloc(1023);<br>free(p);<br>free(p);  </pre>
<p>这里显然有double free的问题。 
<p>如果没有激活pageheap，分别在debug和release模式下运行，根据我的测试，debug模式下会崩溃，release模式下运行正常。
<p>如果激活pageheap，同样在debug/release模式下运行。根据我的测试，在两种模式下都会崩溃。如果细心观察，会发现两种模式下，崩溃后弹出的提示各自不同。你能想到原因吗？
<p>如果有兴趣，你还可以测试一下heap误用的其他几种情况，看看pageheap是不是都有帮助。
<p><strong>Heap上的内存泄漏和内存碎片</strong>
<p>从上面的例子，可以很清楚地看到pageheap对于检查这类问题的帮助。同时也可以看到，pageheap无法保证检查出所有潜在问题，比如分配1023个字节，但是写1024个字节这种情况。只有理解pageheap的工作原理，同时对问题作认真的思考和测试后，才会理解其中的差别。
<p>除了Heap使用不当导致崩溃外，还有一类问题是内存泄漏。内存泄漏是指随着程序的运行，内存消耗越来越多，最后发生内存不足，或者整体性能下降。从代码上看，这类问题是由于内存使用后没有及时释放导致的。这里的内存，可以是VirtualAlloc分配的，也有可能是HeapAllocate分配的。
<p>这里只讨论Heap相关的内存泄漏。检查内存泄漏是一个比较大的题目，第4章会作详细讨论。
<p>举个例子，客户开发一个cd刻录程序。每次把盘片中所有内容写入内存，然后开始刻录。如果每次刻录完成后都忘记去释放分配的空间，那么最多能够刻3张CD。因为3张CD，每一张600MB，加在一起就是1.8GB，濒临2GB的上限。
<p>另外还有一种跟内存泄漏相关的问题，是内存碎片（Fragmentation）。内存碎片是指内存被分割成很多的小块，以至于很难找到连续的内存来满足比较大的内存申请。导致内存碎片常见原因有两种，一种是加载了过多DLL，还有一种是小块Heap的频繁使用。
<p>DLL分割内存空间最常见的情况是ASP.NET中的batch compilation没有打开，导致每一个ASP.NET页面都会被编译成一个单独的DLL文件。运行一段时间后，就可以看到几千个DLL文件加载到进程中。一个极端的例子是5000个DLL把2GB内存平均分成5000份，导致每一份的大小在400KB左右（假设DLL本身只占用1个字节），于是无法申请大于400KB的内存，哪怕总的内存还是接近2GB。对于这种情况的检查很简单，列一下当前进程中所有加载起来的DLL就可以看出问题来。
<p>对于小块Heap的频繁使用导致的内存分片，可以参考下面的解释：<pre>Heap fragmentation is often caused by one of the following two reasons<br>1. Small heap memory blocks that are leaked (allocated but never freed) over time<br>2. Mixing long lived small allocations with short lived long allocations<br>Both of these reasons can prevent the NT heap manager from using free <br>memory efficiently since they are spread as small fragments that cannot <br>be used as a single large allocation   </pre>
<p>为了更好地理解上面的解释，考虑这样的情况。假设开发人员设计了一个数据结构来描述一首歌曲，数据结构分成两部分，第一部分是歌曲的名字、作者和其他相关的描述性信息，第二部分是歌曲的二进制内容。显然第一部分比第二部分小得多。假设第一部分长度1KB，第二部分399KB。每处理一首歌需要调用两次内存分配函数，分别分配数据结构第一部分和第二部分需要的空间。
<p>假设每次处理完成后，只释放了数据结构的第二部分，忘记释放第一部分，这样每处理一次，就会留下1个1KB的数据块没有释放。程序长时间运行后，留下的1KB数据块就会很多，虽然HeapManager的薄计信息中可能记录了有很多399KB的数据块可以分配，但是如果要申请500KB的内存，就会因为找不到连续的内存块而失败。对于内存碎片的调试，可以参考最后的案例讨论。在Windows 2000上，可以用下面的方法来缓解问题：<pre>The Windows XP Low Fragmentation Heap Algorithm <br>Feature Is Available for Windows 2000<br><a href="http://support.microsoft.com/?id=816542">http://support.microsoft.com/?id=816542</a>   </pre>
<p>关于 CLR上内存碎片的讨论和图文详解，请参考：<pre> .NET Memory usage - A restaurant analogy<br><a href="http://blogs.msdn.com/tess/archive/2006/09/06/742568.aspx">http://blogs.msdn.com/tess/archive/2006/09/06/742568.aspx</a>    
</pre><img src ="http://www.cppblog.com/FongLuo/aggbug/214645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-02-03 16:35 <a href="http://www.cppblog.com/FongLuo/archive/2017/02/03/214645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows 7 SP1 与 Windows Server 2008 R2 SP1 升级到RDP 8.0总结</title><link>http://www.cppblog.com/FongLuo/archive/2017/01/19/214609.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Thu, 19 Jan 2017 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2017/01/19/214609.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214609.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2017/01/19/214609.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214609.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214609.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/starshine/article/details/8130996">原文传送门</a> <p>&nbsp;&nbsp;&nbsp; 随着Windows 8 的发布，远程桌面连接协议（RDP）也已经升级为8.0，相对与RDP7.1（Windows 7 SP1、 <p>Windows Server 2008 R2 SP1支持），在增强用户体验方面进行了很大的改进，例如Adaptive Graphic、 <p>Intelligent Transport、Adaptive Network Auto Detect、DirectX 11 Support with vGPU等RemoteFX相关 <p>功能，在性能、易管理性等方面有很大提升。 <p>&nbsp;&nbsp;&nbsp; 为了使Windows 7 SP1和Windows Server 2008 R2 SP1用户能够利用RDP8.0对远程桌面连接的改善，微软 <p>提供了相应的升级包，为<a href="http://download.csdn.net/detail/starshine/4705069">KB2592687</a>，可以点击链接进行下载和安装，由于RDP8.0支持自动网络检测，在网络 <p>资源不佳的情况下（例如广域网），可以采用UDP协议进行远程桌面连接信息的传递，从而降低对网络资源的要求， <p>因此在将RDP7.1升级为RDP8.0之前，先基于<a href="http://download.csdn.net/detail/starshine/4705111">KB2574819</a>升级操作系统，使之支持DTLS（Datagram Transport&nbsp; <p>Layer Security），此升级包下载请点击链接。（注意：先安装<a href="http://download.csdn.net/detail/starshine/4705111">KB2574819</a>，再安装<a href="http://download.csdn.net/detail/starshine/4705069">KB2592687</a>）。 <p>&nbsp;&nbsp;&nbsp; 升级包括两个部分，即客户端和远程桌面端，客户端是指要连接到远程桌面的计算机，远程桌面端是指要被连接 <p>的计算机（物理机或虚拟机），当然客户端被其他计算机连接也就变成了远程桌面端了:)。客户端和远程桌面端升级 <p>过程相同，升级完成后，打开远程桌面连接客户端程序（mstsc.exe）,右键点击左上角图表，选择“关于”菜单项， <p>打开如下图对话框： <p><img alt="" src="http://img.my.csdn.net/uploads/201210/31/1351647927_2487.PNG"> <p>显示“支持远程桌面协议8.0",说明升级成功。同时，在远程连接客户端的”体验“标签下，”选择连接速度来优化性能“下拉 <p>列表中将出现”自动检测连接质量“选择项，说明启用了RemoteFX相关功能。在服务端启用RDP8.0中RemoteFX相关功能， <p>需要通过组策略相关机制，有些功能还需要Hyper-V支持（如vGPU）。打开组策略的方式是在命令行下执行”gpedit.msc“ <p>命令，显示本地组策略编辑器（如果在域管理模式下，需要编辑相应的域组策略）： <p><img alt="" src="http://img.my.csdn.net/uploads/201210/31/1351648739_8064.PNG" width="700" height="500"> <p>具体的位置在”计算机配置\管理模板\Windows 组件\远程桌面服务\远程桌面会话主机\远程会话环境“,上图标出的即是相关的配置 <p>项，首先要配置”启用远程桌面协议8.0“和”配置RemoteFX“，启用相关功能。 <p> 升级和配置完成后，即可用进行连接远程连接桌面，如何验证是否启用了RDP8.0呢，具体方法如下： <p>1、用RDP8.0客户端连接RDP8.0的远程桌面，远程连接栏上出现了连接质量图标（<img alt="" src="http://img.my.csdn.net/uploads/201210/31/1351654317_3204.jpg" width="20" height="30">）。 <p>2、用RDP8.0客户端连接RDP7.1的远程桌面，远程连接栏上不会出现连接质量图标。 <p>3、用RDP7.1客户端连接RDP7.1、RDP8.0的远程桌面，远程连接栏上均不会出现连接质量图标。 <p>注意： <p>如果用升级到RDP8.0的客户端去连接非RDP8.0的远程桌面，必须在远程桌面连接客户端程序（mstsc.exe）的体验标签下，选择 <p>”LAN（10Mbps或更高）“选项，如下图： <p><img alt="" src="http://img.my.csdn.net/uploads/201210/31/1351655036_9551.PNG"> <p>通过基本测试，RDP8.0在视频播放等方面效果还是不错的，希望MS再接再厉，争取RDP超过HDX协议！ <img src ="http://www.cppblog.com/FongLuo/aggbug/214609.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2017-01-19 10:49 <a href="http://www.cppblog.com/FongLuo/archive/2017/01/19/214609.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# C++ 语言互动资料</title><link>http://www.cppblog.com/FongLuo/archive/2016/12/24/214546.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Sat, 24 Dec 2016 06:07:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/12/24/214546.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214546.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/12/24/214546.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214546.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214546.html</trackback:ping><description><![CDATA[<p><a href="http://blog.csdn.net/donjuan/article/details/3865026">使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明</a></p> <h4><a href="http://blog.csdn.net/aoshilang2249">郎涯工作室</a>&nbsp; C#分支：<a title="http://blog.csdn.net/aoshilang2249/article/category/2444289" href="http://blog.csdn.net/aoshilang2249/article/category/2444289">http://blog.csdn.net/aoshilang2249/article/category/2444289</a></h4> <h3><a href="http://blog.csdn.net/aoshilang2249/article/details/39377643">C#调用C++ 平台调用P/Invoke 调用约定【一】</a></h3><img src ="http://www.cppblog.com/FongLuo/aggbug/214546.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-12-24 14:07 <a href="http://www.cppblog.com/FongLuo/archive/2016/12/24/214546.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C# 访问USB(HID)设备</title><link>http://www.cppblog.com/FongLuo/archive/2016/12/21/214528.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Wed, 21 Dec 2016 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/12/21/214528.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214528.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/12/21/214528.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214528.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214528.html</trackback:ping><description><![CDATA[<p><a title="http://www.cnblogs.com/viki117/archive/2009/09/08/1562311.html" href="http://www.cnblogs.com/viki117/archive/2009/09/08/1562311.html">http://www.cnblogs.com/viki117/archive/2009/09/08/1562311.html</a></p><img src ="http://www.cppblog.com/FongLuo/aggbug/214528.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-12-21 13:36 <a href="http://www.cppblog.com/FongLuo/archive/2016/12/21/214528.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源的WeiFenLuo.winFormsUI.Docking布局控件</title><link>http://www.cppblog.com/FongLuo/archive/2016/12/08/214469.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Thu, 08 Dec 2016 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/12/08/214469.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214469.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/12/08/214469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214469.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214469.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp; 布局控件"WeifenLuo.WinFormsUI.Docking"是一个非常棒的开源控件， 可以保存自定义的布局为XML文件,可以加载XML配置文件! <p>先Mark下，等以后用上再深入！ <p>（1）：WeifenLuo.WinFormsUI.Docking学习 。<a href="http://blog.csdn.net/gaoyunpeng/article/details/3873217">http://blog.csdn.net/gaoyunpeng/article/details/3873217</a> <p>（2）：WeifenLuo.WinFormsUI.Docking 自动保存界面布局！ <a href="http://www.cnblogs.com/zcshan/archive/2010/09/29/WeifenLuo.html">http://www.cnblogs.com/zcshan/archive/2010/09/29/WeifenLuo.html</a> <p>（3）：开源组件DockPanel Suite使用 ：<a href="http://kb.cnblogs.com/a/2350244/">http://kb.cnblogs.com/a/2350244/</a> <p><a href="http://www.cnblogs.com/Microred/archive/2012/02/14/2350244.html#2348530">http://www.cnblogs.com/Microred/archive/2012/02/14/2350244.html#2348530</a> <p>（4）：DockPanel Suite 判断窗口已打开：<a href="http://www.cnblogs.com/stalwart/archive/2011/03/02/1968842.html">http://www.cnblogs.com/stalwart/archive/2011/03/02/1968842.html</a> <p>（5）:C# WinForm 技巧八：界面开发之“WeifenLuo.WinFormsUI.Docking+OutLookBar” 使用 <p><a href="http://www.cnblogs.com/luomingui/archive/2013/09/19/3329763.html">http://www.cnblogs.com/luomingui/archive/2013/09/19/3329763.html</a> <p><a href="http://www.cnblogs.com/ice-river/p/3520986.html">http://www.cnblogs.com/ice-river/p/3520986.html</a> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载地址：<a href="http://download.csdn.net/download/luomingui/6291675">http://download.csdn.net/download/luomingui/6291675</a> <p><a href="http://files.cnblogs.com/zfanlong1314/WeifenLuo.WinFormsUI.Docking.rar">WeifenLuo.WinFormsUI.Docking.rar控件下载</a> <p> 《<a href="http://www.51aspx.com/Code/OutlookBarControl">OutlookBar控件源码</a>》 <p><a href="http://www.51aspx.com/downloadauth/outlookbarcontrol">http://www.51aspx.com/downloadauth/outlookbarcontrol</a> <p>(6)： WeiFenLuo.winFormsUI.Docking其实是 开源组件<font color="#0000ff">DockPanel Suite</font>，<a href="https://sourceforge.net/projects/dockpanelsuite/">下载地址</a> <p>（7）：<a href="http://ultrardc.codeplex.com/">UltraRDC</a>&nbsp;&nbsp;&nbsp; 远程桌面应用，使用DockPanel做布局管理。</p><img src ="http://www.cppblog.com/FongLuo/aggbug/214469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-12-08 14:30 <a href="http://www.cppblog.com/FongLuo/archive/2016/12/08/214469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>非托管C++代码调用C#编写的dll方法</title><link>http://www.cppblog.com/FongLuo/archive/2016/12/08/214468.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Thu, 08 Dec 2016 05:36:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/12/08/214468.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214468.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/12/08/214468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214468.html</trackback:ping><description><![CDATA[<p>&nbsp; <p>CLR VIA C#这本书里面的内容，在网上好像很少关于这方面的内容，贴出来以后留着看。 <p>C#调用C++编写的dll，一般都是直接用dllimport，这个资料很多。C++调用C#编写的dll，一般方法都是先用托管C++将C#的dll进行一次封装，然后由非托管C++调用封装好的dll。 <p>CLR VIA C#在讲寄宿和应用程序域的内容时，提供了一个非托管C++直接调用的方法。原理就是，在非托管代码中手动启动CLR加载应用程序域来运行托管的dll，从而调用其中的方法。 <p>代码如下： <p>#include &lt;Windows.h&gt;<br>#include &lt;MSCorEE.h&gt;<br>#include &lt;stdio.h&gt;<br>#pragma comment(lib,"mscoree.lib")<br>int _tmain(int argc, _TCHAR* argv[])<br>{<br>ICLRRuntimeHost *pClrHost;<br>&nbsp;&nbsp;&nbsp; HRESULT hr = CorBindToRuntimeEx(NULL, <p>&nbsp;&nbsp;&nbsp; NULL,0, <p>&nbsp;&nbsp;&nbsp; CLSID_CLRRuntimeHost, <p>&nbsp;&nbsp;&nbsp; IID_ICLRRuntimeHost, <p>&nbsp;&nbsp;&nbsp; (PVOID*)&amp;pClrHost); <p>//启动CLR<br>&nbsp;&nbsp;&nbsp; pClrHost-&gt;Start();<br>&nbsp;&nbsp;&nbsp; DWORD retVal=0; <p>//将dll加载到默认应用程序域中，并调用其中的方法<br>&nbsp;&nbsp;&nbsp; hr = pClrHost-&gt;ExecuteInDefaultAppDomain(L"test.dll",L"test.MyType",L"TestMethod",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; L"TestStringParam",&amp;retVal);<br>&nbsp;&nbsp;&nbsp; if(S_OK==hr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wprintf(L"Managed code returned %d\n",retVal);<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wprintf(L"failed to call csharp dll.\n");<br>&nbsp;&nbsp;&nbsp; getchar();<br>&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>} <p>C#编写的test.dll如下： <p>namespace test<br>{<br>&nbsp;&nbsp;&nbsp; class MyType<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static Int32 TestMethod(String s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine("Managed assembly: {0}",s);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return s.Length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; } <p>} <p>代码输出： <p>Managed assembly: TestStringParam<br>Managed code returned 15 <p>可以看到c++成功调用了test.DLL中的方法，并且可以传入参数和接收返回值。 <p>想深入的了解，可以看下面的内容： <p><a href="http://msdn.microsoft.com/zh-cn/vstudio/9x0wh2z3.aspx">http://msdn.microsoft.com/zh-cn/vstudio/9x0wh2z3.aspx</a></p><img src ="http://www.cppblog.com/FongLuo/aggbug/214468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-12-08 13:36 <a href="http://www.cppblog.com/FongLuo/archive/2016/12/08/214468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己制作winhex的模板</title><link>http://www.cppblog.com/FongLuo/archive/2016/11/30/214455.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Wed, 30 Nov 2016 08:09:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/11/30/214455.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214455.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/11/30/214455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214455.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214455.html</trackback:ping><description><![CDATA[<p><a href="http://www.cnblogs.com/jiu0821/p/4461882.html">传送门</a> <p>　　winhex有很多的官方模板，可以在网上下载（后缀tpl）并放至它的安装目录，即可使用。不过要是自己能自己制作，这才好玩，不是么？！ <p>　　打开模板管理器，可以选中其中一个模板，下面有应用，有编辑，你点开编辑按钮，就可以看到对应的模板源码。而你点开那个新建按钮，就可以自己写模板了，最后保存到安装目录即可。提醒一点，我是在记事本下写好粘贴到新建后那个面板上的，因为我发现有好些符号它不支持，比如下划线、引号等，maybe是我自己没设置的原因，不过，这不是重点，略过。写好后，那个面板下有检查语法的按钮，通过它可判断你的代码是否语法正确。 <p>　　闲话不多说，下面，我来讲解下模板编程的语法： <p><strong>模板头的常用关键字：</strong> <p>　　1.template:声明模板的名字&nbsp; eg：template "模板1" <p>　　2.description:描述参数，描述这个模板的用途。(保存好后，你可以在模板管理器里看到你自定义的模板的名字，描述等信息。)eg：description "这个模板是用来。。。" <p>　　3.applies_to:参数可以是file/disk/RAM。指定该模板的适用对象时文件、磁盘还是内存。eg：applies_to disk <p>　　4.fixed_start offset:模板的默认起始偏移量取决于光标停留的位置，而这个关键字是来指定偏移量起始位置。eg：fixed_start 0x040 <p>　　5.sector-aligned:作用是指定模板从当前扇区的偏移0位置运行。无参数。 <p>　　6.requires offset:匹配数据，若发现指定偏移量的位置的数据不匹配，就会报错。注意：这里的偏移量是相对于模板起始偏移量计算的。eg：requires 0x1fe "55aa" <p>　　7.big-endian/little-endian:规定读取的字节顺序，也就是平日说的小端机、大端机的区别，内存的数据存储方向不一样。无参数。 <p>　　8.hexadecimal:使模板中读到的数据都以十六进制方式显示，octal为八进制，decimal为十进制。无参数。 <p>　　9.read-only/read-write：规定读取权限。无参数。 <p>　　10.multiple:作用是使模板上出现左右键来让你可以选择读取上一条或下一条记录，记录之间的跨度是该模板涉及的所有字节的长度。无参数。 <p>　　11.begin与end:之间的区域用于存放程序主干。 <p>　　这里作下模板头知识总结：首先，模板的命名需要关键字template加引号完成。description参数可以补充描述。applies_to(RAM、file、disk)后面可以用于指定访问对象的类型，使模板适应当前工程的根本环境。fixed_start可以为模板指定起始偏移量。requires则制定更严格的模板运行条件，要求模板作用范围内指定位置必须匹配指定数据。big-endian、hexadecimal、read-only等都是作用于显示输出的可选参数。头部关键字没有强制规定“出场顺序”，对引号的要求也不严格。此外，模板可以用双斜杠添加注释，这是一个很好的编程习惯。 <p>　　注意：数制属性关键字(hexadecimal等)、显示方向属性关键字(big-endian等)、读写属性关键字(read-only等)都可以插入begin与end之间，用于临时改变数据的属性，注意这种改变仅仅作用于紧随它们的数据类型声明语句，而并非全局。 <p>　　下面说下<strong>程序主干里的常用关键字</strong>: <p>　　1.int8:带符号的8位整型，占用一字节，范围-128~127。eg：int8 "身高" <p>　　2.uint8:无符号的8为整型，占用一字节，范围0~255。同byte类型。 <p>　　3.int16:带符号的16位整型，占用2字节。 <p>　　不赘述了，与前面这些类似的还有：uint16, int32, uint32, int64, int24, uint24。 <p>　　4.unit_flex:类似于c语言里位域的概念。其语法是：unit_flex "要解释的位" "title" <p>　　例如：unit_flex "8,7,6,5,4,3,2,1,0" "permissions",表示读取一个32位无符号整数并解释其低9位。 <p>　　注意，尽管unit_flex所表示的数据长度可能小于4个字节，但每次读取仍然按照4个字节来计算，故而要特别注意位域的实际长度。比如，我们要解释一个16位整型数值的前4位和后12位，应当首先解释前4位，这时光标移动4字节。unit_flex "3,2,1,0" "flexlow" 因为还有数据要从该16位整型数值中提取，故回退4个字节。move -4 。 解释后12位。unit_flex "15,14,13,12,11,10,9,8,7,6,5,4" "flexhigh"&nbsp; 由于16位整型数值只占用两个字节，而实际光标移动4字节，故需要回退2字节：move -2,&nbsp; 否则会占用下一个数据的空间。 <p>　　5.binary:每次读取一个字节，并解释为二进制样式。 <p>　　6.char:读取一个字节，ascii码显示。也可以用char[len]读取字符数组(字符串)，len表示长度。 <p>　　7.char16:读取两个字节，Unicode字符显示。 <p>　　8.string:ascii字符串。语法为string len "title" <p>　　9.string16:unicode字符串。 <p>　　10.zstring:表示不管长度读取一个ascii字符串，遇到"NULL"时结束。zstring16为其Unicode版本。 <p>　　11.hex:表示直接读取字节而且并不将其解释为任何数据类型，直接显示。 <p>　　12.float：占用4字节，浮点数，同c语言。 <p>　　13.real:占用6字节，浮点数。 <p>　　14.double:占用8字节，浮点数。 <p>　　15.longdouble:占用10字节，浮点数。 <p>　　16.Loop:实现简单的循环。中括号中可以存放常量表示循环次数，也可以直接引用前面数据类型的title。 <p>　　17.IfEqual:简单的if语句，判断是否相等。比较的对象可以是常量，也可以是前面数据类型的title。 <p>　　eg：<pre>byte "学号"
IfEqual  "学号"  09
    uint  "成绩"
Else
    uint  "绩点”
EndIf</pre>
<p>　　18.~:占位符。一般用于循环内部数据类型的标题中，以形成数字递增的效果。常常与numbering配合使用。numbering可以用来指定占位符的初始值。
<p>　　eg：
<p><a href="http://www.cnblogs.com/jiu0821/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a><pre>uint32  "文件数目"
numbering 1
    {
        string16  255  "~号文件"
    }["文件数目"]<br><br>//占位符从1开始，循环代入string16 255 "~号文件"中。</pre>
<p><a href="http://www.cnblogs.com/jiu0821/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a>
<p>　　下面是随手写的一个例子，很凑合的说~
<p>　　源码：
<p><a href="http://www.cnblogs.com/jiu0821/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a><pre>template "the dbr of ntfs of jiu"
description "......"
applies_to disk
sector-aligned
requires 0x03 "4e54465320"
requires 0x1f0 "55aa"
little-endian
read-write
multiple
begin
    hex 3        "jmp"
    char[8]      "OEM"
    uint16       "bytes per sector"
    uint8        "sectors per cluster"
    uint16       "unused"
    hex 3        "zero"
    hex 10       "unused"
    int64        "total sectors"
    int64        "mft"
    int64        "mftmirr"
    byte         "file record"
    hex 100      "......"
end</pre>
<p><a href="http://www.cnblogs.com/jiu0821/p/"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a>
<p>　　自定义模板的应用：
<p><img alt="" src="http://images.cnitblog.com/blog2015/504727/201504/280047080528790.png"><img src ="http://www.cppblog.com/FongLuo/aggbug/214455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-11-30 16:09 <a href="http://www.cppblog.com/FongLuo/archive/2016/11/30/214455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Boost学习之格式化输出--Format</title><link>http://www.cppblog.com/FongLuo/archive/2016/10/20/214349.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Thu, 20 Oct 2016 06:01:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/10/20/214349.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214349.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/10/20/214349.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214349.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214349.html</trackback:ping><description><![CDATA[<p><strong><a href="http://www.cnblogs.com/lzjsky/archive/2011/05/05/2037327.html">原文地址</a></strong> <p><strong>boost::format</strong>类提供了类似C语言里'printf'功能的格式化输出能力，当然功能更强大。 <h5>所需头文件:</h5><pre>#include &lt;boost/format.hpp&gt;</pre>
<h5>示例代码:</h5>
<ol>
<div class="cnblogs_code" style="border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; border-bottom: #cccccc 1px solid; padding-bottom: 5px; padding-top: 5px; padding-left: 5px; border-left: #cccccc 1px solid; padding-right: 5px; background-color: #f5f5f5"><pre>#include &lt;iostream&gt;<span style="color: #000000">
#include </span>&lt;<span style="color: #0000ff">string</span>&gt;<span style="color: #000000">
#include </span>&lt;boost/format.hpp&gt;

<span style="color: #0000ff">using</span> <span style="color: #0000ff">namespace</span><span style="color: #000000"> std;
</span><span style="color: #0000ff">int</span> _tmain(<span style="color: #0000ff">int</span> argc, _TCHAR*<span style="color: #000000"> argv[])
{
</span><span style="color: #008000">//</span><span style="color: #008000"> 使用%序号%的方式给出指示符， 后面用%连接对应的数据。</span>
    cout &lt;&lt; boost::format(<span style="color: #800000">"</span><span style="color: #800000">writing %1%,  x=%2% : %3%-th try</span><span style="color: #800000">"</span>) % <span style="color: #800000">"</span><span style="color: #800000">toto</span><span style="color: #800000">"</span> % <span style="color: #800080">40.23</span> % <span style="color: #800080">50</span> &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:writing toto,  x=40.23 : 50-th try

</span><span style="color: #008000">//</span><span style="color: #008000"> 可以延迟使用，顺序不必一致</span>
    boost::format fmter(<span style="color: #800000">"</span><span style="color: #800000">%2% %1%</span><span style="color: #800000">"</span><span style="color: #000000">);
    fmter </span>% <span style="color: #800080">36</span><span style="color: #000000">;
    fmter </span>% <span style="color: #800080">77</span><span style="color: #000000">;
    cout </span>&lt;&lt; fmter &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:77 36

</span><span style="color: #008000">//</span><span style="color: #008000"> 可重用</span>
    fmter % <span style="color: #800080">12</span><span style="color: #000000">;
    fmter </span>% <span style="color: #800080">24</span><span style="color: #000000">;
    cout </span>&lt;&lt; fmter &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:24 12

</span><span style="color: #008000">//</span><span style="color: #008000"> 可直接转成字符串</span>
    std::<span style="color: #0000ff">string</span> s =<span style="color: #000000"> fmter.str();
    std::</span><span style="color: #0000ff">string</span> s2 = str( boost::format(<span style="color: #800000">"</span><span style="color: #800000">%2% %1% %2% %1%</span><span style="color: #800000">"</span>)%<span style="color: #800000">"</span><span style="color: #800000">World</span><span style="color: #800000">"</span>%<span style="color: #800000">"</span><span style="color: #800000">Hello</span><span style="color: #800000">"</span><span style="color: #000000">);

    cout </span>&lt;&lt; s &lt;&lt; endl &lt;&lt; s2 &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:
</span><span style="color: #008000">//</span><span style="color: #008000"> 24 12
</span><span style="color: #008000">//</span><span style="color: #008000"> Hello World Hello World

</span><span style="color: #008000">//</span><span style="color: #008000"> 可以使用printf指示符</span>
    cout &lt;&lt; boost::format(<span style="color: #800000">"</span><span style="color: #800000">%3.1f - %.2f%%</span><span style="color: #800000">"</span>) % <span style="color: #800080">10.0</span> % <span style="color: #800080">12.5</span>  &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:10.0 - 12.50%

</span><span style="color: #008000">//</span><span style="color: #008000"> printf指示符里使用N$指定使用第几个参数</span>
    cout &lt;&lt; boost::format(<span style="color: #800000">"</span><span style="color: #800000">%2$3.1f - %1$.2f%%</span><span style="color: #800000">"</span>) % <span style="color: #800080">10.0</span> % <span style="color: #800080">12.5</span>  &lt;&lt;<span style="color: #000000"> endl;
</span><span style="color: #008000">//</span><span style="color: #008000"> 输出:12.5 - 10.00%</span>
<span style="color: #000000">
    cin.</span><span style="color: #0000ff">get</span><span style="color: #000000">();
</span><span style="color: #0000ff">return</span> <span style="color: #800080">0</span><span style="color: #000000">;
}</span></pre></div></ol>
<h5><strong>boost::format</strong>里的指示符语法大致有三大类:</h5>
<h6>继承并强化自printf的格式化字符串</h6>&nbsp;&nbsp;&nbsp; 形式为<font color="#0000ff">:[ N$ ] [ flags ] [ width ] [ . precision ] type-char</font><br>&nbsp;&nbsp;&nbsp; N$可选，指定使用第N个参数（注意，要么所有指示符都加此参数，要么都不加）<br>&nbsp;&nbsp;&nbsp; 接下来的参数可以参数printf的指示符，只是format为其中的flags添加了'_'和'='标志，用于指出内部对齐和居中对齐。 
<h6>设置打印规则，它是printf参数的一个补充，只是为了更直观点。</h6>&nbsp;&nbsp;&nbsp; 形式为<font color="#0000ff">:%|spec|<br></font>&nbsp;&nbsp;&nbsp; 如:%|1$+5|表示显示第一个参数，显示正负号，宽度为5 
<h6>简单的位置标记</h6>&nbsp;&nbsp;&nbsp; 形式为<font color="#0000ff">:%N%</font><br>&nbsp;&nbsp;&nbsp; 简单地声明显示第N个参数，优点是比较直观而且不用指定类型。
<img src ="http://www.cppblog.com/FongLuo/aggbug/214349.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-10-20 14:01 <a href="http://www.cppblog.com/FongLuo/archive/2016/10/20/214349.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows下如何编译使用boost</title><link>http://www.cppblog.com/FongLuo/archive/2016/10/20/214347.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Thu, 20 Oct 2016 00:20:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/10/20/214347.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214347.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/10/20/214347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214347.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214347.html</trackback:ping><description><![CDATA[<p><a href="https://www.cppfans.org/1317.html">原文地址</a> 原文中存在一些错误，并且使用的是1.49。(也许是1.49本身的问题，未深究) <p>最近在看boost::asio的东西，所以必须要用到boost库，下载了一个，所以与大家分享下boost库的编译方法。  <p>本方法应该适用于boost的任何版本，应该适用于任何C++编译器(VC6.0可能对某些库不支持，因为模板的原因)，因为Linux没怎么用，所以只是分享下windows上的编译方法。  <p>1.下载boost  <p>从boost官网( <a href="http://www.boost.org/">http://www.boost.org</a> )上下载最新的boost版本，现在最新是1.62版本，解压到自定义目录(为了后面好说明，这里假设为boost_1_62_0)  <p>2.编译安装boost  <p>boost_1_62_0目录下会有一个bootstrap.bat批处理，可以直接点击它，会在 boost_1_62_0\tools\build\v2 文件夹下生成两个exe：b2.exe和bjam.exe，并且自动拷贝这两个文件到boost_1_62_0目录下。从cmd命令进入到boost_1_62_0路径下，如果你不知道如何编译，可以输入–help查看命令行帮助。  <p>输入如下命令：<pre><font color="#4bacc6"><strong>b2 toolset=msvc-10.0 --layout=versioned architecture=x86 address-model=64
link=static variant=debug,release threading=multi runtime-link=static 
--without-python --without-mpi --without-wave --without-graph 
--without-math --without-serialization stage</strong></font></pre>
<p>使用不同的命令对你使用boost也会产生很大的影响，因为CPU速度和硬盘现在都已经不是大问题了，所以本例中选择了除了不必要库的完全编译，当然了，你时间够，硬盘够，可以完全编译<pre><strong><font color="#9b00d3">b2 --toolset=msvc-10.0 --build-type=complete</font></strong></pre>
<p>解释完以上的命令后，再说完全编译的后果。 
<p>1.toolset：表示编译器工具，我安装的是VS2010，所以是msvc-10.0; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 具体的版本对应关系，可以查看boost_1_62_0\tools\build\src\tools\msvc.jam中的# Version aliases节<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Version aliases.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-6 = 6.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-6.5 = 6.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-7 = 7.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-8 = 8.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-9 = 9.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-10 = 10.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-11 = 11.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-12 = 12.0 ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .version-alias-14 = 14.0 ;<br>
<p>2.architecture：表示架构，也就是你的CPU架构，x86,x64，因为我安装的是win7 32位，所以使用了x86的架构 
<p>3.instruction-set：表示指令集，依然是8086指令集 
<p>4.address-model：表示地址长度为32位 
<p>5.link：表示生成动态/静态链接库，动态链接库是shared，静态链接库是static，一般都会编译成静态库，因为给出程序的时候打包boost的库会非常庞大 
<p>6.variant：表示生成的Debug或者release版本，一般情况下会两种版本都会编译出来的 
<p>7.threading：表示单/多线程编译，一般我们的程序都会用到多线程，所以选择了multi 
<p>8.runtime-link：表示动态/静态链接C/C++运行时库(C/C++ Runtime)，我们选择了动态链接 
<p>9.without/with：表示不需要编译/需要编译哪些库，一些自己不用的库可以无需编译 
<p>10.stage/install：stage表示只生成库文件(DLL和Lib)，install还会生成包含头文件的include目录，推荐使用stage，因为boost_1_62_0\boost中就是boost库完整的头文件，所以无需再拷贝一份出来。编译出来的库会放在stage文件夹中 
<p>这样一份完整的boost库就生成了，剩下就是直接使用到项目中了。 
<p>上面的编译指令可以存成一个批处理，这样进入到boost_1_62_0目录后，只需要执行批处理就可以了，更方便。 
<p>(现在看到为什么不推荐使用完全编译了吧，因为完全编译会编译出各种组合的所有情况，需要占用更多的空间和时间，所以建议各位朋友还是放弃了吧) 
<p>使用的时候可以直接包含到项目中，然后在对应的文件中包含相应的头文件即可，例如<pre>#include "boost/asio.hpp"</pre>
<p><strong>假如</strong>您还嫌上面你的方法太麻烦了，可以使用一个懒汉专用小工具boost setup，下载地址为<a href="http://www.boostpro.com/download/">http://www.boostpro.com/download/</a> 
<p>这个工具可以帮你下载并编译好，你只需要点击鼠标配置下就可以了，一步步操作如下图： 
<p><a href="http://www.flickr.com/photos/77023314@N08/7006875608/"><img alt="boost_1_47_setup_1" src="http://farm8.staticflickr.com/7178/7006875608_71508ef057.jpg" width="500" height="389"></a><br><a href="http://www.flickr.com/photos/77023314@N08/7006875714/"><img alt="boost_1_47_setup_2" src="http://farm9.staticflickr.com/8146/7006875714_4dee8dcdf1.jpg" width="500" height="389"></a><br><a href="http://www.flickr.com/photos/77023314@N08/7152966243/"><img alt="boost_1_47_setup_3" src="http://farm8.staticflickr.com/7038/7152966243_8ca8d45155.jpg" width="500" height="389"></a><br><a href="http://www.flickr.com/photos/77023314@N08/7152966343/"><img alt="boost_1_47_setup_4" src="http://farm6.staticflickr.com/5338/7152966343_19d71785da.jpg" width="500" height="389"></a><br>最后点击Install之后就会编译并安装到你指定的目录，这个够方便吧(不过这个是下载后编译，可能会有点慢)。最后一步就不演示了，因为我还不想用这种方法。 
<p>以上就是boost在windows环境下的安装编译方法，boost库可以说是现在最强大的C++类库了，你想要的任何功能都有，我认为每一个C/C++程序员都应该学习的。 
<img src ="http://www.cppblog.com/FongLuo/aggbug/214347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-10-20 08:20 <a href="http://www.cppblog.com/FongLuo/archive/2016/10/20/214347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Chrome插件被禁用怎么办 Chrome安装非官方扩展教程</title><link>http://www.cppblog.com/FongLuo/archive/2016/10/08/214318.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Sat, 08 Oct 2016 00:44:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/10/08/214318.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214318.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/10/08/214318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214318.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214318.html</trackback:ping><description><![CDATA[<h3><a href="http://www.veryhuo.com">http://www.veryhuo.com</a> <a href="http://www.veryhuo.com/">烈火网</a> 2016-09-10</h3> <p>大家都知道<a href="http://www.veryhuo.com/z/chrome/"><b>Chrome</b></a>安装插件一般要通过Chrome<a href="http://www.veryhuo.com/z/sjyysd/"><b>应用商店</b></a>在线安装，如果要离线安装扩展程序就要下载以“.crx”为后缀名的文件，然后打开扩展程序页面，将 .crx 文件拖放到 Chrome 窗口上安装。但是自从 Chrome 33 发布以后，Google 为了安全考虑开始禁止使用离线安装的插件，一拖进去就被直接禁用了，还无法手动启用。所以很多“优化版”、“破解版”的扩展程序都无法直接安装使用了。 <p>那么如何安装chrome非官方扩展呢，最火软件站为您总结了两种方法，这两种方法可以离线安装扩展程序并且可以不被 Chrome 屏蔽，以下是具体方法： <h5>一、通过开发者模式加载扩展程序</h5> <p>1. 将下载的 .crx 文件后缀名改为 .zip; <p>2. 将修改后的文件解压到一个新的文件夹，名字随意，最好是扩展程序名的英文或拼音，便于区分; <p>3. 打开 Chrome， 转到扩展程序页面， 找到右上角的“开发者模式”，勾选; <p>4. 点击第二行的“加载正在开发的扩展程序…”,选择刚刚解压到的文件夹，点击确定; <p>5. 安装完成，设置好就可以使用了。 <p>6. 每次重新打开 Chrome 时会提醒是否禁用以开发者模式运行的扩展程序，点击取消，就可以一直使用了。 <p>注意：这个扩展程序解压到的文件夹是不能删除的，删除后该扩展程序将无法继续使用。 <h5>二、在组策略添加扩展程序白名单</h5> <p>1. 下载 Chrome组策略管理模板“chrome.adm”(<a href="http://www.veryhuo.com/down/html/138127.html">下载地址</a>); <p>2. Win+R 打开运行，输入 gpedit.msc，确定; <p>3. 依次展开 本地计算机策略 &gt; 计算机配置 &gt; 管理模板，在“管理模板”上右击，选择“添加/删除模板”; <p><img border="0" alt="" src="http://pic.veryhuo.com/allimg/1609/102Aa2S-0.png"> <p>4. 点击添加，找到第1步下载的“chrome.adm”，打开，关闭“添加/删除模板”窗口; <p>5. 依次展开 本地计算机策略 &gt; 计算机配置 &gt; 管理模板 &gt; 经典管理模板(ADM) &gt; Google &gt; Google Chrome &gt; 扩展程序，双击右侧的“配置扩展程序安装白名单”; <p><img border="0" alt="" src="http://pic.veryhuo.com/allimg/1609/102A93118-1.png"> <p>6. 点选左边第二项“已启用”，点击下面的“显示”， <p><img border="0" alt="" src="http://pic.veryhuo.com/allimg/1609/102A96303-2.png"> <p>7. 打开 Chrome，将下载的 .crx 文件拖放至 Chrome 扩展程序页面安装; <p>8. 找到右上角的“开发者模式”，勾选，复制刚安装的扩展的 ID; <p><img border="0" alt="" src="http://pic.veryhuo.com/allimg/1609/102A93B5-3.png"> <p>9. 粘贴到第6步弹出的窗口中，确定; <p><img border="0" alt="" src="http://pic.veryhuo.com/allimg/1609/102A94394-4.png"> <h5>三、编辑总结</h5> <p>虽然两种方法目前都可以正常使用，但是相对来说，第一种方法由于每次重新打开 Chrome 都会弹出询问窗口，比较麻烦;第二种虽然应用的方法比第一种麻烦，但是只需要安装扩展的时候应用一次，以后打开浏览器就不会再有提示了，所以还是推荐使用第二种方法。 <img src ="http://www.cppblog.com/FongLuo/aggbug/214318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-10-08 08:44 <a href="http://www.cppblog.com/FongLuo/archive/2016/10/08/214318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在离线环境中使用.NET Core</title><link>http://www.cppblog.com/FongLuo/archive/2016/07/19/214001.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Tue, 19 Jul 2016 06:11:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/07/19/214001.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/214001.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/07/19/214001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/214001.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/214001.html</trackback:ping><description><![CDATA[<h4>原文地址：<a title="http://www.cnblogs.com/durow/p/5681331.html" href="http://www.cnblogs.com/durow/p/5681331.html">http://www.cnblogs.com/durow/p/5681331.html</a></h4> <h4>&nbsp;</h4> <h4>0x00 写在开始</h4> <p>很早开始就对.NET Core比较关注，一改微软之前给人的印象，变得轻量、开源、跨平台。最近打算试着在工作中使用。但工作是在与互联网完全隔离的网络中进行的，因此就开始了在离线环境中部署.NET Core开发环境的尝试。总的来说还是比较蛋疼的，几乎每个阶段都遇到了问题。不过还好最后搞定了，写下这篇博客做个记录，同时分享给有类似需求的童鞋。以下都是亲测有效。 <h4>0x01安装VS2015 Update3</h4> <p>开发.NET Core可以使用VS2015和VS Code。在这里先讨论VS2015的情况，毕竟如果在Windows下开发，VS2015功能上还是要强太多。.NET Core Web Tools必须要VS2015 Update3以上，也就是首先要在内网安装VS2015 Update3。我刚开始的方式是从官网下载光盘镜像，然后安装。但这样大多数情况下是无法安装的。会提示“安装包丢失或损坏”，之前装VS2015时可以选择跳过文件，装完后也能用（至少WPF没问题），但从VS2015 Update2开始，有些安装包无法选择跳过，只能退出安装。 <p>之所以提示安装包损坏，是因为系统中缺少 <p>microsoft root certificate authority 2010 <p>microsoft root certificate authority 2011 <p>这两个证书，导致安装包验证无法通过，所以认为损坏。 <p>解决方法： <p>1.找一台正常装了VS2015的电脑，Win+R打开运行，输入certmgr.msc，打开证书管理界面。 <p><img src="http://read.html5.qq.com/image?src=forum&amp;q=5&amp;r=0&amp;imgflag=7&amp;imageUrl=http://mmbiz.qpic.cn/mmbiz/gak2lhVxV6LaHBIW4ct34xValwGuWmNV3eiaZmaxpapflyFgHytFkjy8KTVSqSwfkQPMwgGaxDGBPiaBmIcgXIXw/0?wx_fmt=png"> <p>2.在受信任的根证书颁发机构中找到缺少的两项。按照默认方式导出（不知道为什么我这台电脑上有重复）。 <p>3.证书复制到内网，打开证书管理界面，然后在受信任的根证书办法机构中导入证书。 <p>这样就可以正常安装VS2015 Update3了。 <p>此外还要说明的是除了下载VS2015 Update3的光盘镜像外，还可以离线安装文件，把安装文件考到离线环境下安装。具体方法是：在官方下载页面中下载Web安装程序 <p><a>https://www.visualstudio.com/downloads/download-visual-studio-vs</a> <p>以community版本为例，在安装程序所在目录打开命令行窗口，输入：vs_community_CHS.exe /layout 这样就可以把文件都离线下来，貌似比光盘镜像内容要多一些。 <h4>0x02 安装DotNetCore.1.0.0-VS2015Tools.Preview2</h4> <p>这个可以用与VS2015同样的方式离线，下载在线安装程序后，在安装程序所在目录打开命令行窗口输入： <p>DotNetCore.1.0.0-VS2015Tools.Preview2.exe /layout <p>即可把安装文件下载到相同目录下packages文件夹里，其中也包含了.Net Core SDK。比较惨的是我的内网电脑装了某国产杀毒软件，每次一运行安装就提示我恶意操作然后强行中止安装，我又没权限关掉杀毒软件，所以只好在一个一个包手动装的，不过好在可以正常使用。因为离线环境总是缺这缺那的，如果安装过程中出现什么问题，只要查看错误log，然后解决就可以。 <h4>0x03 如何使用nuget</h4> <p>.NET Core的包依赖全都使用nuget，在线环境下自然是方便，离线环境下就稍麻烦一点了。在安装VS2015 Update3时，.NET Core所需的官方依赖包都已经安装在了（默认安装）C:\Program Files (x86)\Microsoft SDKs\NuGetPackages目录下，在nuget管理中也可以看到这是默认的离线包目录，我们需要什么样的包只要把它复制到这个目录，在nuget管理中的程序包源选择离线的源即可。 <p><img src="http://read.html5.qq.com/image?src=forum&amp;q=5&amp;r=0&amp;imgflag=7&amp;imageUrl=http://mmbiz.qpic.cn/mmbiz/gak2lhVxV6LaHBIW4ct34xValwGuWmNVVkAJHicibicwTDh7b3aQKRzEibUevkAslRwPIl9Gia9t93iaPNZ4bNMONmPA/0?wx_fmt=png"> <p>那么怎么获得离线安装包呢，我们在用nuget安装程序包时会在C:\Users\{你的用户名}\.nuget\packages目录进行缓存，只要找到缓存的包复制到离线环境，放到nuget离线目录即可。 <p>另外还有一种方式就是在内网架设nuget服务，这个也十分容易， <p><a>http://edi.wang/Post/2012/12/15/setup-private-nuget-server</a> <p>阿迪王这篇网文章比较详细，可以参考。考虑到要用的.NET Core比较新，我用的最新版的NugetServer是可以用的，其它版本的没试。服务架设好了在nuget管理中添加新的包源就可以了。 <p>这种方式同样可以添加其它项目（例如WPF）的包依赖。 <h4>0x04 使用VS Code开发</h4> <p>除了VS外也可以使用VS Code开发.NET Core，我的方式是在能联网的电脑上下载VS Code，然后装一堆需要的插件，插件都装在了C:\Users\{你的用户名}\.vscode\extensions目录下，只要把这个目录打包考到离线环境中，解压到相同目录下就能用了。 <p>另外用VS Code开发在dotnet restore时需要加-s参数指明包源：dotnet restore -s 包目录。或者在项目的根目录添加nuget.config文件 <p>此文件可在github上下载： <a>https://github.com/aspnet/Home/blob/dev/samples/latest/HelloMvc/NuGet.Config</a><pre>xml version="1.0" encoding="utf-8"?&gt;&lt;configuration&gt;
  &lt;packageSources&gt;
    &lt;clear /&gt;
    &lt;add key="AspNetVNext" value="https://www.myget.org/F/aspnetvnext/api/v2" /&gt;
    &lt;add key="NuGetorg" value="https://nuget.org/api/v2/" /&gt;
  packageSources&gt;configuration&gt;</pre>
<p>在packageSources中添加自己的包源。
<h4>0x05 写在最后</h4>
<p>整个过程还是花了一些时间的，中途有几次很郁闷不想搞了。但实在很想在工作环境中用.NET Core做点东西试试，幸好最终搞定了。想想看还是有些小激动的。
<img src ="http://www.cppblog.com/FongLuo/aggbug/214001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-07-19 14:11 <a href="http://www.cppblog.com/FongLuo/archive/2016/07/19/214001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>USB Trace</title><link>http://www.cppblog.com/FongLuo/archive/2016/05/25/213579.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Wed, 25 May 2016 01:17:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2016/05/25/213579.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/213579.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2016/05/25/213579.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/213579.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/213579.html</trackback:ping><description><![CDATA[我们常用的USB分析工具（纯软件）为USBViewer和BusHound，但那只是枚举完成后的事儿，枚举过程中发生了什么事儿呢？<br />最近公司牛人推荐了一套微软的工具：<br /><br />下面的链接是微软提供的usb&nbsp;trace工具，可以跟踪和分析windows下面，usb主机驱动的所有日志，可以帮助分析设备不上盘的原因。<div>可以试用一下。<br /><br /><a href="https://msdn.microsoft.com/en-us/library/windows/hardware/dn741264(v=vs.85).aspx" title="https://msdn.microsoft.com/en-us/library/windows/hardware/dn741264(v=vs.85).aspx"><img src="file:///C:\Users\ADMINI~1.USE\AppData\Local\Temp\8LDO48C$8@[GWU0353$FOVS.png"  alt="" />https://msdn.microsoft.com/en-us/library/windows/hardware/dn741264(v=vs.85).aspx<br /></a><br />据说可以看到整个枚举过程。有时间得研究下。</div><img src ="http://www.cppblog.com/FongLuo/aggbug/213579.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2016-05-25 09:17 <a href="http://www.cppblog.com/FongLuo/archive/2016/05/25/213579.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>妻子的空位</title><link>http://www.cppblog.com/FongLuo/archive/2009/08/31/94920.html</link><dc:creator>FongLuo</dc:creator><author>FongLuo</author><pubDate>Mon, 31 Aug 2009 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/FongLuo/archive/2009/08/31/94920.html</guid><wfw:comment>http://www.cppblog.com/FongLuo/comments/94920.html</wfw:comment><comments>http://www.cppblog.com/FongLuo/archive/2009/08/31/94920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/FongLuo/comments/commentRss/94920.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/FongLuo/services/trackbacks/94920.html</trackback:ping><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-family: 新細明體;"><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><font color="#3333ff" size="3">妻子的空位</font></font></font></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><font size="3"><span lang="EN-US"><font face="Times New Roman">---</font></span><span style="font-family: 新細明體;">摘錄自</span><span lang="EN-US"><span><font face="Times New Roman">&nbsp;&nbsp;</font></span></span><span style="font-family: 新細明體;"><a  href="http://tw.myblog.yahoo.com/biopesticides-hsieh/"><font color="#000099" size="3">謝奉家的書香部落格</font></a></span><span lang="EN-US"><span><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 新細明體;">作者佚名</span></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"></span><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2">&nbsp;</font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><font size="3"><font color="#009900"><span style="font-family: 新細明體;">相當感人的一篇文章</span><font face="Times New Roman"> </font></font></font><span lang="EN-US"><br></span><font size="3"><font color="#009900"><span style="font-family: 新細明體;">希望你我能更加珍惜自己</span><font face="Times New Roman">
</font></font></font><span lang="EN-US"><br></span><span style="font-family: 新細明體;"><font color="#009900" size="3">為了你摯愛的家人&#8230;&#8230;&#8230;&#8230;&#8230;</font></span><font size="3"><span lang="EN-US"><font face="Times New Roman"> <br>&nbsp;<br></font></span><span style="font-family: 新細明體;">我
的妻子因為意外事故離開我身邊已經四年了，我想，妻子留下不會做任何家事的我和孩子，她的心有何等難過呢？我也因為無法兼顧父母雙親的角色而感到挫折。有
一天我為了出差，清晨趕出門，無法將孩子打點好就得離開家，正巧前一天有剩下的飯，我熱了蒸蛋，向還沒有睡醒的孩子交代一聲，就出門去了。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">為了照顧好孩子飲食三餐的事，我也無
力把自己的工作做好。有一天晚上回到家，我只是很簡短地和孩子打個招呼，就因為身體疲累，不想吃晚餐，脫掉西裝之後就直接往床上躺下。就在那個時候，砰的
一聲，紅色的湯汁跟泡麵瞬時弄髒了床單和被單，原來有碗泡麵在棉被裡！這小子真是的，說時遲那時快，我即時拿起木棍跑出去，往正玩著玩具的兒子的屁股就
打，因為我實在是太生氣了，所以不停地打他。但就在這個時候，他邊啜泣邊說了一段話，使我停了下來。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">兒子告訴我說：「飯鍋裡的飯早上已經
吃完了，晚餐在幼稚園吃了，但是到了晚上，爸爸還不回來，我就在櫥櫃的抽屜裡找到了泡麵。可是我想到爸爸說不能亂動瓦斯爐，所以我就打開洗澡的水龍頭，用
熱水泡了泡麵，一個自己吃，另一個想留給爸爸吃。因為怕泡麵涼掉，所以我就把它放在棉被裡，等你回來。可是因為我正在玩向朋友借來的玩具，所以忘了跟爸爸
講。」</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">我不想讓兒子看到我在流淚，所以衝到
洗手間，將水龍頭打開，大聲地哭。過了一陣子之後，我打起精神來，一面哄著兒子，一面也在他屁股上擦藥，讓他上床睡覺。當我清理好泡麵弄髒的床單和棉被
後，打開兒子的房門一看，發現他仍舊發出哭泣聲，手裡還拿著媽媽的照片。我把頭靠在房門站了許久，看著這一幕。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">自從在一年前發生這件事之後，我為了扮演好媽媽的角色，更加用心地去照顧他。現</span><span style="font-family: 新細明體;">在兒子快七歲了，不久後就要從幼稚園畢業，進入國小讀書。慶幸的是，兒子在這段時間毫無陰影，很開朗地成長。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">就在不久前，我再一次打孩子，因為幼
稚園來電話說，兒子沒有去學校，我心裡覺得很不安，所以早退回家，在整個社區裡大聲地喊他的名字，卻是遍尋不著。後來在文具店的門口看見他站在電玩的前
面，於是我很生氣，又開始一直打他。兒子並沒有說出任何的解釋，只說了聲對不起。後來我才知道，原來剛好是幼稚園要邀請媽媽去看才藝表演的日子。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">發生這些事的幾天後，兒子回家說，他在幼稚園裡學了寫字，從此他經常關在自己的房間裡不出來，很認真地寫字。我看到兒子這個樣子，想到妻子在天國也一定會因為看到他這樣而微笑，我就無法忍住淚水。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">時間很快，又過了一年，到了冬天，街
頭上都在播放著聖誕節的歌曲，我的兒子卻又闖了一個禍。我正要下班的時候，接到一通社區郵局的電話，說我兒子把一綑沒有寫地址的信，惡作劇地放在郵筒裡。
每年到了年底，正是郵局最忙碌的時候，所以這對他們造成很大的困擾。雖然我已決定不再打孩子，但在急忙趕回家後，叫了兒子來，我</span><font face="Times New Roman"> </font><span style="font-family: 新細明體;">又忍不住痛打他一頓。兒子這一次只是說他做錯了，卻沒有講出任何理由。我把他推到一個角落，不管了，自個兒跑到郵局領回那一綑惡作劇的信。我把信丟到他眼前說：「你為什麼要這樣惡作劇？」兒子哭著回答說：「這些信是我要寄給媽媽的。」</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">當時我的眼眶紅了起來，心裡很激動，
但是因為在兒子面前，所以我盡量隱忍住沒有表現出來。我接著問他：「那麼，為什麼一次寄這麼多信呢？」兒子回答說：「以前我要把信投進去的時候，因為個兒
太矮，所以沒辦法投入，但是最近我再去郵筒時，已經搆得到了，所以我就把以前沒有寄的，一次全部都投進入了。」</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">我聽了以後，心中一片茫然，不知道該對孩子說什麼話。過了不久以後，我就跟他說：「媽媽現在在天上，以後你寫完信，把信燒了，就能送到天國去。」等孩子睡著之後，我到外面燒了那些信。我很好奇到底孩子想跟媽媽說些什麼，所以讀了其中的幾封信。而當中有一封信攪動了我的心。</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">親愛的媽媽：</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman"> <br></font></span><span style="font-family: 新細明體;">我
很想念你！媽媽，今天在幼稚園有才藝表演，但是因為我沒有媽媽，所以沒有去參加，我也沒有告訴爸爸，怕爸爸會想念媽媽。爸爸到處去找我，但我為了讓爸爸看
到我很開心的樣子，所以故意坐在電動玩具面前，雖然爸爸罵我，但是我到最後也沒有告訴他原因。媽媽，我每天都看到爸爸因為想念媽媽而哭泣，我想爸爸也跟我
一樣，很想念媽媽吧！但是，媽，我現在已經記不清楚你的臉。媽媽，請你讓我在夢中，再一次能夠看到你的臉，好嗎？聽說把想念的人的照片放在懷裡睡覺，就會
夢到那個人。可是，媽媽，為什麼你沒有出現在我的夢裡呢？」</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">讀完這封信以後，我就開始嚎啕大哭。到底什麼時候，我才能填補妻子的空位呢？</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;"><font color="#3333ff">給已經結婚的女同事：</font></span></font><font size="3"><span lang="EN-US"><font face="Times New Roman"><font color="#3333ff"> <br></font><br></font></span><span style="font-family: 新細明體;"><font color="#009900">不要加太多班，工作做不完，一直加班也不見得有用，請務必要照顧自己的身體，才可以好好疼惜妳的小寶貝。</font></span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;"><font color="#3333ff">給已經結婚的男同事：</font></span></font><font size="3"><span lang="EN-US"><font face="Times New Roman"><font color="#3333ff"> <br></font><br></font></span><font color="#009900"><span style="font-family: 新細明體;">不要喝太多酒，不要抽太多煙，請問我們的生意，我們的客戶，有比我們的身體重要嗎？</span><font face="Times New Roman"> </font><span style="font-family: 新細明體;">一定要想一想，有沒有辦法做到客人非我們不行，我們的差異化在哪裡，我們是否真的懂客人的心，這比拼命喝酒，還重要，請務必要照顧自己的身體，才可以好好疼惜妳的小寶貝和你的愛人。</span></font></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><font color="#3333ff"><span style="font-family: 新細明體;">給</span><span style="font-family: 新細明體;">還沒有結婚的男同事和女同事：</span></font></font><font size="3"><span lang="EN-US"><font face="Times New Roman"><font color="#3333ff">
<br></font><br></font></span><font color="#ff0000"><span style="font-family: 新細明體;">美其實是從愛自己的身體開始</span><span lang="EN-US"><font face="Times New Roman"> --</font></span><span style="font-family: 新細明體;">（蔣勳，身體美學）。</span></font></font><font size="3"><span lang="EN-US"><font face="Times New Roman"> <br><br></font></span><font color="#ff0000"><span style="font-family: 新細明體;">妳</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="font-family: 新細明體;">你們</span><font face="Times New Roman"> </font><span style="font-family: 新細明體;">一定要很自在，工作才能做的好，如果工作讓你</span><span lang="EN-US"><font face="Times New Roman">/</font></span><span style="font-family: 新細明體;">妳們的心情做的很辛苦，也不要傷害了妳</span><span lang="EN-US"><font face="Times New Roman"> /</font></span><span style="font-family: 新細明體;">你們的身體。</span></font><font face="Times New Roman">
</font></font></font></font></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><br></font></font></span><span style="font-family: 新細明體;"><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><font size="3">看完內容，心裡覺得好酸．．．</font></font></font></span><font color="#000000" face="Verdana" size="2"><font face="Verdana" size="2"><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">我最近常自問：你的收入，是預支健康及絞盡腦汁換來的嗎？！</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">因為每個人拼命工作到頭來，常忘了工作的初衷是什麼！</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">是想讓家人及自己生活過的更好？想得到名？還是想得到利？</span></font><font size="3"><span lang="EN-US"><font face="Times New Roman">
<br><br></font></span><span style="font-family: 新細明體;">但沒了「健康」，家人會開心嗎？自己又真的得到名或利了嗎？</span></font><span lang="EN-US"><br><br></span><font size="3"><span style="font-family: 新細明體;">我覺得「開心生活是最重要的」，時時關心身邊的人，</span><font face="Times New Roman"> </font><span style="font-family: 新細明體;">不要想著等我以後有錢時再如何如何，因為，我們都不知道下一秒會</span><span style="font-family: 新細明體;">發生什麼事？</span></font></font></font></p><img src ="http://www.cppblog.com/FongLuo/aggbug/94920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/FongLuo/" target="_blank">FongLuo</a> 2009-08-31 22:23 <a href="http://www.cppblog.com/FongLuo/archive/2009/08/31/94920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>