<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_THINK(谭振林)</title><subtitle type="text">龙行天下！http://weibo.com/thinhunan</subtitle><id>http://feed.cnblogs.com/blog/u/10620/rss</id><updated>2012-05-14T10:40:33Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/10620/rss"/><entry><id>http://www.cnblogs.com/think/archive/2012/02/08/AsyncEnumerator_With_EAP_Task.html</id><title type="text">AsyncEnumerator对EAP的支持</title><summary type="text">好久没在博客园发文了，不知这样的小文章能不能往首页发，^^</summary><published>2012-02-08T03:17:00Z</published><updated>2012-02-08T03:17:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2012/02/08/AsyncEnumerator_With_EAP_Task.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2012/02/08/AsyncEnumerator_With_EAP_Task.html"/><content type="html">&lt;p&gt;去年在异步编程中开始使用&lt;a href="http://www.wintellect.com/PowerThreading.aspx"&gt;Wintellect's .NET Power Threading Library&lt;/a&gt;中的AsyncEnumerator，这个库通过将程序员较陌生的异步编程模型转化为程序员较熟悉的同步编程模型来实现异步操作，较大的改善了异步代码的易写、易读、易维护性。&lt;/p&gt;&lt;p&gt;目前对AsyncEnumerator介绍的文章已经比较多了，但集中于APM（Asynchronous Programming Model）模式中的应用，而.NET中，特别是Silverlight中还有很多对象是使用EAP（Event-based Asynchronous Pattern），对应的EAP与AsyncEnumerator结合的文章与例子很少，加上&lt;a href="http://www.wintellect.com/cs/blogs/jeffreyr/default.aspx"&gt;Jeffrey Richter&lt;/a&gt;不喜欢EAP模型，让我一度以为AsyncEnumerator不支持，于是自己去实现了EAP和AsyncEnumerator的结合。后来项目后期对代码重构时，有时间就再仔细看了看Power Threading的实现，发现其本身对EAP的支持是有封装的。下面是基于AsyncEnumerator使用Silverlight进行Socket通信的例子（Silverlight的Socket只有EAP模型）：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;SocketAsyncEventArgs&amp;nbsp;socketEventArg&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;SocketAsyncEventArgs();&lt;br /&gt;socketEventArg.SocketClientAccessPolicyProtocol&amp;nbsp;=&amp;nbsp;SocketClientAccessPolicyProtocol.Tcp;&lt;br /&gt;DnsEndPoint&amp;nbsp;host&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;DnsEndPoint(HtmlPage.Document.DocumentUri.Host,&amp;nbsp;Configurations.PORT);&lt;br /&gt;socketEventArg.RemoteEndPoint&amp;nbsp;=&amp;nbsp;host;&lt;br /&gt;AsyncEnumerator&amp;nbsp;asyncEnum&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;AsyncEnumerator();&lt;br /&gt;EventApmFactory&amp;lt;SocketAsyncEventArgs&amp;gt;&amp;nbsp;eventApmFactory&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;EventApmFactory&amp;lt;SocketAsyncEventArgs&amp;gt;();&lt;br /&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;异步代码组织在GetEnumerator()中&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;IEnumerator&amp;lt;int&amp;gt;&amp;nbsp;GetEnumerator(SocketAsyncEventArgs&amp;nbsp;e,AsyncEnumerator&amp;nbsp;ae){...}&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;enumerator&amp;nbsp;=&amp;nbsp;GetEnumerator(socketEventArg,asyncEnum);&lt;br /&gt;EventHandler&amp;lt;SocketAsyncEventArgs&amp;gt;&amp;nbsp;eventHandler&amp;nbsp;=&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eventApmFactory.PrepareOperation(asyncEnum.End()).EventHandler;&lt;br /&gt;socketEventArg.Completed&amp;nbsp;+=&amp;nbsp;eventHandler;&lt;br /&gt;asyncEnum.BeginExecute(enumerator,&amp;nbsp;asyncEnum.EndExecute);&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;其中关键的代码是：&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;用EventApmFactory来创建一个Handler，这个Handler在每次事件触发时&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;调用asyncEnum.End()，将执行控制交还Enumerator，&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Enumerator接着上次yield&amp;nbsp;return之后的地方执行&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;EventHandler&amp;lt;SocketAsyncEventArgs&amp;gt;&amp;nbsp;eventHandler&amp;nbsp;=&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;eventApmFactory.PrepareOperation(asyncEnum.End()).EventHandler;&lt;br /&gt;socketEventArg.Completed&amp;nbsp;+=&amp;nbsp;eventHandler;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这个代码比我自己的EAP封装代码要简化很多，此外，Jeffrey在BLog中对Task与AsyncEnumerator的结合做了说明：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;IEnumerator&amp;lt;Int32&amp;gt;&amp;nbsp;AsyncEnumeratorAndTasks(AsyncEnumerator&amp;nbsp;ae)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;var&lt;/span&gt;&amp;nbsp;t&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Task&amp;lt;DateTime&amp;gt;(()&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;Thread.Sleep(&lt;span style="color: #800080;"&gt;10000&lt;/span&gt;);&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;DateTime.Now;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.Start();&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;The&amp;nbsp;Task&amp;nbsp;tells&amp;nbsp;the&amp;nbsp;AsyncEnumerator&amp;nbsp;when&amp;nbsp;it&amp;nbsp;is&amp;nbsp;done&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;If&amp;nbsp;you&amp;nbsp;don&amp;#8217;t&amp;nbsp;need&amp;nbsp;to&amp;nbsp;identify&amp;nbsp;the&amp;nbsp;Task,&amp;nbsp;you&amp;nbsp;can&amp;nbsp;pass&amp;nbsp;&amp;#8216;null&amp;#8217;&amp;nbsp;instead&amp;nbsp;of&amp;nbsp;&amp;#8216;task&amp;#8217;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;t.ContinueWith(task&amp;nbsp;=&amp;gt;&amp;nbsp;ae.End()(task));&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;yield&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Waits&amp;nbsp;for&amp;nbsp;the&amp;nbsp;1&amp;nbsp;Task&amp;nbsp;to&amp;nbsp;complete&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;You&amp;nbsp;MUST&amp;nbsp;call&amp;nbsp;DequeueAsyncResult&amp;nbsp;to&amp;nbsp;Remove&amp;nbsp;the&amp;nbsp;entry&amp;nbsp;form&amp;nbsp;the&amp;nbsp;AsyncEnumerator&amp;nbsp;object&amp;#8217;s&amp;nbsp;collection&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Casting&amp;nbsp;the&amp;nbsp;return&amp;nbsp;value&amp;nbsp;and&amp;nbsp;assigning&amp;nbsp;to&amp;nbsp;&amp;#8216;t&amp;#8217;&amp;nbsp;is&amp;nbsp;not&amp;nbsp;necessary;&amp;nbsp;since&amp;nbsp;&amp;#8216;t&amp;#8217;&amp;nbsp;already&amp;nbsp;refer&amp;nbsp;to&amp;nbsp;the&amp;nbsp;same&amp;nbsp;Task&amp;nbsp;object&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;t&amp;nbsp;=&amp;nbsp;(Task&amp;lt;DateTime&amp;gt;)&amp;nbsp;ae.DequeueAsyncResult();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(t.Result);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Shows&amp;nbsp;the&amp;nbsp;DateTime&amp;nbsp;when&amp;nbsp;the&amp;nbsp;Task&amp;nbsp;completed&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;参见：&lt;a href="http://www.wintellect.com/CS/blogs/jeffreyr/archive/2009/10/12/using-net-4-0-tasks-with-the-asyncenumerator.aspx"&gt;http://www.wintellect.com/CS/blogs/jeffreyr/archive/2009/10/12/using-net-4-0-tasks-with-the-asyncenumerator.aspx&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2342402.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2012/02/08/AsyncEnumerator_With_EAP_Task.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/11/17/BLOB_Stream.html</id><title type="text">大数据块(BLOBs)与流(Stream)操作性能规范</title><summary type="text">发现团队中有些兄弟对流的使用还不太熟悉，对SQL Server中大对象操作不太清楚，所以写这篇基础文章，以做规范</summary><published>2011-11-17T04:45:00Z</published><updated>2011-11-17T04:45:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/11/17/BLOB_Stream.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/11/17/BLOB_Stream.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;背景&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;编程过程中，常会遇到图片、音视频、日志文件等较大数据的处理，比如拷贝、读取、写入等。如果使用简单的文件、网络、数据库&lt;/span&gt;API&lt;span style="font-family:宋体;"&gt;将这些对象做整块的处理，意味着整个处理过程的每一个环节都需要分配和被处理对象一样大的内存块，造成处理过程的长时间读写准备以及内存的浪费与分配失败问题（如果一个对象超过&lt;/span&gt;2G&lt;span style="font-family:宋体;"&gt;，基本就会受到一些限制而直接报错）。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;概念：流&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;流是一组连续的数据，具有开头和结尾，并且使用游标指示当前位置。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;什么时候要用流呢？举个例子，污水处理厂，污水处理厂到底要处理多少污水？设计的时候是不知道的，也许在这个厂子关闭的那一天可以统计出来。在设计污水处理过程的时候，其实是不用考虑污水处理的总量的，污水处理厂只处理当前流到处理池中的污水，处理好了的水，流出处理池，它不再管理，还没流到处理池中来的污水，处理过程也不关心。污水处理厂在设计的时候只需根据估算的污水流量，选择合理大小的处理池就行了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;这样的场景很多，比如文件拷贝程序，&lt;/span&gt;Windows&lt;span style="font-family:宋体;"&gt;提供这个功能的时候，并不知道你要拷的是个多大的文件，比如视频播放程序，&lt;/span&gt;QQ&lt;span style="font-family:宋体;"&gt;影音并不知道你要放的是高清的还是&lt;/span&gt;10m&lt;span style="font-family:宋体;"&gt;的小视频，再比如打电话的时候，电信并不知道你要打多久，这个声音信息到底会是多大。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;那好了，所有的这些情况，都把它设计成一种连续数据的流来处理就好了。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;概念：&lt;/span&gt;Buffer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;流数据通常需要一个&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;，把当前待处理的数据放在&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;中，处理程序只操作&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;中的数据，流也提供&lt;/span&gt;Read&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;Write API&lt;span style="font-family:宋体;"&gt;来供&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;接收与发送流中的数据。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;设计规范&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;凡是碰到处理较大数据块（&lt;/span&gt;BLOBs&lt;span style="font-family:宋体;"&gt;），或者碰到根本就无法预知数据总量到底有多少的情况，就应该考虑流的模式，而且在整个处理过程中的每个环节都应该是这种模式，比如读一个文件，存到数据库中，那整个过程都应该是流的模式，读一部分文件，将这部分写到数据库中，再从文件中读下一部分数据到&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;，再将这部分写到数据库中，循环直到整个文件处理完。不能说，只是读文件是一块一块读，读出来都拼到一个大内存块中，再写到数据库中去，那还是没用，还是需要分配大块内存来容纳整个对象。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;标准写法&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;以下是最熟的拷贝文件的&lt;/span&gt;C# DEMO&lt;span style="font-family:宋体;"&gt;，基本过程就是从源文件中不断的读一小块数据到&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;中，再把&lt;/span&gt;Buffer&lt;span style="font-family:宋体;"&gt;中的数据写到目标地址，再读下一块，再写&amp;#8230;&amp;#8230;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; &lt;span style="color:blue"&gt;static&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; CopyFile(&lt;span style="color:blue"&gt;string&lt;/span&gt; srcPath, &lt;span style="color:blue"&gt;string&lt;/span&gt; descPath)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;此去略去地址检查等代码&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; bufferSize = 1024*1024;&lt;span style="color:green"&gt;//1m&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;的缓存大小&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[bufferSize];&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; readCount = 0;&lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:宋体;color:green;"&gt;读到的数据&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:blue"&gt;var&lt;/span&gt; inputStream = &lt;span style="color:#2B91AF"&gt;File&lt;/span&gt;.OpenRead(srcPath))&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:blue"&gt;var&lt;/span&gt; outputStream = &lt;span style="color:#2B91AF"&gt;File&lt;/span&gt;.Create(descPath))&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//bufferSize&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;是一次读多少数据&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//readCount&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;是实际读到了多少数据&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;while&lt;/span&gt; ((readCount = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inputStream.Read(buffer, 0, bufferSize)) &amp;gt; 0)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;因为最后一次读，&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;buffer&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;里的数据是不满的&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;所以只需写&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;readCount&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;个数据就可以了&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; outputStream.Write(buffer, 0, readCount);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;通过使用流的方式，最算拷贝&lt;/span&gt;20G&lt;span style="font-family:宋体;"&gt;的文件，这段程序理论上也只需使用&lt;/span&gt;1M&lt;span style="font-family:宋体;"&gt;的内存。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ADO.NET&lt;span style="font-family:宋体;"&gt;操作二进制大数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;有些人不太敢用数据库存大文件，因为经验上觉得大数据在数据库中存取，很慢，而且易出错。这种情况有可能是因为使用的方式和&lt;/span&gt;API&lt;span style="font-family:宋体;"&gt;不太对造成的。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;假设我们现在用一个表在&lt;/span&gt;SQLSvr&lt;span style="font-family:宋体;"&gt;中存资源文件，表定义如下：&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;CREATE TABLE [Files](&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ID] [int] IDENTITY(1,1) NOT NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Name] [varchar](50) NOT NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ContentType] [varchar](20) NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [ContentLength] [int] NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Data] [image] NULL,&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;CONSTRAINT [PK_Files] PRIMARY KEY CLUSTERED ([ID] ASC) ON [PRIMARY]&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;)&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;其中，&lt;/span&gt;Data&lt;span style="font-family:宋体;"&gt;列是&lt;/span&gt;Image&lt;span style="font-family:宋体;"&gt;（&lt;/span&gt;SQLSvr2005+&lt;span style="font-family:宋体;"&gt;建议换成&lt;/span&gt;varbinary(max)&lt;span style="font-family:宋体;"&gt;，一般需求下二种其实差不多）&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;往&lt;/span&gt;SQLSvr&lt;span style="font-family:宋体;"&gt;写入大数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;那在&lt;/span&gt;ASP.NET&lt;span style="font-family:宋体;"&gt;中实现的文件上传代码应该是这样的：&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;if&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; (&lt;span style="color:blue"&gt;this&lt;/span&gt;.FileUpload1.HasFile)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; name = FileUpload1.PostedFile.FileName;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; contentType = FileUpload1.PostedFile.ContentType;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; contentLength = FileUpload1.PostedFile.ContentLength;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-indent:18.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;//&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;注意先给&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;Data&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;列插入一个&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;color:green;"&gt;0(0x0)&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;值&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; cmdText = &lt;span style="color:#A31515"&gt;"insert into Files ( Name, ContentType, ContentLength, Data)"&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + &lt;span style="color:#A31515"&gt;"values (@name, @contentType, @contentLength, 0x0);"&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + &lt;span style="color:#A31515"&gt;"select @identity = SCOPE_IDENTITY();"&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;+ &lt;span style="color:#A31515"&gt;"select @pointer = TEXTPTR(Data) FROM Files WHERE ID = @identity"&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt; cmd = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(cmdText);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@name"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.VarChar, 50).Value = name;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@contentType"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.VarChar, 20).Value = contentType;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@contentLength"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int).Value = contentLength;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;当前插入数据行的&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;ID&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlParameter&lt;/span&gt; paraId = cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@identity"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraId.Direction = &lt;span style="color:#2B91AF"&gt;ParameterDirection&lt;/span&gt;.Output;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//TEXTPTR&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;函数&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;(sqlsvr 2000+)&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体; color:green;"&gt;返回&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;color:green;"&gt;16&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;位二进制表示的单元格指针&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlParameter&lt;/span&gt; outParaPtr = cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@pointer"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Binary,16);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outParaPtr.Direction = &lt;span style="color:#2B91AF"&gt;ParameterDirection&lt;/span&gt;.Output;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-indent:18.0pt; line-height:12.0pt; text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas; color:blue;"&gt;string&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; connStr = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left; text-indent:21.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:#A31515;"&gt;"Data Source=.;Initial Catalog=Resources;Integrated Security=True"&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt; conn = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt;(connStr))&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Connection = conn;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.ExecuteNonQuery();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; fileId = (&lt;span style="color:blue"&gt;int&lt;/span&gt;)paraId.Value;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left; text-indent:21.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:green;"&gt;//MSDN&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:宋体;color:green;"&gt;建议&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;Buffer&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;为&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;color:green;"&gt;8040&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;的倍数&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; bufferSize = 8040;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; offset = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] pointer = (&lt;span style="color:blue"&gt;byte&lt;/span&gt;[])outParaPtr.Value;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;通过&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;UPDATETEXT&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;命令获得单元格指针&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt; cmdAppendFile = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"UPDATETEXT Files.Data @pointer @offset 0 @bytes"&lt;/span&gt;, conn);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlParameter&lt;/span&gt; paraPtr = cmdAppendFile.Parameters.Add(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:42.0pt;text-align:left; text-indent:21.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:#A31515;"&gt;"@pointer"&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Binary,16);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraPtr.Value = pointer;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlParameter&lt;/span&gt; paraData = cmdAppendFile.Parameters.Add(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"@bytes"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.VarBinary, bufferSize);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlParameter&lt;/span&gt; paraOffset = cmdAppendFile.Parameters.Add(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"@offset"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraOffset.Value = offset;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[bufferSize];&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; readCount = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;通过流的方式将上传内容逐块写到数据库&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;while&lt;/span&gt; ((readCount = FileUpload1.PostedFile.InputStream&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Read(buffer, 0, bufferSize)) &amp;gt; 0)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] data = buffer;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;if&lt;/span&gt;(readCount &amp;lt; bufferSize)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[readCount];&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;Array&lt;/span&gt;.Copy(buffer,data,readCount);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;将新读入&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;Buffer&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;的数据作为参数传入数据库&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraData.Value = data;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmdAppendFile.ExecuteNonQuery();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;更新指针的偏移量&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset += readCount;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraOffset.Value = offset;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;这里使用了&lt;/span&gt;UPDATETEXT&lt;span style="font-family:宋体;"&gt;命令，请参考&lt;/span&gt;&lt;a href="http://msdn.microsoft.com/zh-cn/library/ms189466.aspx"&gt;http://msdn.microsoft.com/zh-cn/library/ms189466.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;从&lt;/span&gt;SQLSvr&lt;span style="font-family:宋体;"&gt;读取大数据&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;默认情况下，&lt;/span&gt;DataReader &lt;span style="font-family:宋体;"&gt;在整个数据行可用时立即以行的形式加载传入数据。可以将&lt;/span&gt; SequentialAccess &lt;span style="font-family:宋体;"&gt;传递到&lt;/span&gt; ExecuteReader &lt;span style="font-family:宋体;"&gt;方法来修改&lt;/span&gt; DataReader &lt;span style="font-family:宋体;"&gt;的默认行为，使其按照顺序在接收到数据时立即将其加载，而不是加载数据行。&lt;/span&gt; &lt;span style="font-family:宋体;"&gt;这是加载&lt;/span&gt; BLOB &lt;span style="font-family:宋体;"&gt;或其他大数据结构的理想方案。&lt;/span&gt; &lt;span style="font-family:宋体;"&gt;请注意，该行为可能会因数据源的不同而不同。&lt;/span&gt; &lt;span style="font-family:宋体;"&gt;例如，从&lt;/span&gt; Microsoft Access &lt;span style="font-family:宋体;"&gt;中返回&lt;/span&gt; BLOB &lt;span style="font-family:宋体;"&gt;会将整个&lt;/span&gt; BLOB &lt;span style="font-family:宋体;"&gt;加载到内存中，而不是按照顺序在接收到数据时立即将其加载。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;以下示例使用&lt;/span&gt;ASP.NET&lt;span style="font-family:宋体;"&gt;的一般处理程序将写入数据库中的数据再读出来并发送到&lt;/span&gt;Browser&lt;span style="font-family:宋体;"&gt;，注意，请不要使用&lt;/span&gt;Page&lt;span style="font-family:宋体;"&gt;来做这样的事情，&lt;/span&gt;Page&lt;span style="font-family:宋体;"&gt;有大量的页面生命周期事件要处理，而且产生额外的页面内容输出到响应流中。&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:blue;"&gt;public&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; &lt;span style="color:blue"&gt;class&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;ResourceHandler&lt;/span&gt; : &lt;span style="color:#2B91AF"&gt;IHttpHandler&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;void&lt;/span&gt; ProcessRequest(&lt;span style="color:#2B91AF"&gt;HttpContext&lt;/span&gt; context)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; id = &lt;span style="color:blue"&gt;int&lt;/span&gt;.Parse(context.Request.Params[&lt;span style="color:#A31515"&gt;"id"&lt;/span&gt;]);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; connStr = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:42.0pt;text-align:left; text-indent:21.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#A31515;"&gt;"Data Source=.;Initial Catalog=Resources;Integrated Security=True"&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; cmdText = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left; text-indent:21.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#A31515;"&gt;"SELECT ID,Name,ContentType,ContentLength,Data FROM Files WHERE ID = @id"&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;"&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt; cmd = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(cmdText);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Parameters.Add(&lt;span style="color:#A31515"&gt;"@id"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int).Value = id;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;using&lt;/span&gt; (&lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt; conn = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt;(connStr))&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; conn.Open();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.Connection = conn;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left;text-indent:29.9pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:green;"&gt;//&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:宋体;color:green;"&gt;这里使用&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;SeqentialAccess&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体; color:green;"&gt;是关键，&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left;text-indent:29.9pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;color:green;"&gt;//&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:宋体;color:green;"&gt;这样才能和&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;DataReader.GetBytes&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体; color:green;"&gt;配合实现流处理模式&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#2B91AF"&gt;SqlDataReader&lt;/span&gt; reader = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.ExecuteReader(System.Data.&lt;span style="color:#2B91AF"&gt;CommandBehavior&lt;/span&gt;.SequentialAccess);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;if&lt;/span&gt; (reader.Read())&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:宋体;color:green;"&gt;根据&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;SeqentialAccess&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;的要求，&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:宋体;color:green;"&gt;必须按取&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;Select&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;顺序先读掉第一列数据&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reader.GetInt32(0);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; fileName = reader.GetString(1);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;string&lt;/span&gt; contentType = reader.GetString(2);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; contentLength = reader.GetInt32(3);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:宋体;color:green;"&gt;设置必要的&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;Http-Response&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;头&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.ContentType = contentType;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.StatusCode = 200;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; bufferSize = 1024;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[] buffer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:blue"&gt;byte&lt;/span&gt;[bufferSize];&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; readCount = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;long&lt;/span&gt; offset = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;while&lt;/span&gt; ((readCount = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;span style="color:blue"&gt;int&lt;/span&gt;)reader.GetBytes(4, offset, buffer, 0, bufferSize)) &amp;gt; 0)&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.OutputStream.Write(buffer, 0, readCount);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset += readCount;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:blue"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;没读到数据返回&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;404&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:宋体;color:green;"&gt;错误&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.StatusCode = 404;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;public&lt;/span&gt; &lt;span style="color:blue"&gt;bool&lt;/span&gt; IsReusable&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;get&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;return&lt;/span&gt; &lt;span style="color:blue"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;}&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;第二种从&lt;/span&gt;SQLSvr2000+&lt;span style="font-family:宋体;"&gt;中读取大文件的方式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-family:宋体;"&gt;跟&lt;/span&gt;UPDATETEXT/WRITETEXT&lt;span style="font-family:宋体;"&gt;配对的命令其实是&lt;/span&gt;READTEXT&lt;span style="font-family:宋体;"&gt;，所以我们还可以用&lt;/span&gt;READTEXT&lt;span style="font-family:宋体;"&gt;命令，以指针的方式，从数据库中以流的方式读取大对象&lt;/span&gt;(&lt;span style="font-family:宋体;"&gt;这段代码是从网上拷下来的伪码，我补全了一下，并做测试&lt;/span&gt;)&lt;span style="font-family:宋体;"&gt;：&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;int&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; BUFFER_LENGTH = 32768; &lt;span style="color:green"&gt;// chunk size&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Obtain a pointer to the BLOB using TEXTPTR.&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlConnection&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; conn = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlConnection&lt;/span&gt;(&lt;span style="color:green"&gt;/*constr*/&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlCommand&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;"&gt; cmdGetPointer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"SELECT @Pointer=TEXTPTR(Picture), @Length=DataLength(Picture)"&lt;/span&gt; +&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"FROM Categories WHERE CategoryName='Test'"&lt;/span&gt;, conn);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Set up the parameters.&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlParameter&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; pointerOutParam = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left; text-indent:21.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;cmdGetPointer.Parameters.Add(&lt;span style="color:#A31515"&gt;"@Pointer"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.VarBinary, 100);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;pointerOutParam.Direction = &lt;span style="color:#2B91AF"&gt;ParameterDirection&lt;/span&gt;.Output;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlParameter&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; lengthOutParam = cmdGetPointer.Parameters.Add(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"@Length"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;lengthOutParam.Direction = &lt;span style="color:#2B91AF"&gt;ParameterDirection&lt;/span&gt;.Output;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;cmdGetPointer.ExecuteNonQuery();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;byte&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;[] pointer = (&lt;span style="color:blue"&gt;byte&lt;/span&gt;[])pointerOutParam.Value;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;int&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; length = (&lt;span style="color:blue"&gt;int&lt;/span&gt;)lengthOutParam.Value;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Run the query.&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Set up the READTEXT command to read the BLOB by passing the following&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// parameters: @Pointer &amp;#8211; pointer to blob, @Offset &amp;#8211; number of bytes to&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// skip before starting the read, @Size &amp;#8211; number of bytes to read.&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlCommand&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;"&gt; cmdReadBinary = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;SqlCommand&lt;/span&gt;(&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#A31515"&gt;"READTEXT Categories.Picture @Pointer @Offset @Size HOLDLOCK"&lt;/span&gt;, conn);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Set up the parameters for the command.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlParameter&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; paraPtr = cmdReadBinary.Parameters.Add(&lt;span style="color:#A31515"&gt;"@Pointer"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Binary, 16);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;paraPtr.Value = pointer;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlParameter&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; paraOffset = &lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="margin-left:21.0pt;text-align:left; text-indent:21.0pt;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family: Consolas;"&gt;cmdReadBinary.Parameters.Add(&lt;span style="color:#A31515"&gt;"@Offset"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Binary, 16);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;int&lt;/span&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt; offset = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;paraOffset.Value = offset;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlParameter&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; SizeParam = cmdReadBinary.Parameters.Add(&lt;span style="color:#A31515"&gt;"@Size"&lt;/span&gt;, &lt;span style="color:#2B91AF"&gt;SqlDbType&lt;/span&gt;.Int);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;SizeParam.Value = BUFFER_LENGTH;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;SqlDataReader&lt;/span&gt;&lt;span style="font-size: 9.0pt;font-family:Consolas;"&gt; dr;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:#2B91AF;"&gt;Byte&lt;/span&gt;&lt;span style="font-size:9.0pt; font-family:Consolas;"&gt;[] Buffer = &lt;span style="color:blue"&gt;new&lt;/span&gt; &lt;span style="color:#2B91AF"&gt;Byte&lt;/span&gt;[BUFFER_LENGTH];&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:green;"&gt;// Read buffer full of data.&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;color:blue;"&gt;do&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;{&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;// Add code for calculating the buffer size - may be less than&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:green"&gt;// BUFFER&amp;nbsp; LENGTH&amp;nbsp; for the last block.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dr = cmdReadBinary.ExecuteReader(&lt;span style="color:#2B91AF"&gt;CommandBehavior&lt;/span&gt;.SingleResult);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dr.Read();&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; PictureCol = 0;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue"&gt;int&lt;/span&gt; readCount = (&lt;span style="color:blue"&gt;int&lt;/span&gt;)dr.GetBytes(PictureCol, 0, Buffer, 0, BUFFER_LENGTH);&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offset += readCount;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; paraOffset.Value = offset;&lt;/span&gt;&lt;/p&gt;  &lt;p align="left" style="text-align:left;line-height:12.0pt;text-autospace:none"&gt;&lt;span style="font-size:9.0pt;font-family:Consolas;"&gt;} &lt;span style="color:blue"&gt;while&lt;/span&gt; (offset &amp;lt; length);&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;span style="font-family:宋体;"&gt;其它：关于断点续传什么的&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;span style="font-size:10.5pt;font-family:宋体;Times New Roman&amp;quot;;"&gt;基于流的技术，做断点续传是没有问题的，这里不再讨论。&lt;/span&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2252509.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/11/17/BLOB_Stream.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/27/SQL_Antipatterns_Introduce.html</id><title type="text">SQL Antipatterns内容介绍</title><summary type="text">SQL已经用了这么多年了，还有必要再看一本SQL的书吗？SQL反模式可能是一本，因为它讨论的正是这么多年来，SQL被大家广泛误用的地方。由于这本书的作者语言比较文艺装X范，很多章节题目一眼看上去不知道在说什么，所以我把各章的问题简单的列出来，供大家参考：Chapter2  一个属性有多个值，怎么存？（用逗号分隔的id字符串？No）Chapter3  树型结构怎么设计？（邻接表，就是每行存上父id，并不是最好的办法）……</summary><published>2011-10-27T05:03:00Z</published><updated>2011-10-27T05:03:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/27/SQL_Antipatterns_Introduce.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/27/SQL_Antipatterns_Introduce.html"/><content type="html">&lt;img src="http://images.cnblogs.com/cnblogs_com/think/bksqla_xlargecover.jpg" width="190" height="228" alt="" align="left" /&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;副标题:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;SQL反模式&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;原作名:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;SQL Antipatterns: Avoiding the Pitfalls of Database Programming&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; "&gt;作者&lt;/span&gt;:&amp;nbsp;&lt;a href="http://book.douban.com/search/Bill%20Karwin" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;Bill Karwin&lt;/a&gt;&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; "&gt;译者&lt;/span&gt;:&amp;nbsp;&lt;a href="http://book.douban.com/search/%E8%B0%AD%E6%8C%AF%E6%9E%97" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;谭振林&lt;/a&gt;&amp;nbsp;/&amp;nbsp;&lt;a href="http://book.douban.com/search/Push%20Chen" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;Push Chen&lt;/a&gt;&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;出版社:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;人民邮电出版社&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;出版年:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;2011-9&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;页数:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;253&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;定价:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;59.00元&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;装帧:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;平装&lt;/span&gt;&lt;br style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; " /&gt;&lt;span style="font: normal normal normal 12px/normal Arial, Helvetica, sans-serif; line-height: 18px; color: #666666; font-family: Arial, Helvetica, sans-serif; font-size: 12px; background-color: #ffffff; "&gt;ISBN:&lt;/span&gt;&lt;span style="color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #ffffff; "&gt;&amp;nbsp;9787115261274&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;SQL已经用了这么多年了，还有必要再看一本SQL的书吗？SQL反模式可能是一本，因为它讨论的正是这么多年来，SQL被大家广泛误用的地方。&lt;/p&gt;&lt;p&gt;由于这本书的作者语言比较文艺装X范，很多章节题目一眼看上去不知道在说什么，所以我把各章的问题简单的列出来，供大家参考：&lt;/p&gt;&lt;div&gt;&lt;p&gt;Chapter2&amp;nbsp; &amp;nbsp; 一个属性有多个值，怎么存？（用逗号分隔的id字符串？No）&lt;/p&gt;&lt;p&gt;Chapter3&amp;nbsp; &amp;nbsp; 树型结构怎么设计？（邻接表，就是每行存上父id，并不是最好的办法）&lt;/p&gt;&lt;p&gt;Chapter4&amp;nbsp; &amp;nbsp; 主键怎么怎么设计？&lt;/p&gt;&lt;p&gt;Chapter5&amp;nbsp; &amp;nbsp; 合理使用约束。&lt;/p&gt;&lt;p&gt;Chapter6&amp;nbsp; &amp;nbsp; SQL如何应对类继承等情况，如何应对属求不存定性？（弄一张大表，列涵盖一类对象的所有属性？另建一张表，存成Key-Value？）&lt;br /&gt;Chapter7&amp;nbsp; &amp;nbsp; 关联多态，一个表可能关联A，也可能关联B，该怎么处理？&lt;/p&gt;&lt;p&gt;Chapter8&amp;nbsp; &amp;nbsp; 一个属性好像需要多个列才好存，比如一个人的联系电话，Tag，怎么办？&lt;/p&gt;&lt;p&gt;Chapter9&amp;nbsp; &amp;nbsp; 如何支持表的平滑扩展并保障查询性能？（拆表？拆列？）&lt;/p&gt;&lt;p&gt;Chapter10&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如何准确的处理小数？（float会有精度问题，你懂的）&lt;/p&gt;&lt;p&gt;Chapter11&amp;nbsp; &amp;nbsp; 如何限定列的取值范围？（Check？MySQL的ENUM？）&lt;/p&gt;&lt;p&gt;Chapter12&amp;nbsp; &amp;nbsp; 如何处理大数据对象？（图片、音视频）&lt;/p&gt;&lt;p&gt;Chapter13&amp;nbsp; &amp;nbsp; 如何合理地使用索引？（MENTOR大法）&lt;/p&gt;&lt;p&gt;Chapter14&amp;nbsp; &amp;nbsp; 针对可NULL的数据进行查询时，需要注意什么？&lt;/p&gt;&lt;p&gt;Chapter15&amp;nbsp; &amp;nbsp; 使用Group By获得最大值、最小值、平均值等后，如何准确的获得它对应的其它列的值？&lt;/p&gt;&lt;p&gt;Chapter16&amp;nbsp; &amp;nbsp; 如何高效的获得随机数？&lt;/p&gt;&lt;p&gt;Chapter17&amp;nbsp; &amp;nbsp; 支持全文搜索&lt;/p&gt;&lt;p&gt;Chapter18&amp;nbsp; &amp;nbsp; 避免使用冗长的查询语句&lt;/p&gt;&lt;p&gt;Chapter19&amp;nbsp; &amp;nbsp; 使用通配符查询所有列会有哪些问题&lt;/p&gt;&lt;p&gt;Chapter20&amp;nbsp; &amp;nbsp; 正确的处理密码的保存&lt;/p&gt;&lt;p&gt;Chapter21&amp;nbsp; &amp;nbsp; 如何避免被注入？&lt;/p&gt;&lt;p&gt;Chapter22&amp;nbsp; &amp;nbsp; 正确对待不连续的主键&lt;/p&gt;&lt;p&gt;Chapter23&amp;nbsp; &amp;nbsp; 如何有效的查找Bug&lt;/p&gt;&lt;p&gt;Chapter24&amp;nbsp; &amp;nbsp; 数据库的一些最佳实践&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 'sans serif', tahoma, verdana, helvetica; font-size: 12px; line-height: 18px; "&gt;Chapter26&amp;nbsp; &amp;nbsp; MVC相关&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;在哪儿买这本书? &amp;nbsp;&amp;#183;&amp;nbsp;&amp;#183;&amp;nbsp;&amp;#183;&amp;nbsp;&amp;#183;&amp;nbsp;&amp;#183;&amp;nbsp;&amp;#183;&lt;/strong&gt;&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; color: #111111; font-family: Arial, Helvetica, sans-serif; font-size: 12px; line-height: 19px; background-color: #f4f4ec; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 0px; padding-bottom: 4px; padding-left: 0px; border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: #dddddd; overflow-x: hidden; overflow-y: hidden; border-top-style: none; border-right-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; "&gt;&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=joyo&amp;amp;url=http%3A//www.amazon.cn/mn/detailApp/ref%3Dasc_df_B005N4L03E350382/%3Fasin%3DB005N4L03E%26tag%3Ddouban-23%26creative%3D2384%26creativeASIN%3DB005N4L03E%26linkCode%3Dasn" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;卓越亚马逊&lt;/a&gt;&amp;nbsp;(&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=joyo&amp;amp;url=http%3A//www.amazon.cn/mn/detailApp/ref%3Dasc_df_B005N4L03E350382/%3Fasin%3DB005N4L03E%26tag%3Ddouban-23%26creative%3D2384%26creativeASIN%3DB005N4L03E%26linkCode%3Dasn" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;RMB 43.70&lt;/a&gt;)&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 0px; padding-bottom: 4px; padding-left: 0px; border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: #dddddd; overflow-x: hidden; overflow-y: hidden; border-top-style: none; border-right-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; "&gt;&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=dangdang&amp;amp;url=http%3A//p.yiqifa.com/c%3Fs%3Dc9f2bee7%26w%3D55880%26c%3D247%26i%3D159%26l%3D0%26e%3D2194100_s6800774%26t%3Dhttp%3A//product.dangdang.com/product.aspx%3Fproduct_id%3D22506160" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;当当网&lt;/a&gt;&amp;nbsp;(&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=dangdang&amp;amp;url=http%3A//p.yiqifa.com/c%3Fs%3Dc9f2bee7%26w%3D55880%26c%3D247%26i%3D159%26l%3D0%26e%3D2194100_s6800774%26t%3Dhttp%3A//product.dangdang.com/product.aspx%3Fproduct_id%3D22506160" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;RMB 44.20&lt;/a&gt;)&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 0px; padding-bottom: 4px; padding-left: 0px; border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: #dddddd; overflow-x: hidden; overflow-y: hidden; border-top-style: none; border-right-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; "&gt;&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=360buy&amp;amp;url=http%3A//click.union.360buy.com/JdClick/%3FunionId%3D15055%26t%3D4%26to%3Dhttp%3A//www.360buy.com/product/10839721.html" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;京东网上商城&lt;/a&gt;&amp;nbsp;(&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=360buy&amp;amp;url=http%3A//click.union.360buy.com/JdClick/%3FunionId%3D15055%26t%3D4%26to%3Dhttp%3A//www.360buy.com/product/10839721.html" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;RMB 43.70&lt;/a&gt;)&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 0px; padding-bottom: 4px; padding-left: 0px; border-bottom-width: 1px; border-bottom-style: none; border-bottom-color: #dddddd; overflow-x: hidden; overflow-y: hidden; border-top-style: none; border-right-style: none; border-left-style: none; border-width: initial; border-color: initial; border-image: initial; "&gt;&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=beifa&amp;amp;url=http%3A//book.beifabook.com/Product/BookDetail.aspx%3FPlucode%3D711526127%26extra%3D2194100_s6800774" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;北发图书网&lt;/a&gt;&amp;nbsp;(&lt;a target="_blank" href="http://www.douban.com/link2?type=buy&amp;amp;subject=6800774&amp;amp;vendor=beifa&amp;amp;url=http%3A//book.beifabook.com/Product/BookDetail.aspx%3FPlucode%3D711526127%26extra%3D2194100_s6800774" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;RMB 41.90&lt;/a&gt;)&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 4px; padding-right: 0px; padding-bottom: 4px; padding-left: 0px; border-bottom-width: 1px; border-bottom-style: dashed; border-bottom-color: #dddddd; overflow-x: hidden; overflow-y: hidden; "&gt;&lt;a id="bi-report-btn" href="http://book.douban.com/subject/6800774/#" style="cursor: pointer; color: #336699; text-decoration: none; float: right; margin-top: 2px; margin-right: 10px; margin-bottom: 2px; margin-left: 10px; line-height: 14px; "&gt;价格报错&lt;/a&gt;&lt;a href="http://book.douban.com/subject/6800774/buylinks" style="cursor: pointer; color: #336699; text-decoration: none; "&gt;查看6家网店价格 (41.90元起)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2226387.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/27/SQL_Antipatterns_Introduce.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-CAPI.html</id><title type="text">Chromium Embedded Framework中文文档 (使用C API)</title><summary type="text">简介CEF的C API是由libcef DLL暴露的基于C的接口，cef_capi.h 头文件中定义的接口是由CEF translator tool自动生成的C++ API镜像。引用计数理解引用计数可能是使用CEF C API最困难的部分了，CEF使用引用计数概念类似于COM的概念，这里有一些基本的规则可以帮助你减少使用引用计数时的困难。1. 当将一个结构传给它自己的成员函数时，不要进行引用计数的加、减操作:struct-&gt;call_func(struct,...); // no reference counting change on 'struct'2. 在将结构作为</summary><published>2011-10-05T16:08:00Z</published><updated>2011-10-05T16:08:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-CAPI.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-CAPI.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF的C API是由libcef DLL暴露的基于C的接口，cef_capi.h 头文件中定义的接口是由CEF translator tool自动生成的C++ API镜像。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Reference_Counting" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;引用计数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;理解引用计数可能是使用CEF C API最困难的部分了，CEF使用引用计数概念类似于COM的概念，这里有一些基本的规则可以帮助你减少使用引用计数时的困难。&lt;/p&gt;&lt;p&gt;1. 当将一个结构传给它自己的成员函数时，不要进行引用计数的加、减操作:&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;struct&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;-&amp;gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;call_func&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;(&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;struct&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,...);&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// no reference counting change on 'struct'&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;2. 在将结构作为参数传给其它结构前，增加引用计数:&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// Should have already added a reference to 'some_other_struct'&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;struct&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;-&amp;gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;call_func&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;(...,&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;some_other_struct&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,...);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;3. 在你使用完从别处以参数传过来的结构后，减少它的引用计数:&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;void&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; my_func&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;(...,&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;some_other_struct&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,...)&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;{&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// remove a reference from 'some_other_struct' after you're done using it&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;4. 在传入一个处理程序前，增加它的引用，比如，cef_create_browser()，当API不再需要使用某一处理程序时，会移除它的引用。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. 使用原子的引用计数实现，因为add_ref和release可能会跨线程调用,WinAPI InterlockedIncrement() 和 InterlockedDecrement() 函数可用于此目的。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6. 如果引用计算变成0，处理程序应该在已赋值给结构的releae()回调函数中删除自己:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="color: #880000; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;// custom data structure that extends cef_handler_t&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;pre style="font-size: 12px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #ffffff; line-height: normal; "&gt;&lt;span style="color: #000088; "&gt;typedef&lt;/span&gt; &lt;span style="color: #000088; "&gt;struct&lt;/span&gt; _my_handler_t &lt;span style="color: #666600; "&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; cef_handler_t handler&lt;span style="color: #666600; "&gt;;&lt;/span&gt;&amp;nbsp;&lt;span style="color: #880000; "&gt;// cef_handler_t member comes first&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #880000; "&gt;// custom members here, including the reference count variable&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;}&lt;/span&gt; my_handler_t&lt;span style="color: #666600; "&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #880000; "&gt;// allocate the custom data structure (already initialized to zero)&lt;/span&gt;&lt;br /&gt;my_handler_t&lt;span style="color: #666600; "&gt;*&lt;/span&gt; my_handler &lt;span style="color: #666600; "&gt;=&lt;/span&gt; &lt;span style="color: #666600; "&gt;(&lt;/span&gt;my_handler_t&lt;span style="color: #666600; "&gt;*)&lt;/span&gt;calloc&lt;span style="color: #666600; "&gt;(&lt;/span&gt;&lt;span style="color: #006666; "&gt;1&lt;/span&gt;&lt;span style="color: #666600; "&gt;,&lt;/span&gt; &lt;span style="color: #000088; "&gt;sizeof&lt;/span&gt;&lt;span style="color: #666600; "&gt;(&lt;/span&gt;my_handler_t&lt;span style="color: #666600; "&gt;));&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #880000; "&gt;// set the size member of cef_base_t appropriately&lt;/span&gt;&lt;br /&gt;my_handler&lt;span style="color: #666600; "&gt;-&amp;gt;&lt;/span&gt;handler&lt;span style="color: #666600; "&gt;.&lt;/span&gt;&lt;span style="color: #000088; "&gt;base&lt;/span&gt;&lt;span style="color: #666600; "&gt;.&lt;/span&gt;size &lt;span style="color: #666600; "&gt;=&lt;/span&gt; &lt;span style="color: #000088; "&gt;sizeof&lt;/span&gt;&lt;span style="color: #666600; "&gt;(&lt;/span&gt;cef_handler_t&lt;span style="color: #666600; "&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #880000; "&gt;// assign the release callback function (and the other callback functions)&lt;/span&gt;&lt;br /&gt;my_handler&lt;span style="color: #666600; "&gt;-&amp;gt;&lt;/span&gt;handler&lt;span style="color: #666600; "&gt;.&lt;/span&gt;&lt;span style="color: #000088; "&gt;base&lt;/span&gt; &lt;span style="color: #666600; "&gt;=&lt;/span&gt; my_release&lt;span style="color: #666600; "&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #880000; "&gt;// release callback function implementation for my_handler_t&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000088; "&gt;int&lt;/span&gt; CEF_CALLBACK my_release&lt;span style="color: #666600; "&gt;(&lt;/span&gt;&lt;span style="color: #000088; "&gt;struct&lt;/span&gt; _cef_base_t&lt;span style="color: #666600; "&gt;*&lt;/span&gt; &lt;span style="color: #000088; "&gt;base&lt;/span&gt;&lt;span style="color: #666600; "&gt;)&lt;/span&gt; &lt;span style="color: #666600; "&gt;{&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #880000; "&gt;// this cast works because cef_base_t is the first member of&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #880000; "&gt;// cef_handler_t and cef_handler_t is the first member of my_handler_t&lt;/span&gt;&lt;br /&gt;&amp;nbsp; my_handler_t&lt;span style="color: #666600; "&gt;*&lt;/span&gt; my_handler &lt;span style="color: #666600; "&gt;=&lt;/span&gt; &lt;span style="color: #666600; "&gt;(&lt;/span&gt;my_handler_t&lt;span style="color: #666600; "&gt;*)&lt;/span&gt;&lt;span style="color: #000088; "&gt;base&lt;/span&gt;&lt;span style="color: #666600; "&gt;;&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp; &lt;span style="color: #880000; "&gt;// decrement the reference count (stored as a custom member of my_handler_t)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #880000; "&gt;// free the my_handler_t structure when the reference count reaches zero&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &lt;span style="color: #000088; "&gt;if&lt;/span&gt;&lt;span style="color: #666600; "&gt;(&lt;/span&gt;reference_count_is_zero&lt;span style="color: #666600; "&gt;)&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; free&lt;span style="color: #666600; "&gt;(&lt;/span&gt;my_handler&lt;span style="color: #666600; "&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;pre style="font-size: 12px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #ffffff; line-height: normal; "&gt;&lt;div&gt;&lt;p&gt;7. 清除代码添加给结构的所有附加的引用（比如，在处理程序实现中保持cef_broswer_t指针的引用），最终的释放引用的机会是cef_handler_t::handle_before_window_closed()。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;8. 如果没有任何的crash产生，在shutdown时也会命中DebugObjCt断言，那么就说明你正确的处理了引用计数。&lt;/p&gt;&lt;/div&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199695.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-CAPI.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-Link-Different-Runtime-Libraries.html</id><title type="text">Chromium Embedded Framework中文文档 （如何链接不同的运行时）</title><summary type="text">简介Visual Studio支持不同的运行时库，不同的库通过标记 /MD, /MT 和 /LD来区分，默认情况下，CEF使用/MT标记，Chromium也是如此，不过有时可能有些应用需要不同的运行时库。详情有两种将CEF link到你的应用程序的方式。静态链接(不使用 CEF DLL)如果你期望使用静态链接方式，那么所有的Chromium和CEF项目都必须使用相同的运行时标记，如果你的应用已使用/MT标记，那么可通过以下步骤静态编译CEF:按项目页上的描述设置Chromium和CEF所需的环境，并编译之。将你的应用链接到libcef_static.lib文件。如果你的应用程序没有使用/MT标</summary><published>2011-10-05T16:07:00Z</published><updated>2011-10-05T16:07:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Link-Different-Runtime-Libraries.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Link-Different-Runtime-Libraries.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Visual Studio支持不同的运行时库，不同的库通过标记 /MD, /MT 和 /LD来区分，默认情况下，CEF使用/MT标记，Chromium也是如此，不过有时可能有些应用需要不同的运行时库。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Details" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;详情&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;有两种将CEF link到你的应用程序的方式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Static_Linking_(without_a_CEF_DLL)" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;静态链接(不使用 CEF DLL)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你期望使用静态链接方式，那么所有的Chromium和CEF项目都必须使用相同的运行时标记，如果你的应用已使用/MT标记，那么可通过以下步骤静态编译CEF:&lt;/p&gt;&lt;ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;按项目页上的描述设置Chromium和CEF所需的环境，并编译之。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;将你的应用链接到libcef_static.lib文件。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;如果你的应用程序没有使用/MT标记，那么你就很不走运了，Chromium的一些重要部分不使用/MT是不能编译的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Dynamic_Linking_(with_a_CEF_DLL)" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;动态链接 (使用CEF DLL)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果你喜欢使用动态链接方式链接CEF，那过程就要快一些，CEF在下载页提供了编译发行版本，包括了所有你需要link的CEF内容，前提是你的应用使用/MT标记。否则，你需要用与你的应用相同的标记重新编译libcef_dll_wrapper项目，与静态链接不同的是，你不需要重新编译CEF或者Chromium。&lt;/p&gt;&lt;ol style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 25px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;从下载页下载CEF编译发行版本。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; "&gt;按项目页上的描述设置Chromium和CEF所需的环境，但不需要编译之。&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;在CEF目录下创建Debug\lib目录，并将压缩包中的lib\Debug\libcef.lib file拷过来，如果你的CEF目录是"c:\Chromium\src\cef" 那么lib文件应该在 "c:\Chromium\src\cef\Debug\lib\libcef.lib".&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;在Visual Studio中打开cef.sln，将libcef_dll_wrapper 的标记改成和你的应用一样。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: decimal; "&gt;右键点击libcef_dll_wrapper 项目，并选择"Project Only -&amp;gt; Build Only libcef_dll_wrapper" 选项.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;如果在第4步中正确的设置了标记，那么上述步骤的结果应该是在Debug\lib目录中创建了libcef_dll_wrapper静态库，能成功link你的应用程序。将debug改成release重复上述步骤，创建一个release版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Additional_Information" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;附加信息&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Microsoft 运行时标记的更多信息，可在:&amp;nbsp;&lt;a href="http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx&lt;/a&gt;找到&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199694.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Link-Different-Runtime-Libraries.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-SVN.html</id><title type="text">Chromium Embedded Framework中文文档 (SVN属性)</title><summary type="text">Subversion properties在CEF开发中，应当如下将Subversion配置文件配置成自动设置新文件的属性，不要使用svn:eol-style=native因为它会使得不同平台间的文件比较变得十分痛苦# CEF-specific config file to put at ~/.subversion/config or %USERPROFILE%\AppData\Roaming\Subversion\config# Originally copied from http://src.chromium.org/viewvc/chrome/trunk/tools/buildbot/</summary><published>2011-10-05T16:05:00Z</published><updated>2011-10-05T16:05:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-SVN.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-SVN.html"/><content type="html">&lt;div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;Subversion properties&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在CEF开发中，应当如下将Subversion配置文件配置成自动设置新文件的属性，不要使用svn:eol-style=native因为它会使得不同平台间的文件比较变得十分痛苦&lt;/p&gt;&lt;div&gt;&lt;pre style="font-size: 12px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; background-color: #ffffff; line-height: normal; "&gt;&lt;span style="color: #880000; "&gt;# CEF-specific config file to put at ~/.subversion/config or %USERPROFILE%\AppData\Roaming\Subversion\config&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #880000; "&gt;# Originally copied from http://src.chromium.org/viewvc/chrome/trunk/tools/buildbot/slave/config?revision=46073&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;[&lt;/span&gt;miscellany&lt;span style="color: #666600; "&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #000088; "&gt;global&lt;/span&gt;&lt;span style="color: #666600; "&gt;-&lt;/span&gt;ignores &lt;span style="color: #666600; "&gt;=&lt;/span&gt; &lt;span style="color: #666600; "&gt;*.&lt;/span&gt;pyc &lt;span style="color: #666600; "&gt;*.&lt;/span&gt;user &lt;span style="color: #666600; "&gt;*.&lt;/span&gt;suo &lt;span style="color: #666600; "&gt;*.&lt;/span&gt;bak &lt;span style="color: #666600; "&gt;*~&lt;/span&gt; &lt;span style="color: #880000; "&gt;#*# *.ncb *.o *.lo *.la .*~ .#* .DS_Store .*.swp *.scons *.mk *.Makefile *.sln *.vcproj *.rules SConstruct *.xcodeproj&lt;/span&gt;&lt;br /&gt;enable&lt;span style="color: #666600; "&gt;-&lt;/span&gt;&lt;span style="color: #000088; "&gt;auto&lt;/span&gt;&lt;span style="color: #666600; "&gt;-&lt;/span&gt;props &lt;span style="color: #666600; "&gt;=&lt;/span&gt; yes&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;[&lt;/span&gt;&lt;span style="color: #000088; "&gt;auto&lt;/span&gt;&lt;span style="color: #666600; "&gt;-&lt;/span&gt;props&lt;span style="color: #666600; "&gt;]&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;c &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;h &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;cc &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;cpp &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;&lt;span style="color: #000088; "&gt;def&lt;/span&gt; &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;obsolete &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;m &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;mm &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;idl &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;html &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;htm &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;xml &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;js &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;css &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;mock&lt;span style="color: #666600; "&gt;-&lt;/span&gt;http&lt;span style="color: #666600; "&gt;-&lt;/span&gt;headers &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;afm &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;txt &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;gyp &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;gypi &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;grd &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;xtb &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;py &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;pl &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;pm &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;sh &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;span style="color: #666600; "&gt;;&lt;/span&gt;svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;executable&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;make &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #660066; "&gt;Makefile&lt;/span&gt; &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;bat &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;CRLF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;rc &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;CRLF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;txt &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;patch &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;eol&lt;span style="color: #666600; "&gt;-&lt;/span&gt;style&lt;span style="color: #666600; "&gt;=&lt;/span&gt;LF&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;png &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;mime&lt;span style="color: #666600; "&gt;-&lt;/span&gt;type&lt;span style="color: #666600; "&gt;=&lt;/span&gt;image&lt;span style="color: #666600; "&gt;/&lt;/span&gt;png&lt;br /&gt;&lt;span style="color: #666600; "&gt;*.&lt;/span&gt;jpg &lt;span style="color: #666600; "&gt;=&lt;/span&gt; svn&lt;span style="color: #666600; "&gt;:&lt;/span&gt;mime&lt;span style="color: #666600; "&gt;-&lt;/span&gt;type&lt;span style="color: #666600; "&gt;=&lt;/span&gt;image&lt;span style="color: #666600; "&gt;/&lt;/span&gt;jpeg&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;*.&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;pdf &lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;=&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt; svn&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;:&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;mime&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;-&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;type&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;=&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;application&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; line-height: normal; white-space: pre; background-color: #ffffff; "&gt;pdf&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199692.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-SVN.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-Update-Chromium.html</id><title type="text">Chromium Embedded Framework中文文档 (升级到最新的Chrome)</title><summary type="text">Chromium的开发者非常用功地把新功能新特性尽可能快的引入新版本，因此，造成像CEF这样的依赖于它的项目也必须经常更新版本，更新可能会很复杂，必须非常小心的处理，以避免导入新的bug和破坏。以下是将CEF使用的Chromium版本更新到新版的处理步骤。1. 更新到最新版的“绿”Chromium版本，查看Chromium build waterfall，选择最新的所有windows编译与测试都是绿色的版本.2. 创建一个新老Chromium版本的对比svn diff -r oldrev:newrev &gt; diff_oldrev-newrev.txt以下文件的变化需要被评估:chrome</summary><published>2011-10-05T16:03:00Z</published><updated>2011-10-05T16:03:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Update-Chromium.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Update-Chromium.html"/><content type="html">&lt;div&gt;&lt;p&gt;Chromium的开发者非常用功地把新功能新特性尽可能快的引入新版本，因此，造成像CEF这样的依赖于它的项目也必须经常更新版本，更新可能会很复杂，必须非常小心的处理，以避免导入新的bug和破坏。以下是将CEF使用的Chromium版本更新到新版的处理步骤。&lt;/p&gt;&lt;p&gt;1. 更新到最新版的&amp;#8220;绿&amp;#8221;Chromium版本，查看&lt;a href="http://build.chromium.org/buildbot/waterfall/console" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Chromium build waterfall&lt;/a&gt;，选择最新的所有windows编译与测试都是绿色的版本.&lt;/p&gt;&lt;p&gt;2. 创建一个新老Chromium版本的对比&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;svn diff &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;-&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;r oldrev&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;:&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;newrev &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; diff_oldrev&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;-&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;newrev&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;.&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;txt&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;以下文件的变化需要被评估:&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;chrome&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;browser&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;net&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;sqlite_persistent_cookie_store&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;.*&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; content&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;browser&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;/&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;in_process_webkit&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;/* third_party/WebKit/Source/WebKit/chromium/public/* webkit/glue/webpreferences.h (watch for new WebKit features that may need to be enabled) webkit/support/simple_database_system.* webkit/tools/test_shell/*&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;这可以用于帮助你识别哪些地方发生了变更，CEF开始于一个定制的test_shell版本，有很多文件仍存在有1对1的关系。&lt;/p&gt;&lt;p&gt;3. 对CEF做出必要的修改，编译（必须先清除）并修复所有失败。&lt;/p&gt;&lt;p&gt;4. 运行大量的CEF测试，确保一切正常，这一步有望在将来实现自动化。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;查看&amp;nbsp;&lt;a href="http://build.chromium.org/buildbot/waterfall.fyi/waterfall?branch=&amp;amp;builder=Chromium+Embedded" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;CEF Build Bot&lt;/a&gt;&amp;nbsp;日志，可以提供更新后查找错误的感觉。大多数情况下（90%），失败是因为重命名、少量的代码重构或者项目名称、位置变化造成的,剩下的10%需要CEF做出重大调整，通常是因为不断重构成webkit/api的webkit/glue造成的。如果你发现Chromium的变更影响了CEF需要的功能，而你又不能在合理的修改CEF的情况下绕开这个问题，那么你应当与Chromium团队协作处理这个问题。&lt;/p&gt;&lt;p&gt;1. 标识哪一版本影响了CEF的功能，并确认你已经理解了为什么要做出这些修改。&lt;/p&gt;&lt;p&gt;2. 向chromium-dev邮件列表提交一条信息，说明变更为什么影响了CEF，并且提供其它信息、建义修复CEF和Chromium。&lt;/p&gt;&lt;p&gt;3. 之后，Chromium开发者创建了条代码重审事件，并且提供修复与对应的开发者。&lt;/p&gt;&lt;p&gt;4. 更进代码评审。&lt;/p&gt;&lt;p&gt;CEF也提供被丁的功能，但是这应该作为最后的手段，或者你认为代码重审需要很长时间的权宜之计，最好的方式应该是由Chromium接收你的变更请求到Chromium Trunk中。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199690.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Update-Chromium.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html</id><title type="text">Chromium Embedded Framework中文文档之(基本使用)</title><summary type="text">一般用法使用CEF便捷的创建一个全功能的内建浏览器如下所示:// Define an instance of our CefHandler implementation. Various methods in the MyHandler // instance will be called to customize browser behavior. CefRefPtr&lt;CefHandler&gt; handler(new MyHandler()); // Provide information about the parent window, client rectangle, etc</summary><published>2011-10-05T16:02:00Z</published><updated>2011-10-05T16:02:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;一般用法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用CEF便捷的创建一个全功能的内建浏览器如下所示:&lt;/p&gt;&lt;pre style="line-height: 22px; text-align: left; background-color: #eeeeee; font-size: 12px; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// Define an instance of our CefHandler implementation. Various methods in the MyHandler&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// instance will be called to customize browser behavior. &lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;CefRefPtr&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;&amp;lt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;CefHandler&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;&amp;gt;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; handler&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;(&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;new&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;MyHandler&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;());&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// Provide information about the parent window, client rectangle, etc.&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;CefWindowInfo&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; info &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;=&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;{...};&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// Create the new browser window object, which eventually results in a call to&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;// MyHandler::HandleAfterCreated().&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;CefBrowser&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;::&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #660066; "&gt;CreateBrowser&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;(&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;info&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #000088; "&gt;false&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; handler&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; L&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #008800; "&gt;"http://www.google.com"&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;);&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;在tests目录下有一个客户端程序的示例，叫cefclient。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="File_Structure" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;文件结构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF资料库结构如下：&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; font-family: arial, sans-serif; font-size: 13px; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;include&lt;/strong&gt;&amp;nbsp;-- 包括用于CEF客户端程序的include文件。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;libcef&lt;/strong&gt;&amp;nbsp;-- libcef实现。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;libcef_dll&lt;/strong&gt;&amp;nbsp;-- libcef C API 和 DLL 实现.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;tests&lt;/strong&gt;&amp;nbsp;-- 测试程序.&lt;/li&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;cefclient&lt;/strong&gt;&amp;nbsp;-- CEF客户端应用程序示例。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;unittests&lt;/strong&gt;&amp;nbsp;-- CEF接口单元测试。&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Browser_Notifications" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;浏览器通知&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;浏览器通知是通过注册的委托接口由浏览器发到客户端程序的通知， CefHandler是最主要的委托接口, CefJSHandler则用于实现自定义的Javascript对象。&lt;/p&gt;&lt;p&gt;CefHandler支持以下接口：&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; font-family: arial, sans-serif; font-size: 13px; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;窗口创建之前 (HandleBeforeCreated)，客户端可用之取消与定制浏览器窗口创建过程。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;窗口创建之后(HandleAfterCreated). 可用于创建自定义的CefJSHandler对象。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;地址栏更新(HandleAddressChange). 将地址栏更改为指定的字符串，通知发生于导航提交后与页面加载前。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;标题更新(HandleTitleChange). 将标题更改为指定的字符串，发生在页面加载中。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;浏览前(HandleBeforeBrowse). 可用于取消导航，该事件的信息包括URL，Post数据，请求头.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;开始加载(HandleLoadStart).&amp;nbsp;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;加载结束 (HandleLoadEnd).&amp;nbsp;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;加载错误(HandleLoadError). 加载过程中遇到错误，应用程序可提供自定义的错误页面.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;资源加载前 (HandleBeforeResourceLoad). 应用程序可提供替代的数据源 (比如内存中的缓存)或者取消加载.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;显示菜单前(HandleBeforeMenu). 可用于取消上下文菜单显示或定制菜单,默认情况下，浏览器根据上下文显示基本的菜单.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;获取菜单标签(HandleGetMenuLabel).在默认菜单显示前，每个菜单项调用一次，可用于将英文默认内容改为其它语言.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;菜单动作(HandleMenuAction). 用户从默认上下文菜单选择了一个选项，可用自己的方式来处理动作。&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;打印选项(HandlePrintOptions). 打印设置对话框显示前调用，可用于定制页面大小、方向与边距等.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;打印页眉页脚 (HandlePrintHeaderFooter). 在页面视图输出到打印上下文，但是页面结束前，可在预定义的6个位置（上左、上中、上右、下左，下中，下右）插入自定义的页眉、页脚字符串。该事件附带的信息包括当前URL、标题、页码、总页数、打印上下文、页边距与DPI拉伸比.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;JavaScript警告 (HandleJSAlert). 应用程序可自定义Javascript Alert窗口.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;JavaScrip确认 (HandleJSConfirm).&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; "&gt;应用程序可自定义Javascript Comfirm窗口&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;JavaScrip提示 (HandleJSPrompt).&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; "&gt;应用程序可自定义Javascript Prompt窗口&lt;/span&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;JavaScript Window 对象绑定 (HandleJSBinding). 应用程序将用户定义的方法和变量附加到frame的window对象上&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Window关闭前 (HandleBeforeWindowClose). 窗口关闭前&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;获得焦点(HandleTakeFocus). 浏览器组件失去焦点前调用&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;设置焦点(HandleSetFocus). 浏览器组件请求焦点前调用&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;键盘事件(HandleKeyEvent). 浏览器组件接收到键盘事件时&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;提示 (HandleTooltip). 用于修改tooltip文字&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;控制台消息 (HandleConsoleMessage). 用于显示控制台消息.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;查询结果(HandleFindResult).用于自定义查找结果显示处理&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;CefV8Handler支持以下通知：&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; font-family: arial, sans-serif; font-size: 13px; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;执行事件(Execute). 应用程序执行指定的函数，该事件提供所有的Javascript参数，而且应用程序能指定返回值&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Browser_Events" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;浏览器事件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;浏览器事件由客户端应用程序通过CefBrowser和CefFrame的函数发送给浏览器:&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; font-family: arial, sans-serif; font-size: 13px; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;后退、前进、重新加载与停止加载，用于控制浏览器导航.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;撤消、重做、剪切、复制、粘贴、删除、全选，用于控制目标区域内容.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;打印. 打印目标框架.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;查看源代码. 将目标框架的HTML源代码保存到临时文件，并用默认的文本查看程序打开之&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;加载URL. 在指定框架中加载指定URL&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;载入字符串. 根据一个假URL在指定框架中加载某个字符串&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;加载流. 根据一个假URL，在指定框架中加载二进制数据&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;加载请求. 在指定框架中加载请求(URL, method, request data 与 headers) .&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;执行脚本. 在目标框架中执行任意Javascript命令&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Embedded_NPAPI_Plugins" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;内嵌 NPAPI 插件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF支持创建Netscape-style内嵌插件，使用相同 NPAPI的内嵌插件和标准的DLL插件行为相同,但是，相对于使用独立的DLL，内嵌插件由容器应用程序创建，并通过调用CefRegisterPlugin()注册到系统，如果要直接使用这一功能，需要include cef_nplugin.h .&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Extensions" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;JavaScript扩展&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF支持可以和原生应用程序代码交互的Javascript扩展，参见cef.h的CefRegisterExtension() 函数和cefclient示例程序的"JavaScript Extension Handler" 以及 "UI App Example" 测试 .&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Custom_Schemes" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;自定义Schemes&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF支持注册与处理自定义scheme,类似于myscheme://mydomain。参见cef.h中的CefRegisterScheme()函数与示例应用程序cefclient中的 "Scheme Handler" 测试.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Framework_Implementation_Overview" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;框架实现概览&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF所有的类以Cef为前缀.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Framework_Setup_and_Tear_Down" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;框架准备与拆卸&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;UI消息循环由框架创建的一个单独线程处理,客户端程序应负责通过分别调用CefInitialize()和CefShutdown() 来为每个进程准备与关闭这一线程。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Reference_Counting" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;引用计数&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;所有实现了CefBase接口的框架类与对象指针都由CefRefPtr智能指针实现来处理，通过调用AddRef()和Release()自动处理引用计数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Platform_Neutrality" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;平台无关&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF框架被设计成平台无关，需要当前我们仅支持windows平台，但是我们计划将来支持其它平台。为了尽可能减少双平台支持带来的麻烦，框架定义了一系列实现无关的接口与类型定义包装跨平台的行为。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Thread_Safety" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;线程安全&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;框架的所有接口实现必须是跨线程访问安全的，CefThreadSafeBase 模版提供原子的AddRef() 和 Release() 实现，还提供Lock() 和 Unlock()方法以同步方式访问代码块.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Framework_Interfaces" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;框架接口&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;框架定义了如下接口：&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; font-family: arial, sans-serif; font-size: 13px; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefBrowser&lt;/strong&gt;&amp;nbsp;是主要的浏览器host类，通过它的静态方法CefBrowser::CreateBrowser()方法创建新浏览器窗口.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefFrame&lt;/strong&gt;&amp;nbsp;表示浏览器窗口里的一个框架（frame），每个浏览器窗口都有一个顶级的主框架，可通过CefBrowser::GetMainFrame()方法访问之.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefHandler&lt;/strong&gt;&amp;nbsp;是传给CefBrowser::CreateBrowser()方法的最主要委托接口.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefRequest&lt;/strong&gt;&amp;nbsp;表示请求数据，比如url, method, post data 和 headers.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefPostData&lt;/strong&gt;&amp;nbsp;和&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefPostDataElement&lt;/strong&gt;&amp;nbsp;表示可能是请求一部分的post数据.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefSchemeHandlerFactory&lt;/strong&gt;&amp;nbsp;和&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefSchemeHandler&lt;/strong&gt;&amp;nbsp;用于处理像myscheme://mydomain这样的自定义scheme.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefStreamReader&lt;/strong&gt;,&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefStreamWriter&lt;/strong&gt;,&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefReadHandler&lt;/strong&gt;&amp;nbsp;和&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefWriteHandler&lt;/strong&gt;&amp;nbsp;读写数据的简单的接口.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefV8Handler&lt;/strong&gt;&amp;nbsp;和&amp;nbsp;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;CefV8Value&lt;/strong&gt;&amp;nbsp;用于创建和访问Javascript对象.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199688.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-genericUsage.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html</id><title type="text">Chromium Embedded Framework 中文文档（简介）</title><summary type="text">简介Chromium Embedded Framework (CEF)是由 Marshall Greenblatt 在2008年创办的开源项目，致力于基于Google Chromium项目开发一个Web控件。 CEF目前已支持多种编程语言和操作系统，能方便地集成到现有或者新的应用程序中，设计上，它追求高性能的同时，也追求易于使用，它的基本框架通过原生库提供C和C++的编程接口，这些接口将宿主程序与Chromium与WebKit的实现细节隔离，能让浏览器与应用程序无缝集成，并支持自定义插件、协议、Javascript对象与扩展。宿主程序还能根据需要控制资源加载、页面跳转、上下文菜单、打印等等。这</summary><published>2011-10-05T16:00:00Z</published><updated>2011-10-05T16:00:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;strong&gt;简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;span style="font-family: 'microsoft yahei', 黑体, Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; "&gt;Chromium Embedded Framework (CEF)是由 Marshall Greenblatt 在2008年创办的开源项目，致力于基于Google Chromium项目开发一个Web控件。 CEF目前已支持多种编程语言和操作系统，能方便地集成到现有或者新的应用程序中，设计上，它追求高性能的同时，也追求易于使用，它的基本框架通过原生库提供C和C++的编程接口，这些接口将宿主程序与Chromium与WebKit的实现细节隔离，能让浏览器与应用程序无缝集成，并支持自定义插件、协议、Javascript对象与扩展。宿主程序还能根据需要控制资源加载、页面跳转、上下文菜单、打印等等。这些好处都是在支持Google Chrome同等效率与HTML5技术可用的基本上提供的。&lt;/span&gt;&lt;br style="font-family: 'microsoft yahei', 黑体, Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; " /&gt;&lt;span style="font-family: 'microsoft yahei', 黑体, Tahoma, Arial, Helvetica, STHeiti; font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; "&gt;大量的个人与组织为CEF的开发提供了时间与资源上的贡献，但是我们需要社区更多的投入，来支持CEF核心项目与扩展地对其它语言与框架提供支持的项目（参见扩展项目一节）。如果你有兴趣为CEF提供时间与金钱上的支持，请参见&lt;/span&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://www.magpcss.org/ceforum/donate.php" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;CEF Donations&lt;/a&gt;&amp;nbsp;页面。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Binary_Distributions" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;编译发行版本&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;编译发行版本，包涵所有构建基于CEF应用程序所需的文件，在下载章节提供下载，该版本是可以独立使用的，不依赖于CEF或者Chromium的源代码。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Source_Distributions" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;源代码发行版本&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF项目是Chromium项目（http://chromium.org）的扩展项目，因此，要编译CEF源代码需要先下载Chromium源代码（下载方式见http://dev.chromium.org/developers/how-tos/get-the-code）并且根据你所选的系统与编译指示安装所有依赖的项目；然后，将CEF的文件放在Chromium的src目录顶层，跟base/chrome/thrid-party这些目录一起，比方说如果你的Chromium安装目录是C:\svn\Chromium\src那么CEF的文件应该在C:\svn\Chromium\src\cef。&lt;a href="http://code.google.com/p/chromiumembedded/source/browse/trunk/CHROMIUM_BUILD_COMPATIBILITY.txt" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; font-size: 13px; "&gt;CHROMIUM_BUILD_COMPATIBILITY.txt&lt;/a&gt;&amp;nbsp;文件有CEF与Chromium版本兼容性的说明信息,如果要将Chromium升级某一版本，使用&lt;br /&gt;gclient sync --revision src@#### --force，&lt;/p&gt;&lt;p&gt;此外，DEPS文件将确保其它目录以合适的形式下载。在大多数系统下，编译需要提供至少4GB内存。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Building_on_Windows" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;在Windows下编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;跟随你的Visual Studio版本的&amp;nbsp;&lt;a href="http://dev.chromium.org/developers/how-tos/build-instructions-windows" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Windows build instructions&lt;/a&gt;&amp;nbsp;，运行CEF根目录下的cef_create_projects.bat脚本，根据&lt;a href="http://code.google.com/p/gyp/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; font-size: 13px; "&gt;GYP&lt;/a&gt;的配置生成Visual Stodio项目文件。如果你机器上同时安装了VS2005和VS2008，那么在运行cef_create_projects脚本前，可通过设置GYP_MSVS_VERSION 环境变量为"2005" 或"2008"来指定版本。&lt;/p&gt;&lt;p&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, sans-serif; font-size: 18px; "&gt;通过将gclient工具集成到CEF，可以自动在Chromium源代码更新后下载CEF源代码更新和运行&lt;/span&gt;&lt;tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; "&gt;cef_create_projects。编辑&lt;/tt&gt;&lt;tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; "&gt;位于Chromium src目录父目录&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, sans-serif; line-height: 15px; "&gt;(上例中是"C:\svn\Chromium")&amp;nbsp;&lt;/span&gt;的.gclient&lt;/tt&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, sans-serif; font-size: 18px; "&gt;文件，在已有的solutions数组中添加如下的行:&lt;/span&gt;&lt;/p&gt;&lt;pre style="font-size: 14px; line-height: 22px; text-align: left; background-color: #ffffff; padding-top: 0.5em; padding-right: 0.5em; padding-bottom: 0.5em; padding-left: 0.5em; overflow-x: auto; overflow-y: auto; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; max-width: 70em; "&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;solutions &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;=&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;[&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;{&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;#Existing definitions here...&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;},&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;# BEGIN NEW LINES&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;{&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #008800; "&gt;"name"&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;:&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #008800; "&gt;"src/cef"&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #008800; "&gt;"url"&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;:&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #008800; "&gt;"http://chromiumembedded.googlecode.com/svn/trunk"&lt;/span&gt;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;,&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;},&lt;/span&gt;&amp;nbsp;&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #880000; "&gt;#END NEW LINES&lt;/span&gt; &lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; color: #666600; "&gt;]&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Building_on_Mac_OS_X" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;Mac OS X下编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;目前仅支持Mac OS X 10.6 (Snow Leopard) 和10.7 (Lion) ，编译结果可运行于10.5, 10.6 and 10.7。根据&lt;a href="http://code.google.com/p/chromium/wiki/MacBuildInstructions" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Mac build instructions&lt;/a&gt;正确的配置系统，如果是10.7和Xcode 4，请遵循&lt;a href="http://code.google.com/p/chromium/wiki/Xcode4Tips" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Xcode4Tips&lt;/a&gt;中额外的编译指示。&lt;/p&gt;&lt;p&gt;运行CEF根目录下的&lt;tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; "&gt;cef_create_projects.sh可根据&lt;/tt&gt;&lt;a href="http://code.google.com/p/gyp/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;GYP&lt;/a&gt;的配置生成XCode项目文件。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Building_on_Linux" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;Linux下的编译&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;开发中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="External_Projects" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;扩展项目&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF基础框架支持C和C++语言，感谢其它维护者的努力工作，CEF可以支持更多的编程语言与框架。这些扩展项目并非由CEF团队维护，所以如果你有任何问题，请直接联系各项目的维护者。&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;.Net -&amp;nbsp;&lt;a href="https://github.com/chillitom/CefSharp" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;https://github.com/chillitom/CefSharp&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;.Net -&amp;nbsp;&lt;a href="https://bitbucket.org/fddima/cefglue" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;https://bitbucket.org/fddima/cefglue&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Delphi -&amp;nbsp;&lt;a href="http://code.google.com/p/delphichromiumembedded/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;http://code.google.com/p/delphichromiumembedded/&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Java -&amp;nbsp;&lt;a href="http://code.google.com/p/javachromiumembedded/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;http://code.google.com/p/javachromiumembedded/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果你维护着一个不在这个列表中的项目，请到&lt;a href="http://www.magpcss.org/ceforum/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;CEF Forum&lt;/a&gt;发贴或者直接联系Marshall。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Support" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;支持&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://code.google.com/p/chromiumembedded/wiki/GeneralUsage" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;General Usage Wiki page&lt;/a&gt;提供使用CEF的概览，CEF支持与相关讨论在&lt;a href="http://www.magpcss.org/ceforum/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;CEF Forum&lt;/a&gt;中进行。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Helping_Out" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;帮助&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;CEF仍有大量工作需要开展，如果你想为CEF做出贡献请查看Open状态的Issue，或者在CEF的源代码中搜索TODO，我们还需要人为所有支持的功能编写测试用例。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="Notable_Changes" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: rgb(162, 177, 195); cursor: pointer; "&gt;&lt;/a&gt;重大更改&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;此处并未列出所有的版本,完整版本列表请查看&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/list" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Changes list&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;9月 23, 2011:&lt;/strong&gt;&amp;nbsp;编译版本293，添加对VS2010的支持，并包含以下改进与Bug修复:&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;将char16_t更名为char16修复VS2010因char16_t变成内建类型造成的编译错误 (&lt;a title="CEF build broken with Visual Studio 2010" href="http://code.google.com/p/chromiumembedded/issues/detail?id=243" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #243&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;自定义Sheme支持异步处理响应 (&lt;a title="Support asynchronous continuation of custom scheme handler read requests" href="http://code.google.com/p/chromiumembedded/issues/detail?id=269" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #269&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;添加CefDragHandler支持拖放数据与取消拖放请求的体验(&lt;a title="Provide a way to examine the drop contents in JavaScript events" href="http://code.google.com/p/chromiumembedded/issues/detail?id=297" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #297&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;添加CefBrowser::HasDocument()方法，用于测试document是否已完成加载 (&lt;a title="Blank popups should be closed automatically" href="http://code.google.com/p/chromiumembedded/issues/detail?id=307" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #307&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;CefBase类添加虚析构函数(&lt;a title="Add virtual destructors for CEF base classes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=321" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #321&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;修复使用V8造成的内存泄漏 (&lt;a title="Potential memory leak in V8 extension" href="http://code.google.com/p/chromiumembedded/issues/detail?id=323" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #323&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;提升 V8 字符串转换效率 (&lt;a title="Potential memory leak in V8 extension" href="http://code.google.com/p/chromiumembedded/issues/detail?id=323" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #323&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;增加V8存取器的异常返回能力(&lt;a title="CefV8Accessor doesn't allow return exception" href="http://code.google.com/p/chromiumembedded/issues/detail?id=327" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #327&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;如果V8处理程序没有返回值，返回undefined取代返回null(&lt;a title="CefV8Handler default return value is null, instead of undefined" href="http://code.google.com/p/chromiumembedded/issues/detail?id=329" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #329&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;由于实现bug的问题，默认情况下关闭合成加速(&lt;a title="Angle GL implementation does not composite text correctly with accelerated compositing enabled" href="http://code.google.com/p/chromiumembedded/issues/detail?id=334" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #334&lt;/a&gt;,&amp;nbsp;&lt;a title="Desktop GL implementation crashes using WebGL with accelerated compositing enabled" href="http://code.google.com/p/chromiumembedded/issues/detail?id=335" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #335&lt;/a&gt;,&amp;nbsp;&lt;a title="Command buffer GL implementation does not support accelerated compositing" href="http://code.google.com/p/chromiumembedded/issues/detail?id=337" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #337&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;August 9, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 275 contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;关闭触摸屏的支持，以使Google Map API功能正常(&lt;a title="Mouse zoom/pan not working with Google Map API" href="http://code.google.com/p/chromiumembedded/issues/detail?id=134" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #134&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;修复一个执行大量同步加载请求时死循环的bug (&lt;a title="deadlock with SyncRequestProxy" href="http://code.google.com/p/chromiumembedded/issues/detail?id=192" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #192&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;修复OnResourceResponse拼写错误(&lt;a title="Typo: CefRequestHandler.OnResourceReponse" href="http://code.google.com/p/chromiumembedded/issues/detail?id=270" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #270&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;修复一个在某些情况下关机时会造成Crash的线程问题(&lt;a title="CEF haphazardly crashes at CefShutdown" href="http://code.google.com/p/chromiumembedded/issues/detail?id=277" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #277&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;增加accelerated_video_enabled, accelerated_drawing_enabled 和accelerated_plugins_enabled浏览器设置(&lt;a title="enable additional WebPreferences accelerated features" href="http://code.google.com/p/chromiumembedded/issues/detail?id=278" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #278&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;添加在某些windows机器上加速内容需要的d3dx9_43.dll和d3dcompiler_43.dll文件(&lt;a title="Include d3dx9_43.dll and d3dcompiler_43.dll with binary release" href="http://code.google.com/p/chromiumembedded/issues/detail?id=280" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #280&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;清理模态窗口回调实现 (&lt;a title="Clean up the usage/meaning of UIT_GetMainWndHandle()" href="http://code.google.com/p/chromiumembedded/issues/detail?id=281" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #281&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;关闭语音输入，避免在Google搜索页面点话筒图标会crash的问题。 (&lt;a title="crash when clicking microphone icon for x-webkit-speech" href="http://code.google.com/p/chromiumembedded/issues/detail?id=282" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #282&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;当将&lt;span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-size: 13px; "&gt;drag_drop_disabled 设为true时禁用&lt;/span&gt;HTML5 drag(&lt;a title="drag_drop_disabled setting should disable dragging from browser to another window" href="http://code.google.com/p/chromiumembedded/issues/detail?id=284" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #284&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;修复在取消popup窗口时crash的问题(&lt;a title="ShowDevTools causes AV if OnBeforePopup cancel popup creation" href="http://code.google.com/p/chromiumembedded/issues/detail?id=285" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #285&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;June 14, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 259 significantly revamps the CEF API and contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;使用angle库支持GL (&lt;a title="enable WebGL once it works with Angle and accelerated compositing" href="http://code.google.com/p/chromiumembedded/issues/detail?id=136" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #136&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;CefV8Value 添加Date类型支持(&lt;a title="Add support for int64 &amp;amp; Date V8 value type" href="http://code.google.com/p/chromiumembedded/issues/detail?id=190" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #190&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a workaround for the SyncRequestProxy deadlock problem (&lt;a title="deadlock with SyncRequestProxy" href="http://code.google.com/p/chromiumembedded/issues/detail?id=192" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #192&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Replace CefHandler with a new CefClient interface and separate handler interfaces (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for virtual inheritance to allow multiple CefBase parented interfaces to be implemented in the same class (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Replace CefThreadSafeBase with IMPLEMENT macros to support virtual inheritance and to only provide locking implementations when needed (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Move the CefBrowserSettings parameter from CefInitialize to CreateBrowser (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a new cef_build.h header that provides platform-specific and OS defines (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Introduce the use of OVERRIDE to generate compiler errors on Windows if a child virtual method declaration doesn't match the parent declaration (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Move CEF header files that should not be directly included by the client to the "include/internal" folder (&lt;a title="Break CefHandler into separate Handler interfaces" href="http://code.google.com/p/chromiumembedded/issues/detail?id=218" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #218&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for navigator.onLine and online/offline window events (&lt;a title="Proposed patch adds support for navigator.onLine and online/offline window events" href="http://code.google.com/p/chromiumembedded/issues/detail?id=234" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #234&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Use NDEBUG instead of&amp;nbsp;&lt;tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; "&gt;_&lt;/tt&gt;DEBUG because&amp;nbsp;&lt;tt style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace; font-size: 12px; max-width: 66em; "&gt;_&lt;/tt&gt;DEBUG is not defined on Mac (&lt;a title="Patch to fix Mac OSX compile" href="http://code.google.com/p/chromiumembedded/issues/detail?id=240" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #240&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add OnResourceReponse and CefContentFilter for viewing and filtering response content (&lt;a title="Filtering response content" href="http://code.google.com/p/chromiumembedded/issues/detail?id=241" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #241&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for setting response header values (&lt;a title="Allow cross-origin scripting for custom standard schemes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=246" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #246&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Break CefRegisterScheme into separate CefRegisterCustomScheme and CefRegisterSchemeHandlerFactory functions (&lt;a title="Allow cross-origin scripting for custom standard schemes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=246" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #246&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Allow registration of handlers for built-in schemes (&lt;a title="Allow cross-origin scripting for custom standard schemes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=246" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #246&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Supply scheme and request information to CefSchemeHandlerFactory::Create (&lt;a title="Allow cross-origin scripting for custom standard schemes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=246" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #246&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add CrossOriginWhitelist functions for bypassing the same-origin policy with both built-in and custom standard schemes (&lt;a title="Allow cross-origin scripting for custom standard schemes" href="http://code.google.com/p/chromiumembedded/issues/detail?id=246" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #246&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for modal dialogs (&lt;a title="Add support for window.startModalDialog" href="http://code.google.com/p/chromiumembedded/issues/detail?id=250" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #250&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for IME-aware applications (&lt;a title="Enhance CEF to support IME-aware applications" href="http://code.google.com/p/chromiumembedded/issues/detail?id=254" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #254&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Restore keyboard focus on window activation (&lt;a title="cefclient app - focus not always restored when window is activated" href="http://code.google.com/p/chromiumembedded/issues/detail?id=256" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #256&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix bug when dragging to a window before mouse events have been detected (&lt;a title="Drag and drop accesses a NULL WebViewHost if client hasn't received mouse events yet" href="http://code.google.com/p/chromiumembedded/issues/detail?id=262" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #262&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;May 10, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 231 contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add cookie get/set support (&lt;a title="Added cookie support" href="http://code.google.com/p/chromiumembedded/issues/detail?id=88" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #88&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Allow custom schemes to cause redirects (&lt;a title="Allow custom schemes to cause redirects" href="http://code.google.com/p/chromiumembedded/issues/detail?id=98" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #98&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Set the libcef.dll version number to the build revision number (&lt;a title="Increment libcef.dll version info when source is changed" href="http://code.google.com/p/chromiumembedded/issues/detail?id=108" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #108&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for returning an HTTP status code from HandleBeforeResourceLoad and custom scheme handlers via the CefResponse class (&lt;a title="make custom schemes and HandleBeforeResourceLoad return HTTP status codes for jQuery XHR" href="http://code.google.com/p/chromiumembedded/issues/detail?id=202" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #202&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for V8 accessors and entering a V8 context asynchronously (&lt;a title="Can't create V8 Objects, Arrays, and Functions outside a V8 context" href="http://code.google.com/p/chromiumembedded/issues/detail?id=203" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #203&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Don't load URLs twice for popup windows (&lt;a title="HandleDownloadResponse being called multiple times on JS window.open call" href="http://code.google.com/p/chromiumembedded/issues/detail?id=215" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #215&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Make modal popup windows behave the same as non-modal popup windows (&lt;a title="Popup windows doesn't react on clicks" href="http://code.google.com/p/chromiumembedded/issues/detail?id=216" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #216&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Force Flash and Silverlight plugins to use windowless mode when rendering off-screen (&lt;a title="Youtube videos don't render in the Off-Screen Rendering Example" href="http://code.google.com/p/chromiumembedded/issues/detail?id=214" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #214&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Don't download files that will be loaded by a plugin (&lt;a title="handleDownloadResponse called for files that are handled by plugins" href="http://code.google.com/p/chromiumembedded/issues/detail?id=227" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #227&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a CefDOMNode::IsSame() method for comparing CefDOMNode objects.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;March 25, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 212 contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add off-screen rendering support (&lt;a title="Add support for off-screen rendering" href="http://code.google.com/p/chromiumembedded/issues/detail?id=100" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #100&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add persistent storage support for cookie data (&lt;a title="Unable to persist cookies / user data" href="http://code.google.com/p/chromiumembedded/issues/detail?id=193" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #193&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Allow registration of non-standard schemes (&lt;a title="Custom schemes registered with CefRegisterScheme are treated as standard even when they aren't" href="http://code.google.com/p/chromiumembedded/issues/detail?id=195" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #195&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Improve the behavior of HandleAddressChange, HandleTitleChange, HandleLoadStart and HandleLoadEnd notifications (&lt;a title="AddressChange &amp;amp; TitleChange not called if window.location changed " href="http://code.google.com/p/chromiumembedded/issues/detail?id=200" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #200&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Respect the WS_VISIBLE flag when creating browser windows (&lt;a title="UIT_CreateBrowser doesn't respect window's visibility setting" href="http://code.google.com/p/chromiumembedded/issues/detail?id=201" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #201&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix a bug in CefWebURLRequest that could result in inappropriate calls to CefHandler methods (&lt;a title="The &amp;quot;CefWebUrlRequest for a &amp;quot;CefWebURLRequestClient&amp;quot; sometimes accidentally matches to a CefBrowser." href="http://code.google.com/p/chromiumembedded/issues/detail?id=204" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #204&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a history entry when navigating to anchors within the same page (&lt;a title="Navigating to an achor within the same page doesn't add a history entry" href="http://code.google.com/p/chromiumembedded/issues/detail?id=207" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #207&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a HandleNavStateChange notification for back/forward state changes (&lt;a title="cefclient back/forward buttons don't properly reflect history state when navigating with anchors" href="http://code.google.com/p/chromiumembedded/issues/detail?id=208" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #208&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix crash when using WebKit inspector break points (&lt;a title="Developer Tools - Breakpoints not working" href="http://code.google.com/p/chromiumembedded/issues/detail?id=210" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #210&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for retrieving values from DOM form elements using CefDOMNode::GetValue.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add the CefRunMessageLoop() function for efficient message loop processing in single-threaded message loop mode.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;February 28, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 195 contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add the CefWebURLRequest class that supports direct loading of URL resources from client applications (&lt;a title="Add URLFetcher support" href="http://code.google.com/p/chromiumembedded/issues/detail?id=51" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #51&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add CefDOM classes and the CefFrame::VisitDOM method that allow direct access to and modification of the DOM (&lt;a title="Add support for accessing the DOM" href="http://code.google.com/p/chromiumembedded/issues/detail?id=60" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #60&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for the HTML5 drag and drop API and support for dragging content to other applications or the desktop (&lt;a title="HTML5 drag &amp;amp; drop support" href="http://code.google.com/p/chromiumembedded/issues/detail?id=140" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #140&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a CefV8Context object and CefV8Value::ExecuteFunctionWithContext method to support asynchronous V8 callbacks (&lt;a title="Can't call ExecuteFuncton on a CefV8Value outside of an Execute callback." href="http://code.google.com/p/chromiumembedded/issues/detail?id=188" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #188&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;CefRegisterPlugin now only supports a single mime type per registration.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix a bug where URL and title change notifications were not being sent for CefFrame::LoadString.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;February 1, 2011:&lt;/strong&gt;&amp;nbsp;Binary release 181 will be the last binary release that includes libraries for VS2005. It contains the following enhancements and bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Improve thread safety by making some methods only callable on the UI thread (&lt;a title="Support thread-specific APIs" href="http://code.google.com/p/chromiumembedded/issues/detail?id=175" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #175&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add NewCefRunnableMethod and NewCefRunnableFunction templates (in cef_runnable.h) that simplify task posting (&lt;a title="Support thread-specific APIs" href="http://code.google.com/p/chromiumembedded/issues/detail?id=175" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #175&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a boolean argument to the HandleLoadStart and HandleLoadEnd events that will be true while the main content frame is loading (&lt;a title="Titles from iframes are shown as the window title when they should not" href="http://code.google.com/p/chromiumembedded/issues/detail?id=166" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #166&amp;nbsp;&lt;/a&gt;,&amp;nbsp;&lt;a title="isMainContent in handleLoadEnd seems inaccurate" href="http://code.google.com/p/chromiumembedded/issues/detail?id=183" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #183&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add an HTTP status code argument to the HandleLoadEnd event (&lt;a title="Add HTTP status code to handleLoadEnd" href="http://code.google.com/p/chromiumembedded/issues/detail?id=177" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #177&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Only call the HandleAddressChange and HandleTitleChange events for the main content frame load (&lt;a title="Titles from iframes are shown as the window title when they should not" href="http://code.google.com/p/chromiumembedded/issues/detail?id=166" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #166&amp;nbsp;&lt;/a&gt;)&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Pass the URL for new popup windows to the HandleBeforeCreated event (&lt;a title="HandleBeforeCreated didn't get URL to open" href="http://code.google.com/p/chromiumembedded/issues/detail?id=5" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #5&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add members to the CefSettings structure for specifying log file location and severity level (&lt;a title="Make debug logging configurable" href="http://code.google.com/p/chromiumembedded/issues/detail?id=172" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #172&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add single sign-on support (&lt;a title="Single sign-on (proposed patch)" href="http://code.google.com/p/chromiumembedded/issues/detail?id=148" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #148&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add zooming support (&lt;a title="Enhancement: Enable zoom support" href="http://code.google.com/p/chromiumembedded/issues/detail?id=116" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #116&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add developer tools support (&lt;a title="WebKit Inspector" href="http://code.google.com/p/chromiumembedded/issues/detail?id=127" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #127&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a HandleProtocolExecution event for handling unregistered protocols (&lt;a title="general solution for handling external protocols" href="http://code.google.com/p/chromiumembedded/issues/detail?id=155" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #155&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a HandleStatus event for status messages, mouse over URLs and keyboard focus URLs (&lt;a title="Add handlers for status, mouse over and tool tips" href="http://code.google.com/p/chromiumembedded/issues/detail?id=61" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #61&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for creating and parsing URLs via CefCreateURL and CefParseURL (&lt;a title="Add support for creating and parsing URLs" href="http://code.google.com/p/chromiumembedded/issues/detail?id=181" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #181&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix the problem with frame activation when displaying SELECT list popups (&lt;a title="Activating of SELECT list do application frame inactive" href="http://code.google.com/p/chromiumembedded/issues/detail?id=169" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #169&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Accelerated compositing and HTML5 video now work together (&lt;a title="HTML5 video does not display with accelerated compositing enabled" href="http://code.google.com/p/chromiumembedded/issues/detail?id=143" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #143&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;November 22, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=149" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 149&lt;/a&gt;&amp;nbsp;introduces a number of long-awaited features and a few important bug fixes.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The API now uses CefString and cef_string_t types instead of std::wstring and wchar_t. The new types support conversion between ASCII, UTF-8, UTF-16 and UTF-32 character formats and the default character type can be changed by recompiling CEF (&lt;a title="Introduce CefString for customization of CEF string type" href="http://code.google.com/p/chromiumembedded/issues/detail?id=146" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #146&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Allow customization of global and per-browser settings for everything from User-Agent and plugin search paths to specific WebKit features (&lt;a title="Ability to customize global and per-browser settings on global/browser initialization." href="http://code.google.com/p/chromiumembedded/issues/detail?id=145" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #145&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for accelerated compositing and fast WebGL (&lt;a title="enable WebGL once it works with Angle and accelerated compositing" href="http://code.google.com/p/chromiumembedded/issues/detail?id=136" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #136&amp;nbsp;&lt;/a&gt;). You will need to disable accelerated compositing to watch HTML5 video with this release (&lt;a title="HTML5 video does not display with accelerated compositing enabled" href="http://code.google.com/p/chromiumembedded/issues/detail?id=143" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #143&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Expose popup window feature information via the CefPopupFeatures argument passed to CefHandler::HandleBeforeCreated (&lt;a title="Enhancement for exposing popup features" href="http://code.google.com/p/chromiumembedded/issues/detail?id=135" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #135&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix a crash caused by Flash-related JavaScript (&lt;a title="CEF crashes on certain flash related javascript" href="http://code.google.com/p/chromiumembedded/issues/detail?id=115" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #115&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;November 15, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=137" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 137&lt;/a&gt;&amp;nbsp;provides the first working build of CEF for the Mac OS X platform (&lt;a title="MAC porting of CEF" href="http://code.google.com/p/chromiumembedded/issues/detail?id=68" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #68&lt;/a&gt;). There's still a lot of work required to bring it up to par with the Windows port. Missing features are indicated by "TODO(port)" comments in the source code. Help with fixing bugs and implementing missing features is welcome.&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;October 24, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=126" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 126&lt;/a&gt;&amp;nbsp;disables WebGL support due to performance problems with the default Chromium implementation. WebGL support will be re-enabled once a better-performing implementation is available (&lt;a title="enable WebGL once it works with Angle and accelerated compositing" href="http://code.google.com/p/chromiumembedded/issues/detail?id=136" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #136&amp;nbsp;&lt;/a&gt;).&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a CefHandler::HandleDownloadResponse() method for handling Content-Disposition initiated file downloads (&lt;a title="Download attachment" href="http://code.google.com/p/chromiumembedded/issues/detail?id=6" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #6&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add XML parsing support with CefXmlReader and CefXmlObject classes (&lt;a title="Expose libxml2 functions from libcef" href="http://code.google.com/p/chromiumembedded/issues/detail?id=28" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #28&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add Zip archive reading support with CefZipReader and CefZipArchive classes (&lt;a title="Expose compression routines" href="http://code.google.com/p/chromiumembedded/issues/detail?id=30" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;issue #30&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a new cef_wrapper.h header file that exposes helpful utility classes provided as part of the libcef_dll_wrapper target.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;October 15, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=116" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 116&lt;/a&gt;&amp;nbsp;causes CEF to ignore the "Automatically detect settings" option under LAN Settings in order to fix a problem with slow resource loading on Windows (&lt;a title="Slow load with auto-detection of proxy settings" href="http://code.google.com/p/chromiumembedded/issues/detail?id=81" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #81&amp;nbsp;&lt;/a&gt;). Manual configuration under LAN Settings is still respected.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add a CefBrowser::ReloadIgnoreCache() method and MENU_ID_NAV_RELOAD_NOCACHE menu support. (&lt;a title="Enhancement: Reload ignoring cache" href="http://code.google.com/p/chromiumembedded/issues/detail?id=118" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #118&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Add support for audio playback with HTML5 video (&lt;a title="No audio WebM video" href="http://code.google.com/p/chromiumembedded/issues/detail?id=121" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #121&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Fix back/forward navigation when the history contains pages that failed to load (&lt;a title="Navigating history when the history contains a page that does not load properly" href="http://code.google.com/p/chromiumembedded/issues/detail?id=125" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #125&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Change the CEF User-Agent product version to "Chrome/7.0.517.0"&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;August 31, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=100" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 100&lt;/a&gt;&amp;nbsp;re-introduces the CefHandler::HandleJSBinding method. The memory leaks that necessitated the elimination of this method have now been fixed (&lt;a title="Window object binding causes memory leaks" href="http://code.google.com/p/chromiumembedded/issues/detail?id=72" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #72&amp;nbsp;&lt;/a&gt;).&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The CefRequest argument to CefHandler::HandleBeforeResourceLoad can now be modified allowing the request to be changed on the fly (&lt;a title="Carry over modifications to request object in CefHandler::HandleBeforeResourceLoad()" href="http://code.google.com/p/chromiumembedded/issues/detail?id=41" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #41&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;A default tooltip implementation is now provided and tooltip text can be modified using CefHandler::HandleTooltip (&lt;a title="Add handlers for status, mouse over and tool tips" href="http://code.google.com/p/chromiumembedded/issues/detail?id=61" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #61&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Printing paper size, orientation and margins can now be changed using CefHandler::HandlePrintOptions (&lt;a title="Printing doesn't respect margins in print_settings.cc" href="http://code.google.com/p/chromiumembedded/issues/detail?id=112" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #112&amp;nbsp;&lt;/a&gt;).&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Find in page with result highlighting is now supported using CefBrowser::Find, CefBrowser::StopFinding and CefHandler::HandleFindResult.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The binary release of&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=100" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;revision 100&lt;/a&gt;&amp;nbsp;provides libraries for both Visual Studio 2005 and Visual Studio 2008. It can be downloaded from the project Downloads page.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;April 7, 2010:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=73" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 73&lt;/a&gt;&amp;nbsp;eliminates the CefHandler::HandleJSBinding method. This modification addresses memory leaks that many users have been reporting. For more information see&amp;nbsp;&lt;a title="Window object binding causes memory leaks" href="http://code.google.com/p/chromiumembedded/issues/detail?id=72" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: line-through; color: #0000cc; cursor: pointer; "&gt;&amp;nbsp;issue #72&amp;nbsp;&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;October 2, 2009:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=50" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 50&lt;/a&gt;&amp;nbsp;adds&amp;nbsp;&lt;a href="http://code.google.com/p/gyp/" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;GYP support&lt;/a&gt;&amp;nbsp;for generating the CEF project files. This makes it easy to build CEF with both VS2005 and VS2008. See the "Source Distributions" section above for additional details.&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;August 21, 2009:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=37" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 37&lt;/a&gt;&amp;nbsp;adds support for custom scheme handlers. Use the new CefRegisterScheme() function in combination with the CefSchemeHandlerFactory and CefSchemeHandler classes to create handlers for requests using custom schemes such as myscheme://mydomain.&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;July 24, 2009:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=32" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 32&lt;/a&gt;&amp;nbsp;helps to speed up the addition of new features and bug fixes to CEF. It adds the CEF Patch Application Tool and the "patch" project which together support automatic application of patches to the Chromium and WebKit source trees as part of the build process. See the README.txt file in the new patch directory for additional information.&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;July 8, 2009:&lt;/strong&gt;&amp;nbsp;CEF now has a dedicated build bot thanks to Nicolas Sylvain and Darin Fisher over at Google. The build bot synchronizes to each Chromium revision and then builds CEF, reporting on any compile errors that occur. Having a build bot for CEF will help the Chromium developers avoid accidentally breaking API features required by CEF, and help the CEF developers keep up with the frequently changing Chromium HEAD revision. You can view the build bot output at&amp;nbsp;&lt;a href="http://build.chromium.org/buildbot/waterfall.fyi/waterfall?branch=&amp;amp;builder=Chromium+Embedded" rel="nofollow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;http://build.chromium.org/buildbot/waterfall.fyi/waterfall?branch=&amp;amp;builder=Chromium+Embedded&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;June 20, 2009:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=30" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 30&lt;/a&gt;&amp;nbsp;adds the CEF Translator Tool which facilitates automatic generation of the C API header file (cef_capi.h) and CToCpp/CppToC wrapper classes. See the translator.README.txt file in the new tools directory for additional information. Introduction of this tool required minor changes to the CEF C++ and C APIs.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The C++ 'arguments' attribute of CefV8Handler::Execute() and CefV8Value::ExecuteFunction() now has the 'const' qualifier.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;C API global function names that were previously in the cef_create_classname() format are now in the cef_classname_create() format.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The C API cef_frame_t::get_frame_names() member function now has return type 'void' instead of 'size_t'.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The C API cef_frame_t::execute_javascript() member function has been renamed to cef_frame_t::execute_java_script().&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "&gt;May 27, 2009:&lt;/strong&gt;&amp;nbsp;&lt;a href="http://code.google.com/p/chromiumembedded/source/detail?r=26" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-decoration: none; color: #0000cc; cursor: pointer; "&gt;Revision 26&lt;/a&gt;&amp;nbsp;introduces two major changes to the CEF framework.&lt;/p&gt;&lt;ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 20px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 25px; list-style-type: none; line-height: 22px; text-align: left; background-color: #ffffff; max-width: 62em; font-family: arial, sans-serif; font-size: 13px; "&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;Frame-dependent functions such as loading content and executing JavaScript have been moved to a new CefFrame class. Use the new CefBrowser::Get*Frame() methods to retrieve the appropriate CefFrame instance. A CefFrame instance will now also be passed to CefHandler callback methods as appropriate.&lt;/li&gt;&lt;li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.3em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: disc; "&gt;The CEF JavaScript API now uses the V8 framework directly instead of creating NPObjects. JavaScript object hierarchies can be written in native C++ code and exported to the JavaScript user-space, and user-space object hierarchies can be accessed from native C++ code. Furthermore, support for the V8 extension framework has been added via the new CefRegisterExtension() function. The CefJSHandler and CefVariant classes have been removed in favor of new CefV8Handler and CefV8Value classes. To attach values to the JavaScript 'window' object you must now implement the CefHandler::HandleJSBinding() callback method instead of calling the (now removed) CefBrowser::AddJSHandler() method.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2199685.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/10/06/CEF-Introduce.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/think/archive/2011/06/27/2091689.html</id><title type="text">操盘之王 摘要</title><summary type="text">一、RSI(相对强弱指标) 表现为现在进行时 金叉买入，死叉卖出 20（熊市10~15）以下超卖，80（牛市85）以上超买 ，超卖区不必等金叉，超买区不必等死叉二、TOW（宝塔线） 中长期技术分析工具 三平顶：快速上升（30%以上）或盘整后出现连续三个以上处于同一水平线的实体很小的黑棒或上白下黑棒。 三平底：快速下跌（30%以上）或盘整后出现连续三个以上处于同一水平线的实体很小的白棒或上白下黑棒。 三平底翻红，牛市涨80%，平衡市涨30~60%，熊市10~20%，上涨基准为第三平底的值。 三平顶翻阴，牛市跌10~15%，平衡市10~20%，熊市15%~30% 平的标准，股价/8 * 0.03 </summary><published>2011-06-27T14:53:00Z</published><updated>2011-06-27T14:53:00Z</updated><author><name>Think</name><uri>http://www.cnblogs.com/think/</uri></author><link rel="alternate" href="http://www.cnblogs.com/think/archive/2011/06/27/2091689.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/think/archive/2011/06/27/2091689.html"/><content type="html">&lt;p&gt;一、RSI(相对强弱指标)&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;表现为现在进行时&lt;/li&gt;     &lt;li&gt;金叉买入，死叉卖出&lt;/li&gt;     &lt;li&gt;20（熊市10~15）以下超卖，80（牛市85）以上超买 ，超卖区不必等金叉，超买区不必等死叉&lt;/li&gt;&lt;/ol&gt;二、TOW（宝塔线）&lt;ol&gt;     &lt;li&gt;中长期技术分析工具&lt;/li&gt;     &lt;li&gt;三平顶：快速上升（30%以上）或盘整后出现连续三个以上处于同一水平线的实体很小的黑棒或上白下黑棒。&lt;/li&gt;     &lt;li&gt;三平底：快速下跌（30%以上）或盘整后出现连续三个以上处于同一水平线的实体很小的白棒或上白下黑棒。&lt;/li&gt;     &lt;li&gt;三平底翻红，牛市涨80%，平衡市涨30~60%，熊市10~20%，上涨基准为第三平底的值。&lt;/li&gt;     &lt;li&gt;三平顶翻阴，牛市跌10~15%，平衡市10~20%，熊市15%~30%&lt;/li&gt;     &lt;li&gt;平的标准，股价/8 * 0.03&lt;/li&gt;     &lt;li&gt;预判在6个月内完成&lt;/li&gt;&lt;/ol&gt;三、SSL（压力支撑线）&lt;ol&gt;     &lt;li&gt;遇到压力线先卖出，回档到支撑线再买入&lt;/li&gt;     &lt;li&gt;突破压力线站稳不再跌穿再补仓&lt;/li&gt;&lt;/ol&gt;四、成交量&lt;ol&gt;     &lt;li&gt;放量上涨、放下下跌&lt;/li&gt;     &lt;li&gt;缓慢上涨，突然发量上涨，继而量缩下跌，涨势将反转&lt;/li&gt;     &lt;li&gt;成交量圆弧底&lt;/li&gt;     &lt;li&gt;缩量意味着市场趋同，一般在走势中期，缩量下跌，出局，缩量上涨，买入&lt;/li&gt;     &lt;li&gt;放量，意味着转势&lt;/li&gt;     &lt;li&gt;堆量，低位堆，上涨，高位堆，下跌&lt;/li&gt;     &lt;li&gt;忽大忽小，常为妖庄出货&lt;/li&gt;     &lt;li&gt;在熊市和平衡市，冲击前期高点时，成交量至少为前期高点日成交量的60%以上。牛市为50%以上。&lt;/li&gt;     &lt;li&gt;突破前高时，成交量为前高的1.5倍以上，可能为庄家出货。&amp;nbsp;&lt;/li&gt;     &lt;li&gt;真突破（2个以上交易日站在前高之上）后，牛市涨20~25%，熊市为10%以上。&lt;/li&gt;&lt;/ol&gt;五、量比&lt;ol&gt;     &lt;li&gt;当日成交与5日成交的比例&lt;/li&gt;     &lt;li&gt;0.8（熊）~1.5（牛）为正常，1.5~2.5为温和放量&lt;/li&gt;     &lt;li&gt;2.5~5倍为明显放量，相应采取行动&lt;/li&gt;     &lt;li&gt;5~10倍为剧烈放量 ，&amp;#8220;钱&amp;#8221;途无量&lt;/li&gt;     &lt;li&gt;10倍以上，考虑反向操作&lt;/li&gt;     &lt;li&gt;0.5倍以上，创新高，是长庄股，且控盘度高，放量突破后缩量回调，买入，缩量涨停或跌停，后续空间无限&lt;/li&gt;     &lt;li&gt;开盘量比常不稳定，需观察&lt;/li&gt;     &lt;li&gt;实践：从量比排行中找量比小的，去掉冷门和下降，选择曾放量上涨，正在缩量回调的进行跟踪，往重新放量，并金叉时介入。&lt;/li&gt;     &lt;li&gt;操作：找出收盘量比0.9~1.25，上涨0.5~2%之间的股票，再配以其它指标，不会超过10只进行短线操作。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;六、KDJ随机指数&lt;/p&gt;&lt;ol&gt;     &lt;li&gt;KD为随机指标，K为快速指标，D为慢速指标，K金叉D买，死叉卖&lt;/li&gt;     &lt;li&gt;K在90以上为超买，D在80以上为超买。&lt;/li&gt;     &lt;li&gt;D在高档区走M为顶，在低档区走W为底。&lt;/li&gt;     &lt;li&gt;M和W的第二部出现时，若与价格走向背离，买卖可信度极高。&lt;/li&gt;     &lt;li&gt;J大于100或小于0是买卖的时机。&lt;/li&gt;     &lt;li&gt;结合布林线（上轨压力，中、下轨支撑），如果价格跌到布林线中轨、下轨以下，则无视KDJ指标发出的信号&lt;/li&gt;     &lt;li&gt;但如果布林线与KDJ都在下位，则说明中期、短期趋势相同，应采取行动。&lt;/li&gt;     &lt;li&gt;价格跌到布林线下轨，受到支撑回稳，KDJ也上升，至多只能抢一次反弹。&lt;/li&gt;     &lt;li&gt;以布林线做中期判断，以KDJ作为买卖信号。&lt;/li&gt;     &lt;li&gt;操作一：收周阳线，周线K、J勾头向上将要金叉，日线KDJ这一周发展金叉，金叉日收放量阳线&lt;/li&gt;     &lt;li&gt;操作二：周线KDJ金叉、日线KDJ已金叉&lt;/li&gt;     &lt;li&gt;操作三：周线KDJ金叉后股价回档收周阴线，然后重新放量上行。周K、D将要死叉，但没有真正死叉，K线重新张口上行。日线KDJ金叉。&lt;/li&gt;&lt;/ol&gt;七、20均线&lt;ol&gt;     &lt;li&gt;20均线是主力生命线&lt;/li&gt;     &lt;li&gt;20均线击穿3日不回，清仓&lt;/li&gt;     &lt;li&gt;牛市下跌4.5%，卖出，熊市下跌3%，卖出。&lt;/li&gt;&lt;/ol&gt;八、主力成本&lt;ol&gt;     &lt;li&gt;主力成本=(区间股票最低价+最高价)/2 或者 （突然放量那天的最低价+最高价）/2&lt;/li&gt;     &lt;li&gt;一般计算3个月&lt;/li&gt;&lt;/ol&gt;九、关注&lt;ol&gt;     &lt;li&gt;中润投资（二线地产+转矿产股）&lt;/li&gt;     &lt;li&gt;贵研铂业（小盘有色，铂金）&lt;/li&gt;     &lt;li&gt;海亮股份（矿产）&lt;/li&gt;     &lt;li&gt;西藏天路（投矿权）&lt;/li&gt;     &lt;li&gt;万里扬（机械制造）&lt;/li&gt;     &lt;li&gt;金杯电工（电缆电磁线）&lt;/li&gt;     &lt;li&gt;精达股份（电缆电磁线）&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/think/aggbug/2091689.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/think/archive/2011/06/27/2091689.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
