﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园首页</title><link>http://www.cnblogs.com/</link><description>技术改变世界</description><language>zh-cn</language><lastBuildDate>Fri, 03 Jul 2009 23:40:37 GMT</lastBuildDate><pubDate>Fri, 03 Jul 2009 23:40:37 GMT</pubDate><ttl>60</ttl><item><title>.Net Validator验证框架 [ .Net | Validator Framework | Attribute ]</title><link>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</link><dc:creator>农民伯伯</dc:creator><author>农民伯伯</author><pubDate>Fri, 03 Jul 2009 17:05:00 GMT</pubDate><guid>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</guid><comments>http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/over140//comments/commentRss/1515892.html</wfw:commentRss><description><![CDATA[<p>&nbsp;</p>
<p><strong style="font-size: 18pt; font-family: 楷体_GB2312;">前言</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 简单易用是.Net Validator验证框架努力的目标。基于Attribute验证器标识，丰富的验证返回类型，提供可扩展的验证器接口......&#8212;&#8212;又一个心愿和想法实质性的开始，开心ing&nbsp; :&nbsp; )<br />
</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt; font-family: 楷体_GB2312;">正文</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一、<strong>框架介绍</strong></p>
<p>　　　　本框架基于类属性(Property)的Attribute验证器标示，匹配属性(Property)名和Form、QueryString中的Key以及服务器端控件的ID名称，再根据验证器对数据进行校验。</p>
<p>　　　　验证器结构图</p>
<p>　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_1.PNG" width="1113" height="544" />&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二、<strong>框架使用例子</strong></p>
<p>　　　　2.1　　常规验证</p>
<p>　　　　　　2.1.1　　准备Model类User，注意引用命名空间<span style="color: red;">using Lasy.Validator;</span></p>
[代码]
<p>　　　　　　2.1.2　　控制台测试类 <br />
</p>
[代码]
<p>　　　　　　2.1.3　　结果显示截图</p>
<p>　　　　　　<img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_2.PNG" width="643" height="46" />&nbsp;</p>
<p>　　　　2.2　　表单验证</p>
<p>　　　　　　2.2.1　　User类</p>
[代码]
<p>&nbsp;　　　　　　2.2.2　　测试页面</p>
<p>　　　　　　　　login.aspx</p>
[代码]
<p>&nbsp;　　　　　　　&nbsp; 按钮代码<br />
</p>
[代码]
<p>　　　　　　2.2.3　　效果</p>
<p><img alt="" src="http://images.cnblogs.com/cnblogs_com/over140/2009/7/2009-7-3_3.PNG" width="429" height="199" />&nbsp;</p>
<p>　　三、<strong>使用建议</strong></p>
<p>　　　　3.1　　如果已经做了客户端校验，服务器端从Request中提取表单数据进行操作，可以直接使用Validator(Type type, bool checkAll, bool setDefaultValue)构造函数，然后从ValuesResult中取得已经校验完毕IDictionary&lt;string, object&gt;数据。</p>
<p>　　　　3.2　　NoValidator与ValuesResult在提取表单数据时配套使用。</p>
<p>　　　　3.3　　调试的时候注意类的Attribute是静态缓存的，需要清理或重新生成修改后的验证器标识才管用！ </p>
<p>&nbsp;</p>
<p>　　四、<strong>下载</strong></p>
<p>　　　　4.1　　源代码　　<a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Src.rar" title="Src">Src</a></p>
<p>　　　　4.2　　文&nbsp;&nbsp; 档　　<a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Doc.rar" title="Lasy.Validator.chm">Lasy.Validator.chm</a><a href="http://files.cnblogs.com/over140/2009/7/Lasy.Validator.Doc.rar" title="Lasy.Validator.chm"></a> </p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 18pt; font-family: 楷体_GB2312;">结束语</span></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然造轮子常常是一件吃力不讨好的事情，但是怀着我觉得好用，或者想做一个好用的东东出来，推荐给朋友试试看的心情就会好很多，何况还是有许多热心人提供宝贵的建议:&nbsp; )<br />
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<fieldset><legend>本博其他你可能感兴趣的文章</legend>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/05/15/1456605.html">NOD32升级账号更新器 [ C# | NOD32 | Eset ]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/05/01/1447380.html">用Visual Studio 2005/2008提取EXE文件中的资源[图片|htm|光标文件]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2009/04/02/1428114.html">新浪Flash下载器 [HttpWebRequest | 新浪视频]</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a class="titlelink" href="http://www.cnblogs.com/over140/archive/2008/10/31/1322786.html">笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new</a></p>
<p>&nbsp;</p>
</fieldset>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/over140/aggbug/1515892.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html" target="_blank">http://www.cnblogs.com/over140/archive/2009/07/04/1515892.html</a><br/>作者博客: <a href="http://www.cnblogs.com/over140/" target="_blank">http://www.cnblogs.com/over140/</a> <a href="http://www.cnblogs.com/over140/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a>]]></description></item><item><title>QQ抢车位外挂（续）</title><link>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</link><dc:creator>磊.NET</dc:creator><author>磊.NET</author><pubDate>Fri, 03 Jul 2009 17:02:00 GMT</pubDate><guid>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</guid><comments>http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/bnjbl//comments/commentRss/1516650.html</wfw:commentRss><description><![CDATA[<p>首先对不住大家了，因为最近在搬家，事情多，前几天宽带线路出了点问题，这篇文件在1周以后才发布出来。<br />首先，我想在这里说明一下，在这里，我希望大家能通过我写的文章，学到一些外挂开发思路性的东西，至于，怎么通过JS加密腾讯要求的密码，这些细节的东西，大家可以下来去研究。<br />我今天针对上次的文章，主要针对</p>
<p>登陆后怎么获取自己的信息，好友的信息，以及如何贴条</p>
<p>我看了大家对我上篇文章的评论，有些同志有比我发出来的抓包工具更好的抓包工具，大家可以根据需要，用自己习惯的，这里我还是用上次我提供下载地址的&nbsp;<a href="http://snet1.3800hk.com/200804/080408HttpAnal.rar">HTTPAnalyzer&nbsp;</a> 工具</p>
<p><br />好了，进入正题，上篇文章我已经讲了如何正确登陆QQ空间。<br />登陆之后，会有一个返回结果，</p>
<p>结果字符串中间会包括一个字符串</p>
<p>g_iLoginUin=XX的QQ号</p>
<p>如下图：</p>
<p><br /><img height="414" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/login22.JPG" width="1010" border="0" />。。。。。。。。。。。</p>
<p>OK，现在登陆成功了<br />我提供给大家一个类&nbsp;&nbsp; 关于Post提交或者Get操作的类<br />用这个类，大家可以 保存当前的Cookie<br />这样，在下次像提交请求时，服务器就会认定为，你是登陆状态了，呵呵<br />类如下：</p>
<p><a href="http://files.cnblogs.com/bnjbl/HttpHelper.rar">HttpHelper.cs&nbsp;</a></p>
<p>在使用这个类时，要注意保存自己的Cookie</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><img id="Code_Closed_Image_003109" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_003109').style.display='none'; document.getElementById('Code_Open_Image_003109').style.display='inline'; document.getElementById('Code_Open_Text_003109').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"><img id="Code_Open_Image_003109" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_003109').style.display='none'; getElementById('Code_Closed_Image_003109').style.display='inline'; getElementById('Code_Closed_Text_003109').style.display='inline';" height="16" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"><span class="cnblogs_code_Collapse" id="Code_Closed_Text_003109">Code</span><span id="Code_Open_Text_003109" style="display: none"><br /><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">1</span><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">切忌这个&nbsp;_cookieContainer一定要是全局的，因为如果登录成功，这个_cookieContainer保存了你的登录状态<br /></span><span style="color: #008080">2</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">并且腾讯对你登陆状态保留时间是有限的，一般1小时如操作就视为就会登陆超时</span><span style="color: #008000"><br /></span><span style="color: #008080">3</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">CookieContainer&nbsp;_cookieContainer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CookieContainer();<br /></span><span style="color: #008080">4</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">new出来一个http请求对象</span><span style="color: #008000"><br /></span><span style="color: #008080">5</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">HttpHelper&nbsp;_help&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HttpHelper(_cookieContainer);<br /></span><span style="color: #008080">6</span><span style="color: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">模拟执行一个Get操作，过执行Post操作，请自行参阅GetHtml的方法重载</span><span style="color: #008000"><br /></span><span style="color: #008080">7</span><span style="color: #008000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;responseStr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;_help.GetHtml(</span><span style="color: #800000">"</span><span style="color: #800000">你请求的URL</span><span style="color: #800000">"</span><span style="color: #000000">,&nbsp;_cookieContainer);</span></span></div>
<p>&nbsp;好了，现在我们来获取我们自己的车辆信息，哈哈，比较兴奋啊，成功越来越近了</p>
<p>我们还是用<a href="http://snet1.3800hk.com/200804/080408HttpAnal.rar">HTTPAnalyzer&nbsp;</a>工具进行抓包</p>
<p>我们首先先拿IE进入自己的空间-》抢车位之后，点击下抢车位上的</p>
<p>&nbsp;</p>
<p><img height="80" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/carlist.jpg" width="263" border="0" />&nbsp; 上的<img height="20" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/lookInfo.JPG" width="72" border="0" />&nbsp; 按钮</p>
<p>哇塞，大家看到了吗？ 我们的抓包工具在第12行抓到了我们想要的数据啊</p>
<p><img height="375" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/dataa1.jpg" width="992" border="0" /></p>
<p>&nbsp;</p>
<p>里边有我们所有车的数据， 停在什么位置上，车的价钱，以及停车多少分钟，等等信息，稍作分析便可以使用腾讯的xml数据了</p>
<p>要注意的是这是一个Post操作，Post地址是</p>
<p><a href="http://world.show.qq.com/cgi-bin/parker_user_info?uin">http://world.show.qq.com/cgi-bin/parker_user_info?uin</a>=</p>
<p>&nbsp;</p>
<p>好了，已经获取我们的QQ抢车位所有的车辆信息了</p>
<p>我们再来测试下停车功能吧，先找个车试试 吼吼~~</p>
<p>首先我们找到一个好友，进入他的停车场，然后找个空位置，选择一个我们的车，点击停车</p>
<p>&nbsp;</p>
<p><img height="552" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/go1.jpg" width="803" border="0" /></p>
<p>点击确定，我们看看是否能再次抓到有用的数据呢？？</p>
<p><img height="361" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/gogogo.jpg" width="947" border="0" />&nbsp;</p>
<p>&nbsp;</p>
<p>我们看到，Post之后，居然又返回一个xml文件，腾讯对数据的返回大部分是xml文件</p>
<p>返回一个 此车停在XX好友车位上的标示（opuin)</p>
<p>以及&nbsp; carid(车的自编号);money(赚取的钱)等等..</p>
<p>我们来看看这个Post提交&nbsp; 究竟提交了些什么数据呢</p>
<p><img height="216" alt="" src="http://images.cnblogs.com/cnblogs_com/bnjbl/postDatas.jpg" width="559" border="0" /></p>
<p>我们不难发现，和上边返回的xml差不多 opuin就是当前你选择停车的好友QQ号</p>
<p>carid是车编号，parkno是你好友的停车位编号，当前我们是停在了2号车位 呵呵</p>
<p>这个停车就基本分析完了，大家按照这个思路就完全可以写自己的停车程序了</p>
<p>&nbsp;</p>
<p>这几天真的很忙，很抱歉没及时跟进文章，我的抢车位外挂应该在下周周二出一个新的版本</p>
<p>目前还在测试，就不给大家放出来新版了（别大家运行看到很多bug就不好咯）</p>
<p>好了，我先分析到这里，明天还得上班，休息了，晚安</p><img src ="http://www.cnblogs.com/bnjbl/aggbug/1516650.html?type=1" width = "1" height = "1" /><br/><br/>----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html" target="_blank">http://www.cnblogs.com/bnjbl/archive/2009/07/04/1516650.html</a><br/>作者博客: <a href="http://www.cnblogs.com/bnjbl/" target="_blank">http://www.cnblogs.com/bnjbl/</a> <a href="http://www.cnblogs.com/bnjbl/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a>]]></description></item><item><title>发一个基于jQuery的多标签浏览插件</title><link>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</link><dc:creator>Q.Lee.lulu</dc:creator><author>Q.Lee.lulu</author><pubDate>Fri, 03 Jul 2009 16:39:00 GMT</pubDate><guid>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</guid><comments>http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/QLeelulu//comments/commentRss/1516643.html</wfw:commentRss><description><![CDATA[ <style>
a:link, a:visited
{
	font: 12px "宋体";
	color: #1835d1;
	text-decoration: none;
}
a:active, a:hover
{
	color: #f30;
	text-decoration: underline;
}

form, ul, li, dl, dt, dd
{
	padding: 0px;
	margin: 0px;
}
ul
{
	list-style-type: none;
}

/*FrameTabs*/
#frametabs{ background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063697.gif) top repeat-x #d4e4f6; /*border-bottom:1px solid #f0f5fa;*/  padding:2px 0 1px;height:25px;*height:28px!important; position:relative;}
#frametabs ul{display:block; /*border-bottom:1px solid #99bbe8;*/ height:24px; padding:0 4px;}
ul.tab-strip{display:block;zoom:1;}
ul.tab-strip-top{}
.tab-left{background:transparent url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401061296.gif) no-repeat -18px 0;width:18px; height:23px;position:absolute;left:0;top:0;z-index:10;cursor:pointer; display:none;}
.tab-left-over{background-position:0 0;}
.tab-disabled{background-position:-36px 0;cursor:default;}
.tab-right{ float:right;background:transparent url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401061923.gif) no-repeat 0 0;width:18px; height:23px;position:absolute;right:0;top:0;z-index:10;cursor:pointer;display:none;}
.tab-right-over{background-position:-18px 0;}
/*.tab-right-disabled{background-position:-36px 0;cursor:default;}*/
.tab-strip-wrap{width:100%;overflow:hidden;position:relative;zoom:1;}
.tab-strip-margin{margin-left:18px;margin-right:18px;}
#frametabs li{ float:left;background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) left -201px repeat-x; height:21px; line-height:21px; margin-right:2px;}
#frametabs li a{display:block; float:left; background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) left -51px no-repeat;height:21px; line-height:21px; color:#416aa3;  font-size:12px;text-decoration:none;padding-left:8px;}
#frametabs li a.closetab{ background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401063074.gif) right -351px no-repeat; padding:4px 6px 6px 5px; height:11px; cursor:pointer;}
#frametabs li.frametabs_hover{ background-position:left -251px;}
#frametabs li.frametabs_hover a{ background-position: left -101px;}
#frametabs li.frametabs_hover a.closetab{ background-position: right -401px;}
#frametabs li.current{ background-position:left -151px; height:24px ; line-height:24px;}
#frametabs li.current a{ background-position: left 0px; font-weight:bold;}
#frametabs li.current a.closetab{ background-position: right -301px;}
#frametabs  li#newframetab{background:none; padding-top:4px; height:15px; padding-left:2px;}
#frametabs  li#newframetab a{background:url(http://pic002.cnblogs.com/img/qleelulu/200907/2009070401060456.gif) left top no-repeat; width:15px; height:15px;}
#frametabs  li#newframetab a:hover{ background-position:0 -15px;}
</style>  <p>本文地址: <a href="http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html" target="_blank">发一个基于jQuery的多标签浏览插件</a>  <p>本文作者：<a href="http://QLeelulu.cnblogs.com/">QLeelulu</a>  <p>转载请标明出处，首发于博客园！  <p>&nbsp; <p>注：该插件提取于<a href="http://demo.powereasy.net/" target="_blank">动易CMS系统</a>管理后台。  <p>该插件适用于使用框架页的管理系统后台。</p> <p>该插件只能应用于同域的URL，跨域的URL由于Javascript的安全限制，会出错。</p> <p>不说废话，先看Demo，点击下面的链接将在下面的iFrame中打开（指定了target="main_right"）：</p> <p><a href="http://www.cnblogs.com/QLeelulu/archive/2008/04/21/1163021.html" target="main_right">jQuery Ajax 全解析</a>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.cnblogs.com/QLeelulu/archive/2008/10/05/1303997.html" target="main_right">ASP.NET MVC 入门系列教程</a><br><a onclick="PE_FrameTab.AddNew(this.href);return false;" href="http://www.cnblogs.com/" target="main_right">博客园(在新标签中打开)</a> </p> <div id="FrameTabs" style="overflow: hidden; width: 680px"> <div class="tab-right tab-right-disabled" onmouseover="this.className='tab-right tab-right-over'" onmouseout="this.className='tab-right tab-right-disabled'"></div> <div class="tab-left" onmouseover="this.className='tab-left tab-left-over'" onmouseout="this.className='tab-left tab-left-disabled'"></div> <div class="tab-strip-wrap" style="width: 8000px"> <ul class="tab-strip" style="float: left"> <li class="current" id="iFrameTab1"><a href="javascript:"><span id="frameTabTitle" title="(无标题)">(无标题)</span></a><a class="closeTab"><img src="http://pic002.cnblogs.com/img/qleelulu/200907/2009070401062427.gif" border="0"></a></a>  <li id="newFrameTab"><a title="新建标签页" href="javascript:"></a></li></ul></div></div> <div id="main_right_frame"></div> <div id="iframeMainTemplate" style="display: none"></div> <p></p> <p>&nbsp;</p> <p>下面是代码，有注释，就不多说了。</p><pre class="code"><span style="color: green">/*  
*
* 该插件只能应用于同域的URL，跨域的URL由于Javascript的安全限制，会出错。
*
* 新建一个标签：PE_FrameTab.AddNew(url)
; 如果url为空则是新开一个空白的标签页。
* 关闭当前标签：PE_FrameTab.CloseCurrentTab()
* 从当前标签切换到其他标签时触发：BeforeSwitch(); 如果该函数存在并返回false则不切换标签.该函数直接写在当前页面中.
* 从其他标签切换到当前标签时触发：SwitchInto(); 如果该函数存在则执行.该函数直接写在要切换到的页面.
* 在关闭当前标签页的时候触发：OnCloseTab(); 如果该函数存在存在则执行.该函数直接写在当前页面中.
*/
</span><span style="color: blue">var </span>lastFrameTabId = 1; <span style="color: green">//最后新建的FrameTabId，用于新建FrameTab
</span><span style="color: blue">var </span>currentFrameTabId = 1; <span style="color: green">//当前显示的FrameTab
</span><span style="color: blue">var </span>frameTabCount = 1;
<span style="color: blue">var </span>StyleSheetPath =<span style="color: #a31515">""</span>;

<span style="color: blue">var </span>PE_FrameTab = {
    <span style="color: green">//新建一个标签
    </span>AddNew: <span style="color: blue">function</span>(url) {
        AddNewFrameTab(url);
    },
    <span style="color: green">//关闭当前标签
    </span>CloseCurrentTab: <span style="color: blue">function</span>(){
        jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ currentFrameTabId).find(<span style="color: #a31515">".closeTab"</span>).click();
   }
};

<span style="color: green">///给tab标签注册切换和关闭tab事件
</span>jQuery.fn.iFrameTab = <span style="color: blue">function</span>() {
    jQuery(<span style="color: blue">this</span>).each(<span style="color: blue">function</span>() {
        <span style="color: blue">var </span>cr = jQuery(<span style="color: blue">this</span>);
        <span style="color: blue">var </span>tabId = cr.attr(<span style="color: #a31515">"id"</span>).replace(<span style="color: #a31515">"iFrameTab"</span>, <span style="color: #a31515">""</span>);
        cr.click(<span style="color: blue">function</span>() {<span style="color: green">//切换FrameTab
            </span>SwitchIframe(<span style="color: blue">this</span>);
        }).find(<span style="color: #a31515">".closeTab"</span>).click(<span style="color: blue">function</span>() {<span style="color: green">//关闭FrameTab
            </span><span style="color: blue">if </span>(frameTabCount &gt; 1) {
                <span style="color: blue">var </span>mainRightFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>);
                <span style="color: blue">var </span>bClose = mainRightFrame[0].contentWindow.OnCloseTab ? mainRightFrame[0].contentWindow.OnCloseTab() : <span style="color: blue">true</span>;
                <span style="color: blue">if </span>(bClose) {
                    <span style="color: blue">if </span>(cr.attr(<span style="color: #a31515">"class"</span>) == <span style="color: #a31515">"current"</span>) {<span style="color: green">//如果关闭的标签是当前标签，则切换到前一标签，如果前一标签不存在，则切换到后一标签
                        </span><span style="color: blue">var </span>nextIframe = cr.prev(<span style="color: #a31515">"li[id^='iFrameTab']"</span>);
                        <span style="color: blue">if </span>(nextIframe.length &lt;= 0) { nextIframe = cr.next(<span style="color: #a31515">"li[id^='iFrameTab']"</span>); }
                        SwitchIframe(nextIframe[0]);
                    }
                    <span style="color: green">//清理
                    </span>cr.remove();
                    jQuery(<span style="color: #a31515">"#frmTitle iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>).remove();
                    mainRightFrame.remove();
                    frameTabCount--;
                    CheckFramesScroll();
                }
            }
        }).end().dblclick(<span style="color: blue">function</span>() {
            jQuery(<span style="color: blue">this</span>).find(<span style="color: #a31515">".closeTab"</span>).click();
        });
    });
    <span style="color: blue">return </span>jQuery(<span style="color: blue">this</span>);
}


<span style="color: green">///切换tab
</span><span style="color: blue">function </span>SwitchIframe(iFrameTab) {
    <span style="color: blue">var </span>tabId = jQuery(iFrameTab).attr(<span style="color: #a31515">"id"</span>).replace(<span style="color: #a31515">"iFrameTab"</span>, <span style="color: #a31515">""</span>);  <span style="color: green">//鼠标点击的tab的id
    </span><span style="color: blue">if </span>(currentFrameTabId == tabId) { <span style="color: blue">return false</span>; }
    <span style="color: green">//判断是否允许切换Tab
    </span><span style="color: blue">var </span>switchFunc = jQuery(<span style="color: #a31515">"#main_right"</span>)[0].contentWindow.window.BeforeSwitch;
    <span style="color: blue">var </span>bSwitch = (switchFunc) ? switchFunc() : <span style="color: blue">true</span>;
    <span style="color: blue">if </span>(!bSwitch) { <span style="color: blue">return false</span>; }

    <span style="color: blue">var </span>currentGuideSrc = jQuery(<span style="color: #a31515">"#frmTitle iframe[tabid='" </span>+ currentFrameTabId + <span style="color: #a31515">"']"</span>).attr(<span style="color: #a31515">"src"</span>);
    SetCurrentFrameTab(iFrameTab);

    <span style="color: blue">var </span>mainFrames = jQuery(<span style="color: #a31515">"#main_right_frame &gt; iframe"</span>).hide().attr({ <span style="color: #a31515">"id"</span>: <span style="color: #a31515">""</span>, <span style="color: #a31515">"name"</span>: <span style="color: #a31515">"" </span>});
    <span style="color: blue">var </span>newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>);
    <span style="color: green">//将iframe的window.name设为空，使&lt;a target="main_right" /&gt;只对当前iframe有效
    </span>mainFrames.each(<span style="color: blue">function</span>() { <span style="color: blue">this</span>.contentWindow.window.name = <span style="color: #a31515">""</span>; }); 
    
    <span style="color: blue">if </span>(newMainFrame.length &lt;= 0) {<span style="color: green">//是否新建标签
        </span>newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame"</span>).prepend(jQuery(<span style="color: #a31515">"#iframeMainTemplate"</span>).html())
                .find(<span style="color: #a31515">"[tabid=0]"</span>).attr({ <span style="color: #a31515">"tabid"</span>: tabId, <span style="color: #a31515">"src"</span>: <span style="color: #a31515">"about:blank"</span>, <span style="color: #a31515">"id"</span>: <span style="color: #a31515">"main_right"</span>, <span style="color: #a31515">"name"</span>: <span style="color: #a31515">"main_right" </span>})
                .css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"block"</span>);
    } <span style="color: blue">else </span>{
        newMainFrame = jQuery(<span style="color: #a31515">"#main_right_frame iframe[tabid='" </span>+ tabId + <span style="color: #a31515">"']"</span>)
            .attr(<span style="color: #a31515">"id"</span>, <span style="color: #a31515">"main_right"</span>).attr(<span style="color: #a31515">"name"</span>, <span style="color: #a31515">"main_right"</span>).show();
    }
    <span style="color: green">//指定iframe的window.name，使&lt;a target="main_right" /&gt;有效
    </span>newMainFrame[0].contentWindow.window.name = <span style="color: #a31515">"main_right"</span>;
    frames[<span style="color: #a31515">"main_right"</span>] = newMainFrame[0].contentWindow.window;

    currentFrameTabId = tabId;

    <span style="color: blue">var </span>switchInto = jQuery(<span style="color: #a31515">"#main_right"</span>)[0].contentWindow.window.SwitchInto;
    <span style="color: blue">if</span>(switchInto){ switchInto(); }
}

<span style="color: green">///初始化新建标签按钮
</span><span style="color: blue">function </span>InitNewFrameTab() {
    jQuery(<span style="color: #a31515">"#newFrameTab"</span>).click(<span style="color: blue">function</span>(url) {
        AddNewFrameTab(url);
    });
}

<span style="color: blue">function </span>AddNewFrameTab(url){
    <span style="color: green">//jQuery("#FrameTabs .current").removeClass("current");
    </span><span style="color: blue">var </span>btn=jQuery(<span style="color: #a31515">"#newFrameTab"</span>);
    jQuery(<span style="color: #a31515">'&lt;li id="iFrameTab' </span>+ (++lastFrameTabId) + <span style="color: #a31515">'" &gt;&lt;a href="javascript:"&gt;&lt;span id="frameTabTitle"&gt;(无标题)&lt;/span&gt;&lt;a class="closeTab"&gt;&lt;img border="0" src="' </span>+ StyleSheetPath + <span style="color: #a31515">'images/tab-close.gif"/&gt;&lt;/a&gt;&lt;/a&gt;&lt;/li&gt;'</span>)
            .insertBefore(btn).iFrameTab();
      frameTabCount++;
      SwitchIframe(jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ lastFrameTabId)[0]);
       jQuery(<span style="color: #a31515">"#main_right"</span>).attr(<span style="color: #a31515">"src"</span>,url);
      <span style="color: blue">if </span>(CheckFramesScroll()) { jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>).css(<span style="color: #a31515">"margin-left"</span>, cW - fW - 40); }
}

<span style="color: blue">function </span>SetCurrentFrameTab(selector) {
    jQuery(<span style="color: #a31515">"#FrameTabs .current"</span>).removeClass(<span style="color: #a31515">"current"</span>);
    jQuery(selector).addClass(<span style="color: #a31515">"current"</span>);
}
<span style="color: green">///检查是否需要滚动
</span><span style="color: blue">function </span>CheckFramesScroll() {
    <span style="color: blue">var </span>ft = jQuery(<span style="color: #a31515">"#FrameTabs"</span>);
    window.cW = ft.width(); <span style="color: green">//包含Tabs的容器宽度
    </span>window.fW = ft.find(<span style="color: #a31515">"ul:eq(0)"</span>).width();
    ft.unbind(<span style="color: #a31515">"DOMMouseScroll"</span>).unbind(<span style="color: #a31515">"mousewheel"</span>);
    <span style="color: blue">if </span>(fW &gt; cW) {
        <span style="color: blue">if </span>(jQuery.browser.mozilla) {
            ft.bind(<span style="color: #a31515">"DOMMouseScroll"</span>, <span style="color: blue">function</span>(e) {
                ScrollFrames(cW, fW, e);
            });
        } <span style="color: blue">else </span>{
            ft.bind(<span style="color: #a31515">"mousewheel"</span>, <span style="color: blue">function</span>(e) {
                ScrollFrames(cW, fW, e);
            });
        }
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-strip-wrap"</span>).addClass(<span style="color: #a31515">"tab-strip-margin"</span>);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-right, #FrameTabs .tab-left"</span>).css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"block"</span>);
        <span style="color: blue">return true</span>;
    } <span style="color: blue">else </span>{
        jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>).css(<span style="color: #a31515">"margin-left"</span>, 0);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-right, #FrameTabs .tab-left"</span>).css(<span style="color: #a31515">"display"</span>, <span style="color: #a31515">"none"</span>);
        jQuery(<span style="color: #a31515">"#FrameTabs .tab-strip-wrap"</span>).removeClass(<span style="color: #a31515">"tab-strip-margin"</span>);
        <span style="color: blue">return false</span>;
    }
}
<span style="color: green">///Tab滚动。
///cW为包含Tabs的容器宽度；fW为全部Tabs的宽度；y为指定的位移，如果不指定y，则使用event中的位移。
</span><span style="color: blue">function </span>ScrollFrames(cW, fW, event, y) {
    <span style="color: blue">if </span>(!y) {
        <span style="color: blue">if </span>(event.wheelDelta) {
            y = event.wheelDelta / 5;
        } <span style="color: blue">else if </span>(event.detail) {
            y = -event.detail * 8;
        }
    }
    <span style="color: blue">var </span>jList = jQuery(<span style="color: #a31515">"#FrameTabs ul:eq(0)"</span>);
    <span style="color: blue">var </span>ml = jList.css(<span style="color: #a31515">"margin-left"</span>);
    ml = Number(ml.toLowerCase().replace(<span style="color: #a31515">"px"</span>, <span style="color: #a31515">""</span>));
    <span style="color: blue">if </span>((ml &lt; 0 &amp;&amp; y &gt; 0) || (ml - cW &gt; -fW - 40) &amp;&amp; y &lt; 0) {
        ml = ml + y;
        <span style="color: blue">if </span>(ml &gt;= 0) { ml = 0; }
        <span style="color: blue">if </span>(ml - cW &lt;= -fW - 40) { ml = cW - fW - 40;}
        jList.css(<span style="color: #a31515">"margin-left"</span>, ml);
    }
}
<span style="color: green">//注册Tab超出范围时左移、右移事件
</span><span style="color: blue">function </span>RegScrollFramesBtn() {
    jQuery(<span style="color: #a31515">"#FrameTabs .tab-right"</span>).click(<span style="color: blue">function</span>() { 
        ScrollFrames(window.cW,window.fW,<span style="color: blue">null</span>,-50);
    });
    jQuery(<span style="color: #a31515">"#FrameTabs .tab-left"</span>).click(<span style="color: blue">function</span>() { 
        ScrollFrames(window.cW,window.fW,<span style="color: blue">null</span>,50);
    });
}

<span style="color: green">//设置标签的标题
//tarFrame参数为目标iframe
</span><span style="color: blue">function </span>SetTabTitle(tarFrame) {
    <span style="color: blue">var </span>title = <span style="color: #a31515">""</span>;
    <span style="color: blue">try </span>{ title = tarFrame.contentWindow.document.title; } <span style="color: blue">catch </span>(e) { }
    <span style="color: blue">var </span>subTitle = title = title || <span style="color: #a31515">"(无标题)"</span>;
    <span style="color: blue">if </span>(title.length &gt; 6) { subTitle = title.substr(0, 5) + <span style="color: #a31515">".." </span>}
    jQuery(<span style="color: #a31515">"#iFrameTab" </span>+ jQuery(tarFrame).attr(<span style="color: #a31515">"tabid"</span>)).find(<span style="color: #a31515">"#frameTabTitle"</span>).html(subTitle).attr(<span style="color: #a31515">"title"</span>, title);
}

<span style="color: green">//初始化
</span>jQuery(<span style="color: blue">function</span>() {
    jQuery(<span style="color: #a31515">"#FrameTabs li[id^='iFrameTab']"</span>).iFrameTab();
    InitNewFrameTab(); <span style="color: green">//初始化新建标签页按钮
    </span>RegScrollFramesBtn();
});

</pre><a href="http://11011.net/software/vspaste"></a>
<p>Enjoy!! By Q.Lee.lulu。</p>
<p>最后给出代码打包下载：<a href="http://files.cnblogs.com/QLeelulu/FrameTab.rar" target="_blank">FrameTab.rar</a></p><img src ="http://www.cnblogs.com/QLeelulu/aggbug/1516643.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html" target="_blank">http://www.cnblogs.com/QLeelulu/archive/2009/07/04/1516643.html</a><br/>作者博客: <a href="http://www.cnblogs.com/QLeelulu/" target="_blank">http://www.cnblogs.com/QLeelulu/</a> <a href="http://www.cnblogs.com/QLeelulu/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a>]]></description></item><item><title>解决IE8下无法播放rm的视频网站内容</title><link>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</link><dc:creator>小草</dc:creator><author>小草</author><pubDate>Fri, 03 Jul 2009 16:05:00 GMT</pubDate><guid>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</guid><comments>http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/liubiqu//comments/commentRss/1516636.html</wfw:commentRss><description><![CDATA[<p>今天在研究网站播放rm视频的问题时碰到的问题。我的机器是vista sp2+IE8 + realplayer11 后来在同事的机器上运行就正常。</p>
<p><span style="color: red">解决办法：</span></p>
<p>1、如果在 Windows Vista Service Pack 1 或 Windows Server 2008 上同时使用 Real Networks RealPlayer 11 和 Internet Explorer 8，会出现已知的程序兼容性问题。若要解决此问题，请安装修补程序 957055。安装 Internet Explorer 8 时，系统将自动接收此更新。</p>
<p>有关详细信息，请参阅 Microsoft 知识库中的以下文章：<a href="http://support.microsoft.com/kb/957055/">http://support.microsoft.com/kb/957055/</a>&nbsp;&nbsp; Vista SP2包含该更新包，但还是会有问题，建议删除IE8,恢复到IE7就正常了。我就是使用这个OK。如何删除IE8请查看<a id="homepage1_HomePageDays_DaysList_ctl03_DayItem_DayList_ctl00_TitleUrl" href="http://www.cnblogs.com/liubiqu/archive/2009/02/23/1396271.html">如何删除IE8</a></p>
<p>2、要同时安装Internet Explorer 8 和RealPlayer 11 ，必须先安装RealPlayer 11 ，才能安装Internet Explorer 8 。</p>
<p>3、如果安装Internet Explorer 8 后再安装RealPlayer 11 ，可能会遇到某些程序兼容性问题。要解决这些问题，请卸载Internet Explorer 8 ，然后再将它重新安装。<br /></p>
<p>另：</p>
<p>rm播放控件的详细的API接口说明：（非常的全面）但目前还没有找到mediaplayer的详细API，唉！遗憾&#8230;&#8230;</p>
<p><a href="http://service.real.com/help/library/guides/extend/embed.htm">http://service.real.com/help/library/guides/extend/embed.htm</a></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/liubiqu/aggbug/1516636.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html" target="_blank">http://www.cnblogs.com/liubiqu/archive/2009/07/04/1516636.html</a><br/>作者博客: <a href="http://www.cnblogs.com/liubiqu/" target="_blank">http://www.cnblogs.com/liubiqu/</a> <a href="http://www.cnblogs.com/liubiqu/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a>]]></description></item><item><title>ASP.NET应用程序删除文件问题解决方法</title><link>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</link><dc:creator>Richard Tsuei</dc:creator><author>Richard Tsuei</author><pubDate>Fri, 03 Jul 2009 15:03:00 GMT</pubDate><guid>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</guid><comments>http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/richardtsuei//comments/commentRss/1516617.html</wfw:commentRss><description><![CDATA[<p>自从ASP.NET 2.0诞生就给我们项目带了一个很严重的问题，删除文件和目录会触发ASP.NET应用程序重新启动。直到ASP.NET 3.5一直认为微软会解决这个问题，解决发现还是没什么希望。ASP.NET 3.5只是采用了新的机制让在处理的线程不会中止，但下一个新的请求将会创建一个新的应用程序域，现有的应用程序域将维持到现在和在队列中排队的请求处理后再销毁。变相解决了应用程序重新启动给客户端带来的不快，但是也没有解决会话状态变量丢失的问题。<br /><br />在进行ASP.NET 2.0应用程序开发的时候，项目组采取的不办法如下：<br />在Web应用程序目录外创建临时文件夹；<br />在IIS中将临时文件夹创建为虚拟目录；<br />在Web应用程序中添加虚拟目录指向临时文件夹的物理地址。<br />这样做有一个缺点，就是需要在配置文件中记录临时文件夹的应用程序路径（～/Temp）和物理路径（c:\temp）；因为文件读写需要物理路径，而文件在IE中直接表示需要应用程序路径转换为相对URL路径。还有，这个解决方法因为没有在系统级别解决问题，所以在我们使用VS2005宿主应用程序时就无法进行调试。<br /><br />今天看了老外一篇文章，发现Windows Resource Kit中居然有命令行工具可以解决这个问题，此工具名为linkd使用方法如下：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">linkd&nbsp;c:</span><span style="color: #000000">\</span><span style="color: #000000">temp&nbsp;c:</span><span style="color: #000000">\</span><span style="color: #000000">wwwroot</span><span style="color: #000000">\</span><span style="color: #000000">webapp</span><span style="color: #000000">\</span><span style="color: #000000">temp</span></div>
<p>这样当你访问c:\wwwroot\webapp\temp或进行读写的时候，直接反映到c:\temp目录中，而且因为系统监视程序监视的实际物理路径而不是映射路径所以不会引起ASP.NET应用程序重新启动。<br /><br />这样就可以解决在VS宿主下的调试问题。</p><img src ="http://www.cnblogs.com/richardtsuei/aggbug/1516617.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html" target="_blank">http://www.cnblogs.com/richardtsuei/archive/2009/07/03/1516617.html</a><br/>作者博客: <a href="http://www.cnblogs.com/richardtsuei/" target="_blank">http://www.cnblogs.com/richardtsuei/</a> <a href="http://www.cnblogs.com/richardtsuei/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a>]]></description></item><item><title>启用IIS的Gzip压缩</title><link>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</link><dc:creator>jerry liu</dc:creator><author>jerry liu</author><pubDate>Fri, 03 Jul 2009 14:57:00 GMT</pubDate><guid>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</guid><comments>http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/sojastudio//comments/commentRss/1516614.html</wfw:commentRss><description><![CDATA[<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">现代的浏览器</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">IE6</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Firefox</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都支持客户端</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Gzip</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，也就是说，在服务器上的网页，传输之前，先使用</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">Gzip</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">压缩再传</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">输给客户端，客户端接收之后由浏览器解压显示，这样虽然稍微占用了一些服务器和客户端的</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">CPU</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，但是换来的是更高的带宽利用率。对于纯文本来讲，压缩率是</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">相当可观的。如果每个用户节约</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">50%</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的带宽，那么你租用来的那点带宽就可以服务多一倍的客户了。二此功能在</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">IIS6.0</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">得到了集成，但是并没有提供一个很</span><span style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman"> </font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好的接口来操作。</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p><span style="font-size: 10.5pt; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">首先，如果你需要压缩静态文件（</span>HTML<span style="font-family: 宋体">），需要在硬盘上建一个目录，并给它&#8220;</span>IUSR_<span style="font-family: 宋体">机器名&#8221;这个用户的写权限。如果压缩动态文件</span> <span style="font-family: 宋体">（</span>PHP<span style="font-family: 宋体">，</span>asp<span style="font-family: 宋体">，</span>aspx<span style="font-family: 宋体">）就不需要了，因为它的页面是每次都动态生成的，压缩完就放弃。</span></p>
<p></span>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; <img height="107" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/1.gif" width="316" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp; <img height="402" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/2.gif" width="265" border="0" /></p>
<p>&nbsp;&nbsp; <img height="387" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/3.gif" width="345" border="0" /></p>
<p>&nbsp;&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">添加</span>Gzip<span style="font-family: 宋体">的</span>Web<span style="font-family: 宋体">服务扩展并设置为有效</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp;<img height="253" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/4.gif" width="423" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp; <img height="253" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/5.gif" width="423" border="0" /></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; <img height="319" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/6.gif" width="384" border="0" />&nbsp;</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;&nbsp; </span><span style="font-family: 宋体"><img height="144" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/7.gif" width="554" border="0" />&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt; tab-stops: list 21.0pt left 176.25pt; mso-list: l0 level1 lfo1"><span lang="EN-US" style="font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings"><span style="mso-list: Ignore">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置网站压缩有效</span><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </span><img height="333" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/8.gif" width="284" border="0" />&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp; 进入&#8220;服务&#8221;标签，选上启用动态内容压缩，静态内容压缩。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;&nbsp; <img height="259" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/9.gif" width="436" border="0" /></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;&nbsp;&nbsp;<span style="font-family: 宋体">此时重启</span>IIS<span style="font-family: 宋体">，压缩就生效了。但是默认设置压缩的文件格式太少，可以进一步设置。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体"></span>&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: 宋体">&nbsp;</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">修改</span> MetaBase.xml<span style="font-family: 宋体">，建议先备份。</span></p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </span><img height="188" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/10.gif" width="275" border="0" />&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp; </p>
<p><span style="font-family: 宋体">&nbsp; 可以用记事本打开，找到</span> IIsCompressionScheme<span style="font-family: 宋体">，有三个相同名字的段，分别是</span>deflate,gzip,Parameters<span style="font-family: 宋体">，第三段不用管它，前两段有基本</span> <span style="font-family: 宋体">相同的参数</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;</span><span style="font-family: 宋体"><img height="494" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/11.gif" width="518" border="0" />&nbsp;</span></p>
<p><span style="font-family: 宋体">&nbsp;</span>HcDynamicCompressionLevel <span style="font-family: 宋体">，设置压缩率，取值</span>0~10<span style="font-family: 宋体">，</span>0<span style="font-family: 宋体">不压缩，</span>10<span style="font-family: 宋体">最高压缩率，这里设置成</span>9<span style="font-family: 宋体">，</span>9<span style="font-family: 宋体">是性价比最高的一个。</span></p>
<p>&nbsp; HcFileExtensions<span style="font-family: 宋体">，需要压缩的静态文件扩展名，默认只有</span>htm<span style="font-family: 宋体">，</span>html<span style="font-family: 宋体">，</span>txt<span style="font-family: 宋体">，可以把</span>js<span style="font-family: 宋体">，</span>css<span style="font-family: 宋体">添加进去。建议按原来的格式，用换行作为分隔。</span>&nbsp;&nbsp;&nbsp; HcScriptFileExtensions<span style="font-family: 宋体">，需要压缩的动态文件扩展名，这里添加</span>aspx<span style="font-family: 宋体">。</span></p>
<p>&nbsp; Location ="/LM/W3SVC/Filters/Compression/deflate"<span style="font-family: 宋体">设置如图：</span></p>
<p><span style="font-family: 宋体">&nbsp; </span></p>
<p><span style="font-family: 宋体"><img height="297" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/12.gif" width="530" border="0" />&nbsp; </span></p>
<p><span style="font-family: 宋体"></span>&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp; </p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span lang="EN-US" style="mso-bidi-font-size: 10.5pt"><font face="Times New Roman">&nbsp;&nbsp; Location ="/LM/W3SVC/Filters/Compression/gzip"</font></span><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置如图：</span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span>&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt"><span style="font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; </span></span><img height="307" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/13.gif" width="498" border="0" />&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp; &nbsp; </p>
<p style="margin-left: 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>iisreset -stop <span style="font-family: 宋体">停止</span>IIS<span style="font-family: 宋体">，保存</span>MetaBase.xml</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;&nbsp; <img height="123" alt="" src="http://images.cnblogs.com/cnblogs_com/sojastudio/14.gif" width="271" border="0" /></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp;&nbsp; </p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt"><span style="font-family: Wingdings">l<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>iisreset -start <span style="font-family: 宋体">启动</span>IIS</p>
<p style="margin: 0cm 0cm 0pt 21pt; text-indent: -21pt">&nbsp;</p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; tab-stops: 176.25pt">&nbsp; ok,that over,上穿图片太累了，本文为原创，如转载，请注明原处！</p>
<p>&nbsp;</p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/sojastudio/aggbug/1516614.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html" target="_blank">http://www.cnblogs.com/sojastudio/archive/2009/07/03/jerry.html</a><br/>作者博客: <a href="http://www.cnblogs.com/sojastudio/" target="_blank">http://www.cnblogs.com/sojastudio/</a> <a href="http://www.cnblogs.com/sojastudio/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a>]]></description></item><item><title>实战网络编程系列-网络编程基础（一）</title><link>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</link><dc:creator>野男人</dc:creator><author>野男人</author><pubDate>Fri, 03 Jul 2009 14:16:00 GMT</pubDate><guid>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</guid><comments>http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/wildman//comments/commentRss/1516604.html</wfw:commentRss><description><![CDATA[摘要: Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 1.1 从访问网页开始  在探讨具体的技术原理之前，我们来搞清楚&#8220;网络通信&#8221;的定义：它是指媒体信息通过网络从一端传递到另外一端。媒体信息的内容主要是话音、文字、图片和视频图像。至于信息如何通过网络传递，例如：一个字符怎么变成电波信号，电波信号又如何...<img src ="http://www.cnblogs.com/wildman/aggbug/1516604.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html" target="_blank">http://www.cnblogs.com/wildman/archive/2009/07/03/1516604.html</a><br/>作者博客: <a href="http://www.cnblogs.com/wildman/" target="_blank">http://www.cnblogs.com/wildman/</a> <a href="http://www.cnblogs.com/wildman/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</a>]]></description></item><item><title>try...catch...finally中的finally一定会执行吗？（二，完结篇）</title><link>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</link><dc:creator>DiggingDeeply</dc:creator><author>DiggingDeeply</author><pubDate>Fri, 03 Jul 2009 13:15:00 GMT</pubDate><guid>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</guid><comments>http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/diggingdeeply//comments/commentRss/1516583.html</wfw:commentRss><description><![CDATA[<p>今天早上匆匆写了篇文章，上班时间也找了找资料，也没找到任何有效性的说明，所以还得自己来。</p>
<p>还是先上一段测试代码：</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Foo()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo</span><span style="color: #800000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo&nbsp;try</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;{&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo&nbsp;finally</span><span style="color: #800000">"</span><span style="color: #000000">);&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Main(</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;args)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">before&nbsp;enter&nbsp;Foo</span><span style="color: #800000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Foo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #800000">"</span><span style="color: #800000">after&nbsp;enter&nbsp;Foo</span><span style="color: #800000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p>比较简单，就是在不同的时候打印几个字符串。</p>
<p>我看了看IL，在Foo 的代码里发现了一个特殊的指令，用ILDASM dump出IL：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">.method</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">hidebysig</span><span style="color: #000000">&nbsp;static&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;&nbsp;Foo()&nbsp;</span><span style="color: #0000ff">cil</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">managed</span><span style="color: #000000"><br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Code&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;42&nbsp;(0x2a)</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">.maxstack</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0000:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0001:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">ldstr</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo</span><span style="color: #800000">"</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0006:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">call</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;[mscorlib]System.Console::WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_000b:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;.try<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_000c:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_000d:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">ldstr</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo&nbsp;try</span><span style="color: #800000">"</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0012:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">call</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;[mscorlib]System.Console::WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0017:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0018:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;&nbsp;&nbsp;&nbsp;IL_0028<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;end&nbsp;.try</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;finally<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_001a:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_001b:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">ldstr</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">enter&nbsp;Foo&nbsp;finally</span><span style="color: #800000">"</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0020:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">call</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;[mscorlib]System.Console::WriteLine(</span><span style="color: #0000ff">string</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0025:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0026:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0027:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">endfinally</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;end&nbsp;handler</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0028:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">nop</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff00ff">IL_0029:</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">ret</span><span style="color: #000000"><br />&nbsp;&nbsp;}&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;end&nbsp;of&nbsp;method&nbsp;Class1::Foo</span><span style="color: #008000"><br /></span></div>
<p>&nbsp;</p>
<p>leave.s IL_0028,这个指令是什么意思呢？查了查msdn：</p>
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;指令无条件将控制转移到传递的目标指令，这表示为距当前指令之后的指令的开始处的&nbsp;</span><span style="color: #800080">1</span><span style="color: #000000">&nbsp;字节有符号偏移量。&nbsp;<br /><br /></span><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;指令类似于&nbsp;br&nbsp;指令，但它可用于退出&nbsp;try、filter&nbsp;或&nbsp;catch&nbsp;块，而一般分支指令只能在此类块中使用以在其内部转移控制。</span><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;指令清空计算堆栈并确保执行周围适当的&nbsp;finally&nbsp;块。&nbsp;<br /><br />不能使用&nbsp;</span><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;指令退出&nbsp;finally&nbsp;块。为了简化异常处理程序的代码生成，一个有效的方法是在&nbsp;Catch&nbsp;块的内部使用&nbsp;</span><span style="color: #0000ff">leave</span><span style="color: #000000">.s&nbsp;指令将控制转移到关联的&nbsp;try&nbsp;块中的任何指令。&nbsp;<br /><br />如果指令有一个或多个前缀代码，则只能将控制转移到其中的第一个前缀。&nbsp;<br /><br /></span></div>
<p>&nbsp;</p>
<p>看了看，也不是很明白，到底是怎么执行呢？我想到了一个Tool，sharpdevelop，一个开源的IDE，记得好像能调式IL，</p>
<p>下了一个安装，安下断点，调式发现leave.s实际上执行finally里的代码，然后再到IL_0028；我试着将IL_0028改为</p>
<p>IL_0029，结果同样执行完finally之后则跳到了IL_0029.</p>
<p>将IL_0028改为IL_000d，则没有执行finally里的代码，在IL_000d和IL_0018之间形成了死循环，不停的打印字符串&#8220;enter Foo try&#8221;。</p>
<p>将IL_0028改为IL_0030，则报错。</p>
<p>这时候大家可能就明白了，leave.s target其实就是执行其后的finally代码块然后跳到target处。</p>
<p>所以，finally不一定执行的办法又多了一个：直接将leave.s改为br.s或是直接ret就可以了。</p>
<p><strong><img src="http://www.cnblogs.com/Emoticons/others/taiyoucai.jpg"  alt="" /></strong></p>
<p><strong>能保证finally一定执行的秘诀就在LEAVE指令。</strong></p>
<p>&nbsp;</p><img src ="http://www.cnblogs.com/diggingdeeply/aggbug/1516583.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html" target="_blank">http://www.cnblogs.com/diggingdeeply/archive/2009/07/03/1516583.html</a><br/>作者博客: <a href="http://www.cnblogs.com/diggingdeeply/" target="_blank">http://www.cnblogs.com/diggingdeeply/</a> <a href="http://www.cnblogs.com/diggingdeeply/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a>]]></description></item><item><title>收藏系列文章索引</title><link>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</link><dc:creator>peterzb</dc:creator><author>peterzb</author><pubDate>Fri, 03 Jul 2009 13:11:00 GMT</pubDate><guid>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</guid><comments>http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/peterzb//comments/commentRss/1516581.html</wfw:commentRss><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 分类整理了这么多文章收藏, 也到该做个总索引的时候了, 包含.Net技术, 移动应用开发, 安防监控/多媒体/流媒体专题开发, 数据库技术.</p>
<p>&nbsp;</p>
<p style="font-weight: bold; text-align: center">.Net开发 </p><br />
<div class="post">
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl14_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/24/1488497.html">.Net学习资料</a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 博客系列文章(设计模式,.net 2.0, ADO.NET, Report/Chart)及站点资源介绍&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/05/24/1488497.html">阅读全文</a></div>
<div class="postbody">&nbsp;</div>
<div class="postbody">
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl09_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html"><font color="#223355">C# WinForm开发系列 - 文章索引</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 该系列主要整理收集在使用C#开发WinForm应用文章, 平时看到大家主要使用C#来开发Asp.Net应用,这方面的文章也特别多,而关于WinForm的文章相对少很多,而自己对WinForm一直比较感兴趣,这几年积累收藏了不少文章,现在整理一下分类推荐给大家,避免大家浪费大把的时间去找这方面的资料,因为找资料也是一件很累的事情,Google,Baidu一下,不断的点击,不断翻阅大量的博客文章,查找自己所需的.这个系列初步打算分入门介绍(开发环境搭建,.net基础概念), DataGrid/DataGridView, TreeView,ADO.Net(DataTable/DataSet/SQL Server),GDI+(图表ZedGraph/OWC等使用,图像处理,控件自定义绘制),打印,多线程(委托, 事件, 线程, BackgroundWorker), XML, 报表(RDLC,Excel,PDF,Word),File,Socket/WCF/Rometing/Web Services, 正则表达式以及其它方面.文章及相关代码搜集自网络,版权属于原作者! &nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/14/1502918.html"><font color="#1d58d1">阅读全文</font></a></div></div>
<div class="postbody">&nbsp;</div></div><br />
<p style="font-weight: bold; text-align: center">移动应用开发 </p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl43_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/12/1455256.html"><font color="#223355">Windows Mobile入门</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Windows Mobile开发入门篇,相关资源集锦(WM菜单使用,模拟器网络设置等),开发资源.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/05/12/1455256.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl10_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502771.html"><font color="#223355">Windows Mobile开发文章收藏</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 整理了一些Windows Mobile开发文章,包括园友们的入门精品文章, UI开发(窗体背景, 图像处理, 菜单, 全屏显示), 网络通信(GPRS开发, 拨号, TCP/UDP), .NET Compact Framework, 开发环境搭建, 模拟器的使用, Windows Mobile/WINCE 开发工具和资源, 具体应用开发(操作XML/INI文件, 手机通讯录, 手机视频流媒体应用)等; 希望对Windows Mobile初学者有用, 不必再去花时间找这类资料. &nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502771.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl08_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/07/02/1515114.html"><font color="#223355">Windows Mobile 开发系列文章收藏 - 开篇</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近2个月来从事Windows Mobile下应用开发, 看了大量的文章资料; DEVDIV.NET论坛的Windows Mobile应用开发版的1600多篇的帖子大致都浏览了一下, 能够回答的也尽量积极解答, CSDN的Windows Mobile版最近几个月的帖子也差不多看了, 有时间要看看以前的一些帖子, 说不定有一些精华贴; 当然少不了博客园MVP们的博客如黎波, Freesc Huang , 施炯, 被遗弃的小指, 葛涵涛/JerryGe, AppleSeeker, 还有很多很多人的博客, 就不一一列举了, 大家可以看博客园 - Windows Mobile 应用开发团队, 博客园自己天天会上来浏览3-5次, 当然不止关注Windows Mobile开发方面,如C#,C++,数据库技术. 博客及论坛社区对自己提高帮助确实很非常大. 虽然公司就我一个人从事手机应用开发, 并且自己以前也不做这方面, 但我感觉自己不是一个人在战斗, 因为网络上及QQ群中实在有太多的热心人, 无私的分享技术, 帮助别人, 非常感谢博客园, DEVDIV,CSDN等技术社区, 感谢这么多从事移&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/07/02/1515114.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl12_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/12/1501921.html"><font color="#223355">Symbian开发系列 - 入门篇</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 要开始我的Symbian开发之旅了, 先收集一些相关资料,如Symbian概述, 开发平台搭建, 参考书籍与网络资源.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/12/1501921.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl04_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/25/1510814.html"><font color="#223355">移动开发资源集锦</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最近开始进入移动应用开发方面, 从事在Windows Mobile, Symbian等平台下开发, 使用C++, C#, J2ME, 现收集整理一些相关开发资源, 以便后续查找.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/25/1510814.html"><font color="#1d58d1">阅读全文</font></a></div>
<p><br />&nbsp;</p>
<p style="font-weight: bold; text-align: center">数据库技术 </p>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl35_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/09/1499999.html"><font color="#223355">Oracle开发与使用文章收藏</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ORACLE EXP-IMP 参数详解,ORACLE中日期和时间函数汇总,Oracle中常用的to_Char用法详解（有FMT的详细列表）,SQLServer和Oracle常用函数对比,将公司系统从SqlServer 2K移植到Oracle 10g中的简要总结等内容&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/09/1499999.html"><font color="#1d58d1">阅读全文</font></a></div><br />
<p style="font-weight: bold; text-align: center">安防监控/多媒体/流媒体专题开发 </p>
<p>&nbsp;</p>
<h2><a id="ArchiveMonth1_Days_Entries_ctl11_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/13/1502497.html"><font color="#223355">视频监控相关文章</font></a> <br /></h2>
<div class="posthead">
<h2><a id="ArchiveMonth1_Days_Entries_ctl01_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/06/29/1513002.html"><font color="#223355">手机视频监控系统开发系列文章</font></a> </h2></div>
<div class="postbody">&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 记录手机视频监控系统开发过程, 前期准备, 开发总结, 后续及其它相关技术如视频编解码/流媒体等.&nbsp;&nbsp;<a href="http://www.cnblogs.com/peterzb/archive/2009/06/29/1513002.html"><font color="#1d58d1">阅读全文</font></a></div>
<p>&nbsp;</p>
<p><a id="ArchiveMonth1_Days_Entries_ctl36_TitleUrl" href="http://www.cnblogs.com/peterzb/archive/2009/05/16/1458085.html"><font color="#223355">流媒体与视频监控开发相关博客文章系列收集</font></a> <br /></p><img src ="http://www.cnblogs.com/peterzb/aggbug/1516581.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html" target="_blank">http://www.cnblogs.com/peterzb/archive/2009/07/03/1516581.html</a><br/>作者博客: <a href="http://www.cnblogs.com/peterzb/" target="_blank">http://www.cnblogs.com/peterzb/</a> <a href="http://www.cnblogs.com/peterzb/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&amp;T多项纪录</a>]]></description></item><item><title>[原创]WCF技术剖析之八：ClientBase&amp;lt;T&amp;gt;中对ChannelFactory&amp;lt;T&amp;gt;的缓存机制</title><link>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</link><dc:creator>Artech</dc:creator><author>Artech</author><pubDate>Fri, 03 Jul 2009 12:36:00 GMT</pubDate><guid>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</guid><comments>http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/artech//comments/commentRss/1516573.html</wfw:commentRss><description><![CDATA[<p>和传统的分布式远程调用一样，WCF的服务调用借助于服务代理（Service Proxy）。而ChannelFactory&lt;T&gt;则是服务代理的创建者。WCF采用基于终结点（Endpoint）服务消费方式：WCF服务通过一个或者多个终结点暴露给潜在的服务消费者，服务的消费中通过与之匹配的终结点与之交互。在客户端，我们具有两种典型的服务代理创建方式，其一是通过诸如SvcUtil.exe这样的工具导入服务的元数据生成相应的服务代理（一个继承自ClientBase&lt;T&gt;的类型）代码和相关配置；其二是直接通过相应的终结点信息（通过代码指定或者配置）创建ChannelFactory&lt;T&gt;对象，并借助该对象直接进行服务代理的创建。 </p> <p>实际上，即使通过ClientBase&lt;T&gt;对象进行服务调用，其内部也是调用ChannelFactory&lt;T&gt;创建的服务代理。整个ChannelFactory&lt;T&gt;的创建是一项相对复杂并且费时的工作，会涉及很多诸如反射、配置文件的读取等操作。为了提高服务调用的性能，在.NET 3.5中，WCF在ClientBase&lt;T&gt;中引入了ChannelFactory&lt;T&gt;的缓存机制。 </p> <p><font size="4"><strong>一、如何实现对ChannelFactory&lt;T&gt;的缓存</strong></font></p> <p>为了让读者对ChannelFactory&lt;T&gt;的缓存机制有一个直观的认识，我们来做一个简单的实验：在一个Console应用中执行如下的代码，其中CalculatorClient可以看成是本节开篇时自定义的服务代理类。在本例中，先后以相同的方式（调用相同的构造函数，传入相同的参数）创建并开启了两个CalculatorClient对象，然后检验它们的ChannelFactory是否是相同的对象。</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>

<p>&nbsp; </p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = True</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>从输出的结果，可以看出两个不同的ClientBase&lt;T&gt;对象使用了相同的ChannelFactory&lt;T&gt;对象。这得益于在.NET 3.5中新加入的ChannelFactory&lt;T&gt;的缓存机制。那么，在WCF客户端框架内部对ChannelFactory&lt;T&gt;的缓存是如何实现的呢？</p>
<p>实际上，ChannelFactory&lt;T&gt;的缓存实现很简单，被创建出来的ChannelFactory&lt;T&gt;集合通过ClientBase&lt;T&gt;的一个静态变量保存起来。我们可以将这个ChannelFactory&lt;T&gt;集合看成是一个字典，字典的值就是ChannelFactory&lt;T&gt;，而键则通过下面三个对象派生： </p>
<ul>
<li><strong>CallbackInstance</strong>：以InstanceContext对象表示的对回调对象的封装； 
<li><strong>EndpointConfigurationName</strong>：终结点在配制文件中的名称； 
<li><strong>RemoteAddress</strong>：终结点的远程地址，类型为EndpointAddress。</li></ul>
<p>它们分别与ClienBase&lt;T&gt;构造函数中相应的参数相匹配。当调用某个构造函数创建对象的时候，WCF将传入的三个参数作为Key（如果再构造函数中并未指定相应的参数，会使用默认值，EndpointConfigurationName、CallbackInstance和RemoteAddress的默认值分别为*、null和null），从缓存（静态变量）中去找匹配的ChannelFactory&lt;T&gt;对象，如果成功找到，则直接返回，否则重新创建，在返回之前将其放入缓存中。 </p>
<p>从这个意义上讲，多个ClienBase&lt;T&gt;对象能够重用相同的ChannelFactory&lt;T&gt;对象的前提是它们使用相同的构造函数，并传入相同的参数被创建。为了验证这一点，再来做一个实验，只须要将上面的例子稍加修改，通过另一个重载构造函数来创建CalculatorClient对象。</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>，<span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>proxy1.Open();<br><br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>实际上，proxy1和proxy2最终使用的终结点地址是相同的（<em><a href="http://127.0.0.1:9999/">http://127.0.0.1:9999/</a> calculatorservice</em>），只不过一个是通过代码指定的，另一个则是通过配置文件配置的。但是，就是因为创建ClienBase&lt;T&gt;时使用了不同的构造函数重载，导致不能重用同一个ChannelFactory&lt;T&gt;对象。</p>
<p>ChannelFactory&lt;T&gt;的重用避免了频繁地常见ChannelFactory&lt;T&gt;对象，从而获得更好的性能。在具体的应用中，我们应该尽可能地利用这样的机制。但是，由于编程人员对ChannelFactory&lt;T&gt;的缓存机制不了解，不知不觉就会使这个缓存机制失效。接下来就来讨论这个问题。 </p>
<p><strong><font size="4">二、ChannelFactory&lt;T&gt;缓存机制的失效</font></strong></p>
<p>总体来讲，下面的两种情况会引起ChannelFactory&lt;T&gt;缓存机制失效。 </p>
<ul>
<li>在构造函数中传入绑定对象构建ClientBase&lt;T&gt;； 
<li>在ClientBase&lt;T&gt;开启（调用Open方法）之前，访问如下三个只读属性：ChannelFactory、Endpoint和ClientCredential。</li></ul>
<p>为了加深读者的理解，我们通过实验的方式来证实上面的两种说法。为了验证在构造函数中传入绑定对象对ChannelFactory&lt;T&gt;缓存机制的影响，写了如下的代码：通过Binding和EndpointAddress对象创建ClienBase&lt;T&gt;对象。</p><pre class="csharpcode">Binding binding = <span class="kwrd">new</span> BasicHttpBinding();<br>EndpointAddress address = <span class="kwrd">new</span> EndpointAddress(<span class="str">"http://127.0.0.1:9999/calculateservice"</span>);<br>CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(binding,address);<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(binding, address);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>接下来，再通过实验整个在ClientBase&lt;T&gt;开启（调用Open方法）之前访问ChannelFactory、Endpoint和ClientCredential三个只读属性对ChannelFactory&lt;T&gt;缓存机制的影响。在这里，以访问ChannelFactory属性为例</p><pre class="csharpcode">CalculatorClient proxy1 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>ChannelFactory&lt;ICalculator&gt; factory = proxy1.ChannelFactory;<br>proxy1.Open();<br>CalculatorClient proxy2 = <span class="kwrd">new</span> CalculatorClient(<span class="str">"calculateservice"</span>);<br>proxy2.Open();<br>Console.WriteLine(<span class="str">"object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = {0}"</span>, </pre><pre class="csharpcode"><span class="kwrd">object</span>.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory));<br></pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>输出结果：</p><pre class="csharpcode">object.ReferenceEquals(proxy1.ChannelFactory, proxy2.ChannelFactory) = False</pre>
<p>
<style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
</p>
<p>在上面的例子中，在Proxy1的Open方法调用之前，调用了只读属性ChannelFactory，并将其赋值到一个临时变量中，中间根本没有对ChannelFactory&lt;T&gt;作任何修改，仅仅一次我们认为微不足道的对只读属性的访问就破坏了WCF客户端框架对ChannelFactory&lt;T&gt;的缓存机制。</p>
<p><strong><font size="4">三、如何有效利用ChannelFactory&lt;T&gt;的缓存机制</font></strong></p>
<p>为了能够充分利用ChannelFactory&lt;T&gt;的缓存机制，获得更好的服务调用性能，我们可以得出以下两个最佳实践： </p>
<ul>
<li>避免通过人为指定绑定对象创建ClientBase&lt;T&gt;对象，应该尽可能使用配置的绑定信息； 
<li>避免在ClientBase&lt;T&gt;开启之前读取ChannelFactory、Endpoint和ClientCredential三个属性，或者在创建ClientBase&lt;T&gt;之后显式调用Open方法开启ClientBase&lt;T&gt;对象。</li></ul>
<p><strong>P.S.</strong> 以上内容部分节选自《WCF技术剖析（卷1）》第八章。</p><img src ="http://www.cnblogs.com/artech/aggbug/1516573.html?type=1" width = "1" height = "1" /><br/><br/>-----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html" target="_blank">http://www.cnblogs.com/artech/archive/2009/07/03/1516573.html</a><br/>作者博客: <a href="http://www.cnblogs.com/artech/" target="_blank">http://www.cnblogs.com/artech/</a> <a href="http://www.cnblogs.com/artech/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a>]]></description></item><item><title>如何在VSTS 2010 中自定义真实网络仿真</title><link>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516445.html</link><dc:creator>SabrinaZheng</dc:creator><author>SabrinaZheng</author><pubDate>Fri, 03 Jul 2009 08:26:00 GMT</pubDate><guid>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516445.html</guid><comments>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516445.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiyunzheng//comments/commentRss/1516445.html</wfw:commentRss><description><![CDATA[摘要: 在前面几篇博客文章里，我们介绍了VSTS 2010 网络仿真，以及如何为负载测试或单元测试及其它测试配置网络仿真（Network Emulation）。接下来的一些博客中将陆续与大家分享在使用VS2010过程中发现的关于 Network Emulation 网络仿真更高级的特性。Visual Studio 2010 中网络仿真（Network Emulation）新特性 与VS20008 相比，V...<img src ="http://www.cnblogs.com/xiyunzheng/aggbug/1516445.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516445.html" target="_blank">http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516445.html</a><br/>作者博客: <a href="http://www.cnblogs.com/xiyunzheng/" target="_blank">http://www.cnblogs.com/xiyunzheng/</a> <a href="http://www.cnblogs.com/xiyunzheng/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47947/" target="_blank">微软告攒机商第一案胜诉</a>]]></description></item><item><title>asp.net paypal信用卡支付功能</title><link>http://www.cnblogs.com/hubj/archive/2009/07/03/1516437.html</link><dc:creator>alex hu</dc:creator><author>alex hu</author><pubDate>Fri, 03 Jul 2009 08:16:00 GMT</pubDate><guid>http://www.cnblogs.com/hubj/archive/2009/07/03/1516437.html</guid><comments>http://www.cnblogs.com/hubj/archive/2009/07/03/1516437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/hubj//comments/commentRss/1516437.html</wfw:commentRss><description><![CDATA[<p>&nbsp;</p>
<blockquote style="margin-right: 0px" dir="ltr">
<p>前段时间有个客户网站需要用到信用卡支付功能，客户有个Website Payments Pro的帐号，第一次做这东西花了很多时间在上面，已做好运行了一段日子，</p>
<p>现在总结一下：</p>
<p>1. 先注册一个paypal开发者帐号，这个主要用于sandbox测试，注册地址:<a href="https://developer.paypal.com/">https://developer.paypal.com/</a>，注册成功这后，在home中<br /><br /><a href="http://www.cnblogs.com/hubj/admin/devscr?cmd=_create-account-session">Create a preconfigured buyer or seller account</a>. 创建买家或卖家帐号，这个主要用于后面的买东西测试</p>
<p class="contentLeft"><a onclick="openSandbox('devscr?cmd=_pro3-registration-session')" href="#">Create a Website Payments Pro account</a> (<a onclick="openWin('devscr?cmd=sandbox/sandbox_instructions'); return false;" href="#">new release</a>). 创建Website Payments Pro的帐号 ，这个帐号可以获得一个<br /><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/hubj/t1.jpg" width="762" height="492" /><br /><br />注册步骤略过，过程中需要US地址，邮箱，有个网站可以在线生成 <a href="http://www.fakenamegenerator.com/">http://www.fakenamegenerator.com/</a><br /><br />注册成功之后<br />2.在Test Accounts<br /></p>
<p><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/hubj/t2.jpg" width="640" height="590" />&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;可以看到黑色线条部分，点击单选按钮 －bussiness的账号，再点enter sandbox test site</p>
<p>&nbsp;</p>
<p>输入登录密码,然后在<u><font color="#800080">Profile</font></u>&gt;<a href="https://www.sandbox.paypal.com/us/cgi-bin/webscr?cmd=_profile-api-access">API Access</a> <br /><img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/hubj/T3.jpg" width="704" height="508" /><br /><br />在Setting up API permissions and credentials<br /><br />选择<br /></p>
<p>Option 2 - Request API credentials to create your own API username and password.</p>
<p>This option applies to:</p>
<ul><li>Custom websites and online stores</li><li>Pre-integrated shopping carts running on your own server </li></ul>
<p><a href="https://www.sandbox.paypal.com/us/cgi-bin/webscr?cmd=_profile-api-add-direct-access">View API Certificate</a></p>
<p><br />然后再请求一个api 签名</p>
<p>&nbsp;</p>
<p><input id="auth-type" class="apiField" value="3_token" CHECKED type="radio" name="auth_type" /><label id="auth-type-label" class="apiLabel" for="auth-type"><strong>Request API signature</strong> <br />if your shopping cart or solution provider has asked for an API username, password, and signature,<br /> or if you&#8217;re developing a custom shopping cart. <br /><br />然后会得到一长串的</label></p><label class="apiLabel" for="auth-type">
<p>
<table summary="API Certificate">
<tr>
<th>Credential</th>
<td>API Signature</td></tr>
<tr>
<th>API Username</th>
<td style="width: 413px; height: 22px">xxxxx_per_api1.163.com</td></tr>
<tr>
<th>API Password</th>
<td>XXXXXXXXXX</td></tr>
<tr>
<th>Signature</th>
<td>XXXXXXX</td></tr></table></p>
<p>&nbsp;</p>
<p>这个很重要，将来会用的你的网站中</p>
<p>3.打开</p>
<p><a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/library_download_sdks#WPST">https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/library_download_sdks#WPST</a><br /><br />下载SOAP SDKs</p>
<p>然后替换其中的API签名就可以了</p>
<p>上面的通过soap方式<br /><br />下面也有一个网址<br /><a href="http://integrationwizard.x.com/ecpaypal/main.php">http://integrationwizard.x.com/ecpaypal/main.php</a>&nbsp;会一步一步的告诉你怎么做<br /><br />中文&nbsp;API接口一览</p>
<p><a href="http://paypal.ebay.cn/integrationcenter/list__resource_1.html">http://paypal.ebay.cn/integrationcenter/list__resource_1.html</a><br /><br />信用卡支付我直接调用的是DoDirectPayment这个类<br />支持"Visa&#8220;\MasterCard\Discover\Amex\Solo\Switch<br /><br />在测试的模式这些帐号paypal会在第2步的时候自动生成一个visa的帐号<br /><br />参考网址</p>
<p>API Error<br /><a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_nvp_errorcodes">https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_nvp_errorcodes</a><br /><br /><br />p.s.&nbsp; 一般购物网站在支付的时候最好要到ssl，https，不然谁敢付款 :)<br />ssl这个证书是可以认证的，不过不是免费.</p>
<p>&nbsp;</p>
<p>&nbsp;</p></label></blockquote> <img src ="http://www.cnblogs.com/hubj/aggbug/1516437.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/hubj/archive/2009/07/03/1516437.html" target="_blank">http://www.cnblogs.com/hubj/archive/2009/07/03/1516437.html</a><br/>作者博客: <a href="http://www.cnblogs.com/hubj/" target="_blank">http://www.cnblogs.com/hubj/</a> <a href="http://www.cnblogs.com/hubj/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</a>]]></description></item><item><title>理解VSTS 2010 Beta1 Network Emulation Driver(网络仿真驱动程序)</title><link>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516168.html</link><dc:creator>SabrinaZheng</dc:creator><author>SabrinaZheng</author><pubDate>Fri, 03 Jul 2009 03:58:00 GMT</pubDate><guid>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516168.html</guid><comments>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiyunzheng//comments/commentRss/1516168.html</wfw:commentRss><description><![CDATA[<p><span style="color: #505fcd"><strong>什么是网络仿真驱动程序？</strong><br /></span>Visual Studio 2010 Beta1里提供的网络仿真(Network Emulation)是通过一个过滤驱动程序完成的。 这个过滤驱动程序被称为&#8220;Microsoft VSTS 网络仿真 NDISx Driver&#8221;，其中 x 是 NDIS 版本 （对于Vista 和 Windows 2008，它是6；Windows XP 和 2003是5）。网络仿真驱动程序可以是下列三种状态之一：卸载、 安装和未绑定、安装和绑定到一个或多个网卡。</p>
<p><span style="color: #505fcd"><strong>驱动程序何时将被安装和卸载？ <br /></strong></span>每次网络仿真被配置(1. 通过在测试配置里启用网络仿真收集器，选者网络配置文件（除了局域网）2. 或通过保存一个负载测试配置) Visual Studio将检查：<br />&nbsp;&nbsp; A)驱动程序是否安装<br />&nbsp;&nbsp; B)驱动程序是否被绑定到至少一个网卡<br />如果其中之一不满足，那么会弹出如下所示的对话框，提示用户是否要绑定驱动程序。如果选择是，它将尝试在这次绑定驱动程序。 一旦安装并绑定驱动程序，用户将不再看到此对话框，除非该驱动程序被卸载。</p>
<p>&nbsp;<img alt="Network Emulation Driver Bind Dialog" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/1111.jpg" width="487" height="187" /></p>
<p><span style="color: #505fcd"><strong>网络仿真驱动程序绑定是指什么？<br /></strong></span>网络仿真驱动程序绑定意味着该驱动程序安装和正在使用或绑定到指定的网卡。</p>
<p><strong><span style="color: #505fcd">如何安装和卸载网络仿真驱动程序？</span></strong><br />1) 找到安装目录 （&lt;Install Drive&gt;： Program Files \ Microsoft Visual Studio 10.0 Network Emulation\Driver)<br />2) 找到snetcfg.exe文件<br />3) 打开一个命令提示窗口，转到此安装目录<br />&nbsp;&nbsp;&nbsp; cd&nbsp;&lt;Install Drive&gt;:Program Files \ Microsoft Visual Studio 10.0 Network Emulation\Driver<br />4) 运行命令 "<strong>start /wait snetcfg.exe -v -l .\ -c s -i ms_sfilter</strong>&#8221; 安装和绑定驱动程序；运行命令"<strong>start /wait snetcfg.exe -u</strong> <strong>ms_sfilter</strong>" 卸载该驱动程序。</p>
<p><span style="color: #505fcd"><strong>如何检查Network Emulation Driver已被正确的安装？<br /></strong></span>查看网络仿真驱动程序是否正确安装，可以通过打开局域网络连接上的属性，查看网卡上是否列出该驱动程序。例如：</p>
<p>Windows XP:</p>
<p><img alt="Local Network Connection - WinXP" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/999.JPG" width="369" height="440" /></p>
<p>Win7/Vista:</p>
<p>&nbsp;<img alt="Local Network Connection - Vista" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/LocalNetworkConnection-Vista.JPG" width="380" height="475" /></p> <img src ="http://www.cnblogs.com/xiyunzheng/aggbug/1516168.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516168.html" target="_blank">http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516168.html</a><br/>作者博客: <a href="http://www.cnblogs.com/xiyunzheng/" target="_blank">http://www.cnblogs.com/xiyunzheng/</a> <a href="http://www.cnblogs.com/xiyunzheng/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</a>]]></description></item><item><title>介绍 Network Emulation in Visual Studio 2010 Beta1</title><link>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516165.html</link><dc:creator>SabrinaZheng</dc:creator><author>SabrinaZheng</author><pubDate>Fri, 03 Jul 2009 03:52:00 GMT</pubDate><guid>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516165.html</guid><comments>http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516165.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiyunzheng//comments/commentRss/1516165.html</wfw:commentRss><description><![CDATA[<p>在Visual Studio 2010 Beta 1发行版本中，为负载测试和Visual Studio 2010 Beta1所支持的几乎每种测试中引入了真实网络仿真。</p>
<p>下载地址：<a href="http://go.microsoft.com/fwlink/?LinkId=147407" mce_href="http://go.microsoft.com/fwlink/?LinkId=147407">VSTS 2010&nbsp;Beta 1 Suite Installer</a></p>
<p><span style="color: #434cb1"><strong>真实网络仿真是什么？</strong><br /></span>真实的网络仿真是通过直接操纵网络数据包来模拟网络条件。Visual Studio 2010里提供 的网络仿真是一种基于软件的仿真程序，可以模拟那些使用可靠的物理链路的有线和无线网络，如：以太网。 各种网络属性被纳入 VS2010 网络仿真模型，包括跨网络的往返时间（延迟）、 可用带宽、 排队方式、 数据包丢失量、 数据包的重新排列和错误传播。 VS2010 网络仿真还为筛选基于 IP 地址或TCP、 UDP 和 ICMP协议的网络数据包提供了灵活性。</p>
<p><span style="color: #434cb1"><strong>为什么要关心网络仿真？</strong></span><br />VS2010 网络仿真可以为基于网络的应用程序开发人员和测试人员模拟所需的网络环境、评估应用程序性能、预测变化的影响、 做技术优化的决定。 与硬件测试床相比，由 Visual Studio Team System 提供的网络仿真将是一个更便宜、 更灵活的解决方案。</p>
<p><span style="color: #434cb1"><strong>如何使用 Visual Studio 2010 提供的网络仿真？</strong></span><br />使用 Visual Studio 2010 的网络仿真最简单方式是创建一个测试项目，修改测试设置 （以前是运行配置）。&nbsp; </p>
<p><span style="color: #434cb1">为单元测试设置网络仿真</span><br />1.创建一个测试项目，并为测试项目添加测试 （例如：单元测试）<br />2.在解决方案下打开 &#8216;Local.testsettings'</p>
<p><img alt="Local.testsettings" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/a.JPG" width="332" height="274" /></p>
<p>或者在菜单里选择&#8216;测试&#8217;，选择&#8216;编辑测试设置&#8217;，打开&#8216;本地测试设置&#8217;：</p>
<p><img alt="Test Menu - Local.testsettings" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/b.JPG" width="621" height="476" /></p>
<p>3.选择&#8216;执行条件&#8217; 并转到&#8216;收集器&#8217;，选中并允许&#8216; 网络仿真&#8217;</p>
<p><img alt="Enable Network Emulation" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/c.JPG" width="526" height="389" /></p>
<p>4.然后点击 &#8220; Advanced&#8230; &#8221; 按钮，选择您希望使用的网络的配置文件&nbsp; </p>
<p><img alt="Select Network Profile" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/d.JPG" width="527" height="367" /></p>
<p>5.保存测试设置。 当测试运行开始时，您选择的网络仿真将启动；在运行完成后，它就会停止。</p>
<p><strong>请注意</strong>： 此测试设置中指定的网络仿真除了不适用于负载测试外, 可用于其它任何测试。</p>
<p><br /><span style="color: #434cb1">为负载测试设置网络仿真<br /></span>在负载测试中使用网络仿真，可以通过在负载测试向导中设置网络组合来实现：</p>
<p>1.为测试项目创建负载测试</p>
<p>2.启动负载测试向导，到达&#8216;网络组合&#8217;页</p>
<p><img alt="Load Test Wizard - Network Mix" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/e.JPG" width="627" height="383" /></p>
<p>3.在创建负载测试时，可能希望模拟通过多种类型的网络连接产生的负载的情况, 通过点击 &#8216;添加&#8217;按钮来添加多种网络类型</p>
<p>4.完成负载测试向导，运行测试</p>
<p>5.当测试运行开始时，您选择的网络仿真将启动；在运行完成后，它就会停止。<br />&nbsp;</p>
<p><span style="color: #434cb1"><strong>测试运行配置</strong></span><br />为测试完成网络仿真配置后， </p>
<p>1.如果您想在本地上执行测试, 则在测试设置&#8216;执行条件&#8217;页上选择&#8216;从本地执行测试&#8217;单选按钮 </p>
<p><img alt="Execute Tests Locally" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/f.JPG" width="528" height="389" /></p>
<p>2.如果您想在远程测试代理上执行测试：</p>
<p><img alt="Execute Tests Remotely" src="http://p.blog.csdn.net/images/p_blog_csdn_net/zhengxiyun/EntryImages/20090623/g.jpg" width="904" height="746" /></p>
<p>&nbsp; a.选择&#8216;远程执行测试&#8217;单选按钮</p>
<p>&nbsp; b.输入负载测试控制器的名称，选择要运行测试的负载测试代理名称</p>
<p>&nbsp; c.点击&#8216;预览&#8217;查看与选择条件匹配的代理</p>
<p>3.点击&#8216;应用&#8217;保存设置，运行测试 </p>  <img src ="http://www.cnblogs.com/xiyunzheng/aggbug/1516165.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516165.html" target="_blank">http://www.cnblogs.com/xiyunzheng/archive/2009/07/03/1516165.html</a><br/>作者博客: <a href="http://www.cnblogs.com/xiyunzheng/" target="_blank">http://www.cnblogs.com/xiyunzheng/</a> <a href="http://www.cnblogs.com/xiyunzheng/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47944/" target="_blank">Google App Engine出现故障宕机6小时</a>]]></description></item><item><title>动画入门，用actionscript实现A*寻路算法【游戏自动寻路】</title><link>http://www.cnblogs.com/yung/archive/2009/07/03/1516102.html</link><dc:creator>yung</dc:creator><author>yung</author><pubDate>Fri, 03 Jul 2009 02:56:00 GMT</pubDate><guid>http://www.cnblogs.com/yung/archive/2009/07/03/1516102.html</guid><comments>http://www.cnblogs.com/yung/archive/2009/07/03/1516102.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.cnblogs.com/yung//comments/commentRss/1516102.html</wfw:commentRss><description><![CDATA[<p>什么是寻路算法？</p>
<p>寻路算法就是游戏中，绕开障碍物，到达目标点的一种算法</p>
<p>寻路算法有很多，但是怎么绕开障碍物并且以最适合的线路走，一直是大家研究的焦点</p>
<p>A*寻路算法是游戏中比较经典比较常用的算法。</p>
<p>初次研究，我也参考了不少文档，现在整理和核心代码与大家分享</p>
<p>下面是演示</p>
<p>&nbsp;黄色的代表路，黑色代表障碍物，绿色代表小人，点击鼠标到任意位置，小人就会自动寻路到此位置</p>
<p>
<object id="MyPath" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="500" height="500">
   <param name="movie" value="http://www.gaoxiaos.com/mytest/MyPath.swf"     />
   <param name="quality" value="high"     />
   <param name="bgcolor" value="#869ca7"     />
   <param name="allowScriptAccess" value="sameDomain"     />
   <embed src="http://www.gaoxiaos.com/mytest/MyPath.swf" quality="high" bgcolor="#869ca7" width="500" height="500" name="MyPath" align="center" play="true" loop="false" quality="high" allowscriptaccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer">   </embed>
 </object></p>
<p>&nbsp;</p>
<p>下面是核心代码（参考一位高人的代码写的）</p>
<p>&nbsp;</p>
[代码]
<p>&nbsp;</p><img src ="http://www.cnblogs.com/yung/aggbug/1516102.html?type=1" width = "1" height = "1" /><br/><br/>---------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/yung/archive/2009/07/03/1516102.html" target="_blank">http://www.cnblogs.com/yung/archive/2009/07/03/1516102.html</a><br/>作者博客: <a href="http://www.cnblogs.com/yung/" target="_blank">http://www.cnblogs.com/yung/</a> <a href="http://www.cnblogs.com/yung/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</a>]]></description></item><item><title>说出“……我们真的考虑了很多”的时候，你还剩下什么——再论眼高手低</title><link>http://www.cnblogs.com/cp800614/archive/2009/07/03/1516056.html</link><dc:creator>陈鹏（偶是坏人）</dc:creator><author>陈鹏（偶是坏人）</author><pubDate>Fri, 03 Jul 2009 02:04:00 GMT</pubDate><guid>http://www.cnblogs.com/cp800614/archive/2009/07/03/1516056.html</guid><comments>http://www.cnblogs.com/cp800614/archive/2009/07/03/1516056.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/cp800614//comments/commentRss/1516056.html</wfw:commentRss><description><![CDATA[摘要: 虽然“盲目为需求镀金”是个很不好的习惯，但有时我们总会不自觉地希望加上点什么，以标榜自己的专业。所以，就常常听到“……其实，我们真的考虑了很多问题……”<img src ="http://www.cnblogs.com/cp800614/aggbug/1516056.html?type=1" width = "1" height = "1" /><br/><br/>-------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/cp800614/archive/2009/07/03/1516056.html" target="_blank">http://www.cnblogs.com/cp800614/archive/2009/07/03/1516056.html</a><br/>作者博客: <a href="http://www.cnblogs.com/cp800614/" target="_blank">http://www.cnblogs.com/cp800614/</a> <a href="http://www.cnblogs.com/cp800614/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a>]]></description></item><item><title>C#简单游戏外挂制作(以Warcraft Ⅲ为例)</title><link>http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html</link><dc:creator>流牛木马</dc:creator><author>流牛木马</author><pubDate>Thu, 02 Jul 2009 19:57:00 GMT</pubDate><guid>http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html</guid><comments>http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html#Feedback</comments><slash:comments>50</slash:comments><wfw:commentRss>http://www.cnblogs.com/azure//comments/commentRss/1515967.html</wfw:commentRss><description><![CDATA[<p>&nbsp;&nbsp;&nbsp; 网上有很多外挂制作的教程，大多是讲针对大型网络游戏的，主要包含一些抓包、反汇编、C++的知识综合。事实也如此，常见的外挂都是使用VC++写的，从来没有过C#或者其他.NET语言编写的外挂。</p>
<p>&nbsp;&nbsp;&nbsp; 作为微软.NET技术的忠实粉丝，这难免是一种遗憾。不过不要紧，下面流牛木马就教大家两招，包教包会，免收学费。 ：)</p>
<p>&nbsp;&nbsp;&nbsp; 其实作为游戏外挂来说，主要就是三个功能：模拟键盘操作、模拟鼠标操作、修改内存数据。修改内存数据比较难，但模拟鼠标键盘的操作却很简单。很多流行游戏的外挂，都可以只通过模拟鼠标键盘来实现，例如：劲舞团、QQ音速、连连看、各类网页游戏，以及各类大型网游中的自动打怪、自动吃药等等。</p>
<p>&nbsp;&nbsp;&nbsp; Warcraft &#8546;，学名魔兽争霸之冰封王座，俗称魔兽，简称war3，在最近六七年风靡全球。最近两年，war3在中国又掀起了玩DOTA的新高潮。</p>
<p>&nbsp;&nbsp;&nbsp; 本文制作DOTA游戏中的显血、改键外挂为例，简单地介绍如何使用C#语言制作游戏外挂。</p>
<p>&nbsp;&nbsp;&nbsp; 最终界面如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/azure/WindowsLiveWriter/CWarcraft_2C5B/image_2.png"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/azure/WindowsLiveWriter/CWarcraft_2C5B/image_thumb.png" width="113" height="127" /></a>&nbsp;&nbsp;&nbsp; 本示例包含两个功能：显血；将Q键改为小键盘的7键。玩war3的同学都知道，这两个功能对于war3(尤其是DOTA)相当重要。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 首先简单介绍一下，外挂程序模拟键盘的原理。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 外挂程序与游戏程序是两个不同的进程。外挂程序使用Windows提供的API找到游戏程序的进程，并设置键盘钩子(什么叫做钩子？你不知道，但<a href="http://baike.baidu.com/view/626139.htm" target="_blank">百度知道</a>。)设置完钩子后，我们再监控游戏进程中用户的按键，并根据用户需求进行处理，完成某些模拟键盘动作。&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 了解了这个过程之后，我们就可以开始整理思路了。完成外挂一共需要以下四个步骤：</p>
<p><strong>一、声明Windows API 中的函数和常量</strong></p><pre class="code"><span style="color: green">      //键盘Hook结构函数
        </span>[<span style="color: #2b91af">StructLayout</span>(<span style="color: #2b91af">LayoutKind</span>.Sequential)]
        <span style="color: blue">public class </span><span style="color: #2b91af">KeyBoardHookStruct
        </span>{
            <span style="color: blue">public int </span>vkCode;
            <span style="color: blue">public int </span>scanCode;
            <span style="color: blue">public int </span>flags;
            <span style="color: blue">public int </span>time;
            <span style="color: blue">public int </span>dwExtraInfo;
        }
        <span style="color: blue">#region </span>DllImport
        <span style="color: green">//设置钩子
        </span>[<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"user32.dll"</span>, CharSet = <span style="color: #2b91af">CharSet</span>.Auto, CallingConvention = <span style="color: #2b91af">CallingConvention</span>.StdCall)]
        <span style="color: blue">public static extern int </span>SetWindowsHookEx(<span style="color: blue">int </span>idHook, <span style="color: #2b91af">HookProc </span>lpfn, <span style="color: #2b91af">IntPtr </span>hInstance, <span style="color: blue">int </span>threadId);
        [<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"user32.dll"</span>, CharSet = <span style="color: #2b91af">CharSet</span>.Auto, CallingConvention = <span style="color: #2b91af">CallingConvention</span>.StdCall)]
        <span style="color: green">//抽掉钩子
        </span><span style="color: blue">public static extern bool </span>UnhookWindowsHookEx(<span style="color: blue">int </span>idHook);
        [<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"user32.dll"</span>, CharSet = <span style="color: #2b91af">CharSet</span>.Auto, CallingConvention = <span style="color: #2b91af">CallingConvention</span>.StdCall)]
        <span style="color: green">//调用下一个钩子
        </span><span style="color: blue">public static extern int </span>CallNextHookEx(<span style="color: blue">int </span>idHook, <span style="color: blue">int </span>nCode, <span style="color: #2b91af">IntPtr </span>wParam, <span style="color: #2b91af">IntPtr </span>lParam);
        <span style="color: green">//取得模块句柄 </span>
        [<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"kernel32.dll"</span>, CharSet = <span style="color: #2b91af">CharSet</span>.Auto, CallingConvention = <span style="color: #2b91af">CallingConvention</span>.StdCall)]
        <span style="color: blue">private static extern </span><span style="color: #2b91af">IntPtr </span>GetModuleHandle(<span style="color: blue">string </span>lpModuleName);

        <span style="color: green">//寻找目标进程窗口</span></pre><pre class="code"><span style="color: green">        </span>[<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"USER32.DLL"</span>)]
        <span style="color: blue">public static extern </span><span style="color: #2b91af">IntPtr </span>FindWindow(<span style="color: blue">string </span>lpClassName,
            <span style="color: blue">string </span>lpWindowName);
<span style="color: green">         //设置进程窗口到最前 </span></pre><pre class="code">        [<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"USER32.DLL"</span>)]
        <span style="color: blue">public static extern bool </span>SetForegroundWindow(<span style="color: #2b91af">IntPtr </span>hWnd);
       <span style="color: green">//模拟键盘事件 </span></pre><pre class="code">        [<span style="color: #2b91af">DllImport</span>(<span style="color: #a31515">"User32.dll"</span>)]
        <span style="color: blue">public static extern void </span>keybd_event(<span style="color: #2b91af">Byte </span>bVk, <span style="color: #2b91af">Byte </span>bScan, <span style="color: #2b91af">Int32 </span>dwFlags, <span style="color: #2b91af">Int32 </span>dwExtraInfo);</pre><a href="http://11011.net/software/vspaste"></a>
<blockquote><pre class="code"><span style="color: green">//释放按键的常量
   </span><span style="color: blue">private const int </span>KEYEVENTF_KEYUP =2;</pre></blockquote><pre class="code">       本例所使用的函数比较少，它们都在系统的USER32.dll里，包括：设置和取消钩子、调用下一个钩子、导入进程、模拟键盘等等。我们依次导入它们。</pre><pre class="code">       这些函数的命名规范合理，几乎只根据函数名就能知道其功能。</pre><pre class="code">       如果读者对于其中的某些函数不熟悉，请自行搜索MSDN。</pre><a href="http://11011.net/software/vspaste"></a>
<p><strong>二、使用Windows API设置钩子</strong>&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了以上windows API函数的声明，下一步就是设置钩子了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 寥寥两行代码，但包含了相当丰富的内容。</p><pre class="code"><span style="color: green">//委托
</span><span style="color: blue">public delegate int </span><span style="color: #2b91af">HookProc</span>(<span style="color: blue">int </span>nCode, <span style="color: #2b91af">IntPtr </span>wParam, <span style="color: #2b91af">IntPtr </span>lParam);</pre><pre class="code">&nbsp;</pre><a href="http://11011.net/software/vspaste"></a><pre class="code"><span style="color: blue">public void </span>Hook_Start()
    {
        <span style="color: green">// 安装键盘钩子
        </span><span style="color: blue">if </span>(hHook == 0)
        {
            KeyBoardHookProcedure = <span style="color: blue">new </span><span style="color: #2b91af">HookProc</span>(KeyBoardHookProc);

            hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle(<span style="color: #2b91af">Process</span>.GetCurrentProcess().MainModule.ModuleName), 0);
                     
        }
    }</pre><pre class="code">&nbsp;</pre><pre class="code">    先介绍一下设置钩子的明星函数：SetWindowsHookEx 。它的参数说明如下。</pre>
<p>SetWindowsHookEx(<br />idHook: Integer;&nbsp;&nbsp; {钩子类型}<br />lpfn: TFNHookProc; {函数指针}<br />hmod: HINST;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {包含钩子函数的模块(EXE、DLL)句柄; 一般是 HInstance; 如果是当前线程这里可以是 0}<br />&nbsp; dwThreadId: DWORD&nbsp; {关联的线程; 可用 GetCurrentThreadId 获取当前线程; 0 表示是系统级钩子}<br />): HHOOK;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {返回钩子的句柄; 0 表示失败} 
<p>&nbsp; 
<p>&nbsp;&nbsp;&nbsp; 请注意lpfn这个参数。上面的解释是&#8220;函数指针&#8221;。在C#中，是不能直接使用指针的，更不要说函数指针了。我们可以采用C#中的委托（delegate）来实现函数指针的功能。 
<p>&nbsp;&nbsp;&nbsp; 于是乎，在上面的代码中，我们定义了一个处理键盘消息函数的委托KeyBoardHookProcedure = <span style="color: blue">new </span><span style="color: #2b91af">HookProc</span>(KeyBoardHookProc)，并将它作为参数传入SetWindowsHookEx 内。KeyBoardHookProc就是被委托的具体函数。 
<p>&nbsp;</p><a href="http://11011.net/software/vspaste"></a>
<p><strong>三、监控用户操作</strong></p>
<p><strong>&nbsp;</strong>&nbsp; 设置好钩子后，我们可以在被委托的函数中写入监控用户操作与模拟键盘的代码。</p><pre class="code"><span style="color: blue">public static int </span>KeyBoardHookProc(<span style="color: blue">int </span>nCode, <span style="color: #2b91af">IntPtr </span>wParam, <span style="color: #2b91af">IntPtr </span>lParam)
        {
       <span style="color: green">//监控用户键盘输入</span></pre><pre class="code">         <span style="color: #2b91af">KeyBoardHookStruct </span>input = (<span style="color: #2b91af">KeyBoardHookStruct</span>)<span style="color: #2b91af">Marshal</span>.PtrToStructure(lParam, <span style="color: blue">typeof</span>(<span style="color: #2b91af">KeyBoardHookStruct</span>));

            <span style="color: green">//截获Home  键          </span></pre><pre class="code"><span style="color: green">            </span><span style="color: blue">if </span>(input.vkCode == (<span style="color: blue">int</span>)<span style="color: #2b91af">Keys</span>.Home)
            {
<span style="color: green">              //此处写入其他操作逻辑 </span>               </pre><pre class="code">            }
       
<span style="color: green">           // 继续执行下一个钩子程序</span><span style="color: green">
            </span><span style="color: blue">return </span>CallNextHookEx(hHook, nCode, wParam, lParam);

        }</pre><a href="http://11011.net/software/vspaste"></a>
<p><strong></strong>&nbsp;</p>
<p><strong>四、根据用户需要模拟键盘操作</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显血功能：</strong>玩war3的都知道，war3自带的显血快捷键有3个。Alt键是显示所有单位生命，[ 键显示友方单位生命，] 键显示地方单位生命。外挂需要做的事情仅仅是模拟一直按着某个键不松手而已。由于Alt键与其他很多键构成组合键，故我们不能模拟长按Alt，否则会影响正常游戏。我们的解决方案应该是模拟长按 [ 键和 ] 键。代码如下：</p><pre class="code"><span style="color: green">              //获得魔兽程序的句柄
                </span><span style="color: #2b91af">IntPtr </span>wcHandle = FindWindow(<span style="color: blue">null</span>, <span style="color: #a31515">"Warcraft III"</span>);

                <span style="color: green">//如果钩子有效
                </span><span style="color: blue">if </span>(wcHandle != <span style="color: #2b91af">IntPtr</span>.Zero)
                {
                    <span style="color: green">//设置游戏窗口到最前
                    </span>SetForegroundWindow(wcHandle);</pre><pre class="code"><span style="color: blue">                byte </span>VK_NUM1 = 219;   <span style="color: green">//键盘上 [ 键的代码。按[可显示友方单位生命值。
                  </span><span style="color: blue">byte </span>VK_NUM2 = 221;   <span style="color: green">// 键盘上] 键的代码。按]可显示敌方单位生命值。
                  </span>keybd_event(VK_NUM1, 0, 0, 0); <span style="color: green">//长按[
                </span>keybd_event(VK_NUM2, 0, 0, 0);  <span style="color: green">//长按]</span></pre><a href="http://11011.net/software/vspaste"></a><pre class="code">               }</pre><a href="http://11011.net/software/vspaste"></a>
<p><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 改键：</strong> 小键盘（Numpad）上的快捷键很不方便按，所以很多玩家喜欢把小键盘上的键改到左边的字母键盘。玩DOTA的同学都知道，没有任何英雄的技能使用"Q&#8221;这个快捷键(召唤师有一种球是"Q"(不是技能))。于是我们把小键盘上的7键改到Q上，也不会造成任何冲突。方法也很简单：如果监控到用户按"Q&#8221;键，则像游戏进程发送小键盘上的"7"键。代码如下：</p><pre class="code"><span style="color: green">        //如果用户按了Q键
          </span><span style="color: blue">if </span>(input.vkCode == (<span style="color: blue">int</span>)<span style="color: #2b91af">Keys</span>.Q)
          {
              <span style="color: green">//获得魔兽程序的句柄
              </span><span style="color: #2b91af">IntPtr </span>wcHandle = FindWindow(<span style="color: blue">null</span>, <span style="color: #a31515">"Warcraft III"</span>);

              <span style="color: green">//如果钩子有效
              </span><span style="color: blue">if </span>(wcHandle != <span style="color: #2b91af">IntPtr</span>.Zero)
              {
                  <span style="color: green">//设置游戏窗口到最前
                  </span>SetForegroundWindow(wcHandle);
                  <span style="color: blue">byte </span>VK_Q = (<span style="color: blue">byte</span>)<span style="color: #2b91af">Keys</span>.NumPad7;
                  keybd_event(VK_Q, 0, 0, 0);<span style="color: green">//按下小键盘7
                  </span>keybd_event(VK_Q, 0, KEYEVENTF_KEYUP, 0); <span style="color: green">//松开小键盘7
              </span>}
              <span style="color: blue">return </span>1;
          }</pre>
<p>好了，到这里就把模拟键盘的外挂介绍完了。模拟鼠标与之非常类似，请用户自行揣摩。本文仅做抛砖引玉，欢迎感兴趣的朋友来流牛木马的博客进行讨论。</p>
<p>&nbsp;</p>
<p>附件：<a href="http://files.cnblogs.com/azure/War3显血外挂.zip" target="_blank">外挂成品下载</a>(运行需要.net 2.0以上环境)</p>
<p>&nbsp;参考文献：《<a href="http://interop123.com/" target="_blank">精通.NET互操作</a>》。感谢作者黄际洲、崔晓源的赠书，我终于学以致用了一回～ ：）</p><img src ="http://www.cnblogs.com/azure/aggbug/1515967.html?type=1" width = "1" height = "1" /><br/><br/>----------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html" target="_blank">http://www.cnblogs.com/azure/archive/2009/07/03/1515967.html</a><br/>作者博客: <a href="http://www.cnblogs.com/azure/" target="_blank">http://www.cnblogs.com/azure/</a> <a href="http://www.cnblogs.com/azure/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47935/" target="_blank">暴风称新旧版更换完毕 总计超4000万用户换装</a>]]></description></item><item><title>KLSudoku 1.2 数独游戏软件发布</title><link>http://www.cnblogs.com/ttylikl/archive/2009/07/03/1515948.html</link><dc:creator>ttylikl</dc:creator><author>ttylikl</author><pubDate>Thu, 02 Jul 2009 16:46:00 GMT</pubDate><guid>http://www.cnblogs.com/ttylikl/archive/2009/07/03/1515948.html</guid><comments>http://www.cnblogs.com/ttylikl/archive/2009/07/03/1515948.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/ttylikl//comments/commentRss/1515948.html</wfw:commentRss><description><![CDATA[<h4>KLSudoku数独游戏软件说明：</h4>
<p>KLSudoku是一款完全免费，功能强大的数独游戏软件。使用C#开发，完全免费和开放源码。</p>
<p>1、题目经典&ldquo;无限&rdquo;。除了随安装包提供的近5万条经典题目，还可以随机生成各种难度的题目。<br />2、可以提高玩家的解题技巧。KLSudoku实现了大量的常用经典技巧，并且可以选出最为合适的题目来提示玩家，并图解如何使用该技巧。并且还可以给出完整的解体步骤给玩家学习。<br />3、有解题记录。玩家随时可以挑战自己的过往记录。  </p>
<h4>下载地址：</h4>
<p>大题库版本 <a title="http://klsudoku.googlecode.com/files/KLSudoku1.2Full.exe" href="http://klsudoku.googlecode.com/files/KLSudoku1.2Full.exe">http://klsudoku.googlecode.com/files/KLSudoku1.2Full.exe</a></p>
<p>小题库版本 <a title="http://klsudoku.googlecode.com/files/KLSudoku1.2Mini.exe" href="http://klsudoku.googlecode.com/files/KLSudoku1.2Mini.exe">http://klsudoku.googlecode.com/files/KLSudoku1.2Mini.exe</a></p>
<h4>天空软件站下载地址：</h4>
<p><a title="http://www.skycn.com/soft/52904.html" href="http://www.skycn.com/soft/52904.html">http://www.skycn.com/soft/52904.html</a></p>
<h4>版本发布说明：</h4>
<h4><a name="2009.7.2（v1.2）">2009.7.2（v1.2）</a></h4>
<ol>
<li><a name="2009.7.2（v1.2）">新增功能： </a> 
<ul>
<li><a name="2009.7.2（v1.2）">增加BUG+1解题技巧 </a> </li>
<li><a name="2009.7.2（v1.2）">增加游戏历史浏览和排行榜功能 </a> </li>
<li><a name="2009.7.2（v1.2）">增加游戏计时和填数情况统计显示的功能 </a> </li>
<li><a name="2009.7.2（v1.2）">重新设计键盘操作方法（严西建议） </a> </li>
<li><a name="2009.7.2（v1.2）">增加突显热点数字的功能（严西建议） </a> </li>
<li><a name="2009.7.2（v1.2）">增加一些数独相关网站链接 </a> </li>
<li><a name="2009.7.2（v1.2）">增加以表格形式复制题目的功能，增强复制解题步骤的功能 </a> </li>
<li><a name="2009.7.2（v1.2）">增加恢复上次运行窗口大小的功能，改进启动体验 </a> </li>
<li><a name="2009.7.2（v1.2）">减少更新检查频度，优化软件更新逻辑 </a> </li>
<li><a name="2009.7.2（v1.2）">改进候选数标记删除的展示效果（默认显示为不存在） </a> </li>
<li><a name="2009.7.2（v1.2）">增加多种用户可定制的配置选项 </a></li>
</ul>
</li>
<li><a name="2009.7.2（v1.2）">问题修正： </a> 
<ul>
<li><a name="2009.7.2（v1.2）">修正一些对数格或者候选数颜色标注的错误 </a> </li>
<li><a name="2009.7.2（v1.2）">修正X-Chain解题技巧在特定情况下会出现遗漏的问题 </a></li>
</ul>
</li>
</ol>
<p>对KLSudoku有任何建议或意见，欢迎与我联系。可以直接写邮件给我（<a href="mailto:ttylikl@qq.com">ttylikl@qq.com</a>），或者加入到数独爱好者QQ群 106249 里进行讨论。</p><img src ="http://www.cnblogs.com/ttylikl/aggbug/1515948.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/ttylikl/archive/2009/07/03/1515948.html" target="_blank">http://www.cnblogs.com/ttylikl/archive/2009/07/03/1515948.html</a><br/>作者博客: <a href="http://www.cnblogs.com/ttylikl/" target="_blank">http://www.cnblogs.com/ttylikl/</a> <a href="http://www.cnblogs.com/ttylikl/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47934/" target="_blank">3.5版既出 Firefox面临新挑战</a>]]></description></item><item><title>游戏大厅 从基础开始（4）-通过L2X用配置文件反射组装程序(VB only)</title><link>http://www.cnblogs.com/waynebaby/archive/2009/07/03/1515911.html</link><dc:creator>韦恩卑鄙</dc:creator><author>韦恩卑鄙</author><pubDate>Thu, 02 Jul 2009 16:16:00 GMT</pubDate><guid>http://www.cnblogs.com/waynebaby/archive/2009/07/03/1515911.html</guid><comments>http://www.cnblogs.com/waynebaby/archive/2009/07/03/1515911.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/waynebaby//comments/commentRss/1515911.html</wfw:commentRss><description><![CDATA[摘要: 这一章没有什么技术含量　但是懒惰驱动的工作方式已经深入我的人格。　这也是分享嘛<img src ="http://www.cnblogs.com/waynebaby/aggbug/1515911.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/waynebaby/archive/2009/07/03/1515911.html" target="_blank">http://www.cnblogs.com/waynebaby/archive/2009/07/03/1515911.html</a><br/>作者博客: <a href="http://www.cnblogs.com/waynebaby/" target="_blank">http://www.cnblogs.com/waynebaby/</a> <a href="http://www.cnblogs.com/waynebaby/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47930/" target="_blank">Bing首页将显示各国美景 顺推Silverlight</a>]]></description></item><item><title>Gesture APIs-Furthering Windows Mobile 6.5 Touch Gesture Framework</title><link>http://www.cnblogs.com/dearsj001/archive/2009/07/02/WindowsMobileGestureAPI.html</link><dc:creator>施炯</dc:creator><author>施炯</author><pubDate>Thu, 02 Jul 2009 15:42:00 GMT</pubDate><guid>http://www.cnblogs.com/dearsj001/archive/2009/07/02/WindowsMobileGestureAPI.html</guid><comments>http://www.cnblogs.com/dearsj001/archive/2009/07/02/WindowsMobileGestureAPI.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/dearsj001//comments/commentRss/1515920.html</wfw:commentRss><description><![CDATA[<p><a href="http://www.cnblogs.com/dearsj001/archive/2009/06/04/WindowsMobile65DeveloperToolKit.html">&nbsp;&nbsp;&nbsp; Windows mobile 6.5开发者工具包</a>在6月初就已经面世了。它给广大技术爱好者带来的新特性包括Widgets和Gesture API。在Widgets应用上，已经有开发人员进行了探索和尝试，包括<a href="http://www.shangducms.com/">Guojing</a>、<a href="http://www.cnblogs.com/edusoft/archive/2009/06/23/1509754.html">马老师</a>和<a href="http://www.cnblogs.com/procoder/">Jake.NET</a>等。这次我们就一起来看看TDK中Gesture API的例子。</p> <p>&nbsp;&nbsp;&nbsp; 在开始之前，对于Gesture API，我们需要注意的有以下两点：</p> <p>&nbsp;&nbsp;&nbsp; 第一，Gesture API只能使用在Windows Mobile 6.5平台上，之前版本的Windows Mobile都不支持，所以，就不要想着在Windows Mobile 6.0或者6.1(因为目前很多人的设备都是这个版本)上来开发基于Gesture API的应用。</p> <p>&nbsp;&nbsp;&nbsp; 第二，Windows Mobile 6.5平台上，也只是Classic and Professional SKUs支持Gesture API，，因为大家知道，Standard是不支持触摸的。</p> <p>&nbsp;&nbsp;&nbsp; TDK自带的Gesture API例子位于%\Windows Mobile 6.5 Developer Tool Kit\Samples目录下。包含三个工程：GestureMetricsSample、PhysicsEngineSample和WagSample。这三个工程分别用到了Gesture.h、GesturePhysicsEngine.h和WindowAutoGesture.h这三个头文件，都位于%\Program Files\Windows Mobile 6 SDK\PocketPC\Include\Armv4i目录下。</p> <h1>Gesture Metrics Sample</h1> <p>&nbsp;&nbsp;&nbsp; GestureMetricsSample这个例子展示了如何使用WM_GESTURE中的GID_HOLD(保持), GID_SELECT(选择)和GID_DOUBLESELECT(双击)这三个消息。</p> <p>&nbsp;&nbsp;&nbsp; 当用户用触笔单击屏幕的时候，启动保持定时器（ID_HOLD_TIMER）；如果在WM_GESTURE中检测到是GID_HOLD，那么就kill这个保持定时器（ID_HOLD_TIMER），并提示用户；如果在WM_GESTURE中检测到是GID_SELECT，那么就启动双击定时器（ID_DOUBLESELECT_TIMER）；如果在WM_GESTURE中检测到是GID_DOUBLESELECT，那么就kill这个双击定时器（ID_DOUBLESELECT_TIMER），并提示用户。</p> <p><a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_2.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb.png" width="155" border="0"></a> <a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_4.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_1.png" width="157" border="0"></a> <a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_6.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_2.png" width="157" border="0"></a></p> <h1>Physics Engine Sample</h1> <p>&nbsp;&nbsp;&nbsp; PhysicsEngineSample这个例子展示了如何使用WM_GESTURE中<a href="http://msdn.microsoft.com/en-us/library/dd353242(VS.85).aspx">GID_PAN</a>, GID_SCROLL 和<a href="http://msdn.microsoft.com/en-us/library/dd353242(VS.85).aspx">GID_END</a>这三个消息。需要注意的是，在使用Physics Engine之前，需要声明一个HPHYSICSENGINE类型的全局变量。</p> <p>&nbsp;&nbsp;&nbsp; 有了这个Physics Engine，我们就可以在设备上浏览大分辨率的图片，使用触笔在触摸屏上滑动，选择需要浏览的部分，在过渡时，具有一个滑动滚屏的效果，这个功能目前是新加入的。大家可以尝试用windows mobile自带的"图片和视频"工具打开图片，这时是没有滑动滚屏的效果的，但是程序中如果我们使用了Physics Engine，就可以产生滑动滚屏的效果。</p> <p><a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_10.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_4.png" width="157" border="0"></a>&nbsp;<a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_8.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_3.png" width="158" border="0"></a> </p> <p></p> <h1>WagSample</h1> <p>&nbsp;&nbsp;&nbsp; WagSample这个例子实现的功能和PhysicsEngineSample这个例子是一样的，不同的是，它加入了用户的选择，即我们用户可以选择&#8220;是否支持触摸笔&#8221;、&#8220;是否支持滚屏&#8221;等等。</p> <p><a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_12.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_5.png" width="158" border="0"></a> <a href="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_14.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="244" alt="image" src="http://images.cnblogs.com/cnblogs_com/dearsj001/WindowsLiveWriter/GestureAPIsFurthe.5touchgestureframework_141FC/image_thumb_6.png" width="158" border="0"></a> </p> <p>&nbsp;&nbsp;&nbsp; 这里只是很肤浅地介绍了WM6.5 TDK自带的Gesture API例子，主要是MSDN上的资料实在是太少（目前好像还没有）。基本上是把自己使用这三个例子的体会发上来和大家共享一下。下一步的目标是自己做一个实例，学会如何使用Gesture API，并逐渐解开它神秘的面纱。</p> <img src ="http://www.cnblogs.com/dearsj001/aggbug/1515920.html?type=1" width = "1" height = "1" /><br/><br/>------------------------------------------------------------------------------------------------------------<br/>本文链接: <a href="http://www.cnblogs.com/dearsj001/archive/2009/07/02/WindowsMobileGestureAPI.html" target="_blank">http://www.cnblogs.com/dearsj001/archive/2009/07/02/WindowsMobileGestureAPI.html</a><br/>作者博客: <a href="http://www.cnblogs.com/dearsj001/" target="_blank">http://www.cnblogs.com/dearsj001/</a> <a href="http://www.cnblogs.com/dearsj001/rss" target="_blank">[订阅]</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a><br/>新闻频道: <a href="http://news.cnblogs.com/n/47929/" target="_blank">Gmail 的标签马上就会支持拖拽操作了</a>]]></description></item></channel></rss>