﻿<?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/leafyoung/</link><description>leafyoung v.s. dotnet</description><language>zh-cn</language><lastBuildDate>Sun, 05 Jul 2009 16:46:29 GMT</lastBuildDate><pubDate>Sun, 05 Jul 2009 16:46:29 GMT</pubDate><ttl>60</ttl><item><title>[ATL/ActiveX]全屏显示ActiveX控件</title><link>http://www.cnblogs.com/leafyoung/archive/2007/10/16/926514.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 16 Oct 2007 10:56:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/10/16/926514.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/926514.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/10/16/926514.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/926514.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/926514.html</trackback:ping><description><![CDATA[现在很多视频共享网站如土豆等都使用flash控件作为播放器界面，而利用flash实现全屏非常简单，只要把fullscreen属性设置为true即可，其他的播放器如mediaplayer等都有类似实现全屏效果的属性，但是怎么在自定义的ActiveX控件实现这种效果呢？基本的实现其实比较简单，网上也有不少例子，不过大都有bug。下面是我修改得到的一个实现，效果还算不错，原理比较简单，就不废话了。<br />
<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">if</span><span style="color: rgb(0, 0, 0);">&nbsp;(m_bFullScreen)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;LockWindowUpdate(TRUE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetParent(m_hWnd,&nbsp;m_OldWndParent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetWindowPlacement(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">m_OldWndPlacement);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetForegroundWindow(m_OldWndParent);&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetFocus(m_OldWndParent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetFocus(m_hWnd);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;LockWindowUpdate(FALSE);<br />
}<br />
</span><span style="color: rgb(0, 0, 255);">else</span><span style="color: rgb(0, 0, 0);"><br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;GetWindowPlacement(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">m_OldWndPlacement);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;nScreenWidth&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;GetSystemMetrics(SM_CXSCREEN);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">int</span><span style="color: rgb(0, 0, 0);">&nbsp;nScreenHeight&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;GetSystemMetrics(SM_CYSCREEN);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_OldWndParent&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;::GetParent(m_hWnd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetParent(m_hWnd,&nbsp;GetDesktopWindow());<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;WINDOWPLACEMENT&nbsp;wp1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">wp1,&nbsp;</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(WINDOWPLACEMENT));<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.length&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">sizeof</span><span style="color: rgb(0, 0, 0);">(WINDOWPLACEMENT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.showCmd&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;SW_SHOWNORMAL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.rcNormalPosition.left&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.rcNormalPosition.top&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">0</span><span style="color: rgb(0, 0, 0);">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.rcNormalPosition.right&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;nScreenWidth;<br />
&nbsp;&nbsp;&nbsp;&nbsp;wp1.rcNormalPosition.bottom&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;nScreenHeight;<br />
&nbsp;&nbsp;&nbsp;&nbsp;SetWindowPlacement(</span><span style="color: rgb(0, 0, 0);">&amp;</span><span style="color: rgb(0, 0, 0);">wp1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetForegroundWindow(GetDesktopWindow());<br />
&nbsp;&nbsp;&nbsp;&nbsp;::SetForegroundWindow(m_hWnd);<br />
}<br />
<br />
m_bFullScreen&nbsp;</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 0);">!</span><span style="color: rgb(0, 0, 0);">m_bFullScreen;<br />
</span></div>
<br />
上面代码纠正了网上能找到的代码中一个比较明显的<span style="color: red;">焦点切换</span>的问题，纯粹是我多次实验的结果，不要问我为什么这么写。<br />
<br />
当然，这段代码也是有问题的，而且相当奇怪，在"ActiveX Control Test Container"中运行一切正常，但是一旦把这个控件嵌入的网页后，全屏，切回，改变IE窗口大小，再试图全屏就不会成功了，而是只有左上角有显示，结果比较诡异：<br />
<br />
<img src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/weird_fs.PNG" alt="" border="0" height="376" width="624" /><br />
<br />
没有什么头绪，如果有人知道的话，赐教^_^<br />
<br />
<img src ="http://www.cnblogs.com/leafyoung/aggbug/926514.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47989/" target="_blank">Twitter无处不在 魔兽世界Twitter发送器插件发布</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>]]></description></item><item><title>近期业余生活以及计划（持续更新）</title><link>http://www.cnblogs.com/leafyoung/archive/2007/07/11/813614.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Wed, 11 Jul 2007 02:14:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/07/11/813614.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/813614.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/07/11/813614.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/813614.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/813614.html</trackback:ping><description><![CDATA[<strong>
1、单排轮滑</strong>：进行中，目前为止已学会直线滑行、弧线滑行，每天练习1-2个小时，已经坚持近一个月；接下来的练习重点是倒滑、交叉步、正滑转倒滑以及单扣弧停止法，计划在接下来的一个月中学会^_^<br />
<br />
自学教材：<a href="http://www.kfsy.cn/bbs1/dispbbs.asp?boardID=68&amp;ID=31940&amp;page=1">初级轮滑视频教程</a><br />
<br />
<span style="color: red; font-style: italic;">2004/07/16 update<br />
<br />
</span>倒滑已经有点感觉了，能比较流畅地进行一些基本动作，要点就在于髋关节的移动和重心的变换！<br />
<br />
现在的瓶颈在于身体的柔韧性不好，练习蟹步遇到困难了，特别是左脚的灵活性大有问题，对于正滑转倒滑、单扣弧等练习带来很大的影响！另外，单脚的支撑能力还有待加强，不然交叉步的练习就无法进行下去，目前目标是单脚能比较稳定地滑行3米。<br />
<br />
<span style="color: red; font-style: italic;">2007/07/19 Update</span><br />
<br />
正滑转倒滑有点进步，左右方向的转体踩步马马虎虎，不过由于单脚支撑能力有点问题，成功率只能达到80%左右，而且是在中低速的情况下。还有，左脚不够灵活，交叉步还是不行啊！<br />
<br />
<span style="color: red;"><em>2007/08/03 Update</em></span><br />
<br />
练习单脚滑行已经快10天了，一只脚全脚掌着地，另一只脚单轮着地（无论是放在身前还是身后）的情况下，现在应该可以很稳地滑行n（n&gt;15）米的距离；但是在仅仅单脚着地（没有任何支撑）的情况下结果却不是很理想，左脚还好一些，马马虎虎能滑行7、8米吧，右脚则彻底没戏，滑行个1、2米身体就往外侧翻，根本无法稳定下来；昨天晚上决定要把原因找出来，脱了鞋袜光脚站在地板上结果就找到原因了，很明显，左脚单脚站立的时候后整个脚掌除了足弓部分构成一个平面，而右脚后脚跟中心却有块骨头稍微突出，结果右脚单脚站立的时候整个人好像站在一个倒锥形上以上，很难平衡下来。没有办法，这种生理上的问题一时半会是解决不了的，只能从心理上加以调整了，唉!!!<br />
<br />
小结：到目前为止，倒滑已经没有问题了，正滑转倒滑也将就，相应地也学会了正滑转倒滑停止法！交叉步需要的场地比较大，一直没什么机会练习，进境不大！<br />
<br />
<em><span style="color: red;"><span style="color: red;">2007/08/12 Update</span></span></em><br />
<br />
哈哈，调整了心态之后进步很大，本来是左脚比右脚强，现在反过来，右脚能单脚滑行更长的距离了，真是太神奇了，看来只要决心够大，没有什么困难是克服不了的。单脚滑行现在也差不多了，要开始练交叉步和T－刹了，相信我很快可以练成的，加油^_^<br />
<br />
<em><span style="color: red;">2007/08/30 Update</span></em><br />
<br />
因为上周姐姐来北京，白天有空就陪她出去玩，晚上教她玩游戏，所以一直没顾得上练习。不过昨晚试了一下，发现自己的水平不仅没有下降，单脚滑行的能力似乎还见长了，呵呵，真开心啊！不过还是得坚持下去，等达到既定的标准再说，呵呵<br />
<br />
因为平时几乎不出去玩，到北京三年了，连故宫、长城都没去过，说出去真是丢人哪！这次托姐姐的福终于都去逛了一遍，终于可以昂首挺胸做人了，嘿嘿！当然，玩了一个星期，只花了1300元，还不算太奢侈！<br />
<br />
<strong>
2、英语</strong>：进行中，学习<a href="http://www.wwenglish.com/">www.wwenglish.com</a>中的<a href="http://www.wwenglish.com/en/voa/ime/index.htm">中级美语（基础篇）</a>，感觉不错，比较简单，听懂没什么问题<br />
<br />
<span style="color: red; font-style: italic;">学习资源收集：</span><br />
<br />
<a href="http://www.21manager.com/dispbbs.asp?n=147,113631,0,0,0,,0,0" target="_blank">http://www.21manager.com/dispbbs.asp?n=147,113631,0,0,0,,0,0</a><br />
<br />
<span style="color: red; font-style: italic;">2007/07/27 Update</span><br />
<br />
发现一些视频分享网站是非常不错的学英语的地方，目前看土豆里面的<a href="http://www.tudou.com/search/programs/?posto=%2Fsearch%2Fprograms%2F&amp;kw=%BF%D5%D6%D0%D3%A2%D3%EF&amp;nav_search_target=0&amp;comefrom=1">空中英语</a>就看得不亦乐乎，推荐ing^_^!<br />
<span style="color: red;"><br />
<em>
2007/08/30 Update</em></span><br />
<br />
历史又一次证明咱家具有超凡脱俗的前瞻性，前两个月一直在学习英语，没什么目的，就是为了充实自己的生活，花的时间也不多，每天半个小时而已。现在居然排上用场了，要不是前期的铺垫，估计给那个老外交流就要费老牛鼻子劲了，呵呵<br />
<br />
<span style="color: red;">2007/09/11 Update</span><br />
<p><span style="font-family: 宋体;">昨晚做了一个奇怪的梦：在小区北门溜达的时候有个中年男子向我问路，交流了几句之后发现我也不知道，我就让他问保安去。梦的情节不仅不奇怪而且简直有点无聊，奇怪的是那个男子用的居然是英文，而梦中的我楞了一下之后也磕磕绊绊地用英语回答了，具体谈话内容记不得了，不过当我让他问保安的时候，我还想了一下保安应该怎么说，最后好像用了</span>guard<span style="font-family: 宋体;">，不知道对不对，</span>^_^</p>
<p><span style="font-family: 宋体;">这可是有史以来第一个纯英文的梦，极其有历史意义，看来受李阳老师的</span>Crazy English<span style="font-family: 宋体;">影响不浅，特记录在案，呵呵！</span></p>
<p>
</p>
<p><span style="font-family: 宋体;">再说说英语学习的心得</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><u><span style="font-family: 宋体;">单词：</span></u></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">纯粹背单词是痛苦的，特别是这些单词都是孤立的时候。即使你强行把它们记住，在很多情况下你也不知道如何使用或者应该在什么场合下使用它。如果能把这些单词构建成一个网状的立体结构，也就是说将这些单词联系在一起记忆就显得可靠多了，比如</span>carpet<span style="font-family: 宋体;">和</span>carp<span style="font-family: 宋体;">；</span>deduce<span style="font-family: 宋体;">、</span>induce<span style="font-family: 宋体;">和</span>seduce<span style="font-family: 宋体;">；</span>aisle<span style="font-family: 宋体;">和</span>corridor<span style="font-family: 宋体;">；</span>prodigy<span style="font-family: 宋体;">和</span>genius<span style="font-family: 宋体;">等等，通过比较（特别是类比）他们的拼写、发音、含义等相关性，利用已经记住的单词记忆新的单词，往往可以事半功倍。另外就是利用造句法，将</span>n<span style="font-family: 宋体;">（</span>n&lt;=5<span style="font-family: 宋体;">）个生词练成一个生动的句子，通过背诵这个句子来记忆单词同样是一个好方法</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><u><span style="font-family: 宋体;">发音和音标：</span></u></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">英语和汉语一样，是一种交流的工具。在口语中发音是相当重要的。比如</span>come in<span style="font-family: 宋体;">和</span>
coming<span style="font-family: 宋体;">，前者在连读的时候和后者发音相当接近，假设这样一个场景，你在应门的时候回答</span>come in<span style="font-family: 宋体;">，但是门外的人却认为听到的是</span>coming<span style="font-family: 宋体;">，这将产生两个完全不同的结果；前者是你自己开门进来吧，后者却是表示等一下，我马上过来给你开门。所以为了避免造成误解和交流障碍，标准的发音是必需的，虽然不需要达到播音员的那种水平。</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">和纠正发音可以跟着李阳的音标速成系列学习一下，个人比较喜欢</span>KK<span style="font-family: 宋体;">音标那部分，也就是美式发音，因为美式发音比较圆润，如果身为南方人学得也比较痛苦，因为舌头实在是翘不起来啊！</span></p>
<p style="margin-left: 18pt; text-indent: -18pt;"><u><span style="font-family: 宋体;">短语和俚语：</span></u></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">很多情况下，你会发现虽然你每个单词都认识，但是放在一起就不知道它们是什么意思了，比如</span>put up with<span style="font-family: 宋体;">，</span>fed up<span style="font-family: 宋体;">，</span>jet leg<span style="font-family: 宋体;">平等，这对很多人都非常头疼，学习短语（有时候也叫片语）好像没什么捷径，只能靠增加阅读量来记忆。而作为特殊的短语，俚语（</span>Slang<span style="font-family: 宋体;">）它往往代表一个国家或地区的文化，如果对文化背景一无所知，那么就很难明白为什么</span>green hand<span style="font-family: 宋体;">表示生手；为什么</span>fly off the handle<span style="font-family: 宋体;">会代表一个人很生气；为什么</span>break the leg<span style="font-family: 宋体;">表示祝你好运。在现实生活中，那些艰深的单词使用的几率并不高，掌握了基本词汇之后假如运用得当的话已经足够简单交流；但是假如你对这些俚语一点都不知道的话，这真正的美</span>/<span style="font-family: 宋体;">英国人交流那就真的是</span>talk over your head<span style="font-family: 宋体;">了。</span></p>
<p style="margin-left: 18pt; text-indent: 0cm;"><span style="font-family: 宋体;">注：通过这些天学习，发现掌握俚语对于看那些好莱坞大片很有好处，起码以前我就听不动</span>redneck<span style="font-family: 宋体;">和</span>turn the tables<span style="font-family: 宋体;">是什么意思，</span>^_^</p>
<strong>
3、民谣吉他</strong>：计划中，好像成本较高，特别是学电吉他的话要千元以上，要是买了又坚持不下去的话就亏大了，要慎重考虑<br />
<br />
<img src ="http://www.cnblogs.com/leafyoung/aggbug/813614.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47988/" target="_blank">Firefox 3.5匆忙推出漏洞多 Mozilla本月将更新</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>]]></description></item><item><title>远程控制之屏幕截取 小结</title><link>http://www.cnblogs.com/leafyoung/archive/2007/07/05/806722.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Thu, 05 Jul 2007 02:01:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/07/05/806722.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/806722.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/07/05/806722.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/806722.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/806722.html</trackback:ping><description><![CDATA[为了实现高速屏幕传输，势必不能每次都截取整个屏幕，这样做的后果就是待传输的过大数据量和有限带宽（假设约20K～50K）之间的矛盾。为了让显示更加流畅，必须在单位时间内利用有限的带宽传输近可能多帧的图象过来，这里就需要实现<span style="font-weight: bold;"></span><span style="font-weight: bold; color: red;">差异截屏</span>！<br><br>实现差异截屏有以下三种方案可以选择：<br>
<ol>
    <li>（BitBlt或DirectDraw） + （隔行取样或CRC或Hash)<br>
    </li>
    <li>Hook: 参考VNC实现
    </li>
    <li>虚拟显卡：参考陈经韬的<a href="http://delphi.ktop.com.tw/board.php?cid=31&amp;fid=79&amp;tid=81302">例子</a>，无源码（Delphi） </li>
</ol>
<span style="font-style: italic;">注：目前网上能找到源码的一般都是使用第一种方案。</span><br><br>使用差异截屏有可能需要进行屏幕分块，就是将整个屏幕分成N个小区域，每次仅仅传输通过某种算法判断已经变化的部分，区域的大小一般都是根据经验设定！<br><br>为了进一步减少待传输的数据量，还可以选择性地进行压缩，压缩方式也有两种选择：<br>
<ol>
    <li>BMP -&gt; JPEG：有损压缩，压缩比相对较高
    </li>
    <li>通用压缩：Zip、ZLib(Ex)等 </li>
</ol>
通过以上的步骤，一般就可以实现在广域网上实现相对比较流畅的屏幕传输了，当然，采用虚拟显卡方式好像速度最快，Hook方式次之，不过实现难度也是从高到低的！<br><br>目前该应用的瓶颈主要是<span style="font-weight: bold; color: red; text-decoration: underline;">带宽</span>的限制，为此需要尽量减小差异截屏后获得的数据量，但是测试的结果也只能达到每秒数帧的效果，和网上某些文章提到的动辄几十帧上百帧（注：个人感觉有水分^_^）的效果相差甚远！<br><br><span style="color: red; font-style: italic;">2007/07/06 Update:</span><br><br>使用虚拟显卡驱动本质上是编写一个Display Mirror Driver，安装之后该驱动和物理显卡驱动将会收到完全相同的事件，根据这些事件可以判断屏幕的那些区域发生改变，而且在驱动中可以直接操作显存，就不需要耗费大量的CPU进行bltting！<br><br>据说PcAnyWhere、远程桌面（WIN2000之后）以及部分远程控制软件均采用该技术实现。<br><br>DirectDraw好像也是可以直接操作现存的，不知道和用Mirror Driver这种方法比效率相差有多大！？<br><br>参考：http://www.osronline.com/showthread.cfm?link=111960
<br><br><span style="font-style: italic; color: red;">2007/07/11 Update:</span><br><br>在用GDI Bitblt函数或DirectDraw进行高速截屏时，为了得知那些区域发生变化，必须保存一份屏幕拷贝，通过将最新的屏幕镜像和保存的拷贝进行比较，从而获得发生变化的区域！用Bitblt获得屏幕拷贝速度非常慢，为了获得1280*720大小的截屏，在我机器上需要350ms左右，用DirectDraw在这一点上就好多了。<br><br>VNC采用Hook的方法截获所有相关的Windows消息，然后判断各个消息对哪些屏幕矩形区域有影响，把这些矩形区域合成一个Region，在更新的时候进行更新这些区域。<br><br>采用虚拟驱动的原理和Hook方法类似，不过截获的不是Windows消息，而是直接在驱动中截获GDI函数调用，在这些函数中获得变化的矩形区域并组合成最终的Region，由于驱动和普通应用程序处于不同的特权级别，因此在读显存之后需要将数据传到ring3，处理起来相当麻烦，而且处理不善将有很大的效率问题！<br><br>     <img src ="http://www.cnblogs.com/leafyoung/aggbug/806722.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47987/" target="_blank">预测：Twitter最可能收购的十家公司</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>]]></description></item><item><title>[C#]mouse_event模拟点击时坐标参数无效？！</title><link>http://www.cnblogs.com/leafyoung/archive/2007/06/29/799837.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Fri, 29 Jun 2007 02:40:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/06/29/799837.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/799837.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/06/29/799837.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/799837.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/799837.html</trackback:ping><description><![CDATA[<div style="FONT-FAMILY: Verdana"><span style="FONT-SIZE: 10pt">实现远程屏幕控制必不可少的函数之一就是mouse_event（或者SendInput），这个函数可以用来模拟鼠标移动、单击、双击等功能，但是描述这个函数的文档可谓少之又少，几段雷同的代码转来转去就是没有一些深入讨论的，MSDN中描述也语焉不详。在昨天试验中发现一个问题，希望有研究的&#8220;同志&#8221;能够帮我解答，^_^</span><br>
<p style="FONT-FAMILY: Verdana"><span style="FONT-SIZE: 10pt">在如下模拟鼠标单击的代码中，我希望在相对屏幕左上角(10, 10)的位置点击一下：</span></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65535</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Screen.PrimaryScreen.Bounds.Width;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65535</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Screen.PrimaryScreen.Bounds.Height;<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000">mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftDown&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;dx,&nbsp;dy,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftUp&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;dx,&nbsp;dy,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);</span></div>
<br><span style="FONT-SIZE: 10pt">无论从哪个角度看，上面这段代码也是没啥问题的，过程相当简单，首先进行坐标变换，然后两次调用mouse_event模拟鼠标按下和弹起，然而，代码的运行效果却出乎我的意料，程序并没有在（10， 10）的位置模拟鼠标单击事件，而是在<span style="FONT-WEIGHT: bold; COLOR: red">当前位置</span>触发鼠标单击！<br><br>经过多次验证，发现对于鼠标点击而言，dx、dy这两个参数好像不起作用，无论对这两个参数设置什么值，鼠标点击事件永远在当前位置触发！<br><br>猜测：为什么会这样呢？一个比较合理的解释是为了避免在界面上给用户造成混淆，从而禁止了在非鼠标当前位置处触发鼠标单击事件！具体原因不详！！！<br><br>引申：由于不能在任意位置触发鼠标点击事件，假如我有这么一个需要：鼠标不移动，在（10，10）位置点击一下！那我们应该怎么办呢？在上面假设成立的情况下我们是无法直接实现这个需求的，下面提供一个间接的方法：<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">POINT&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;POINT();<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">GetCursorPos(</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;p);<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ShowCursor(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SetCursorPos(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftDown&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftUp&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;SetCursorPos(p.X,&nbsp;p.Y);<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ShowCursor(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000"></span></div>
<br>在上面的代码中，通过隐藏鼠标，最终将鼠标位置移动到最初位置并显示解决这个问题，因为速度很快，用户几乎不会察觉！<br><br>P.S. 假如哪位对mouse_event这个函数比较熟悉的话，望不吝赐教！<br><br>完整示例代码：<span style="COLOR: red"><em>//UPDATE: 代码折叠功能有问题，我选择&#8220;全部折叠&#8221;后居然无法展开了，奇怪！！！<br></em></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.ComponentModel;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Data;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Drawing;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Linq;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Windows.Forms;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Runtime.InteropServices;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;WindowsApplication2<br><img id=Codehighlighter1_253_2369_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_2369_Open_Text.style.display='none'; Codehighlighter1_253_2369_Closed_Image.style.display='inline'; Codehighlighter1_253_2369_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_253_2369_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_2369_Closed_Text.style.display='none'; Codehighlighter1_253_2369_Open_Image.style.display='inline'; Codehighlighter1_253_2369_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_253_2369_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_253_2369_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;partial&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Form1&nbsp;:&nbsp;Form<br><img id=Codehighlighter1_297_2367_Open_Image onclick="this.style.display='none'; Codehighlighter1_297_2367_Open_Text.style.display='none'; Codehighlighter1_297_2367_Closed_Image.style.display='inline'; Codehighlighter1_297_2367_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_297_2367_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_297_2367_Closed_Text.style.display='none'; Codehighlighter1_297_2367_Open_Image.style.display='inline'; Codehighlighter1_297_2367_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_297_2367_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_297_2367_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&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;mouse_event(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dwFlags,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dwData,&nbsp;IntPtr&nbsp;dwExtraInfo);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&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;SetCursorPos(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;GetCursorPos(</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;POINT&nbsp;p);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[DllImport(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User32</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">extern</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ShowCursor(</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;bShow);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[StructLayout(LayoutKind.Sequential)]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;POINT<br><img id=Codehighlighter1_793_855_Open_Image onclick="this.style.display='none'; Codehighlighter1_793_855_Open_Text.style.display='none'; Codehighlighter1_793_855_Closed_Image.style.display='inline'; Codehighlighter1_793_855_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_793_855_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_793_855_Closed_Text.style.display='none'; Codehighlighter1_793_855_Open_Image.style.display='inline'; Codehighlighter1_793_855_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_793_855_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_793_855_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;X;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Y;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[Flags]<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">enum</span><span style="COLOR: #000000">&nbsp;MouseEventFlags<br><img id=Codehighlighter1_918_1233_Open_Image onclick="this.style.display='none'; Codehighlighter1_918_1233_Open_Text.style.display='none'; Codehighlighter1_918_1233_Closed_Image.style.display='inline'; Codehighlighter1_918_1233_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_918_1233_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_918_1233_Closed_Text.style.display='none'; Codehighlighter1_918_1233_Open_Image.style.display='inline'; Codehighlighter1_918_1233_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_918_1233_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_918_1233_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Move&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0001</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeftDown&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0002</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LeftUp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0004</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RightDown&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0008</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RightUp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0010</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MiddleDown&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0020</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MiddleUp&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0040</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wheel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x0800</span><span style="COLOR: #000000">,<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Absolute&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0x8000</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Form1()<br><img id=Codehighlighter1_1267_1312_Open_Image onclick="this.style.display='none'; Codehighlighter1_1267_1312_Open_Text.style.display='none'; Codehighlighter1_1267_1312_Closed_Image.style.display='inline'; Codehighlighter1_1267_1312_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1267_1312_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1267_1312_Closed_Text.style.display='none'; Codehighlighter1_1267_1312_Open_Image.style.display='inline'; Codehighlighter1_1267_1312_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1267_1312_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1267_1312_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test1_Click(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_1384_1750_Open_Image onclick="this.style.display='none'; Codehighlighter1_1384_1750_Open_Text.style.display='none'; Codehighlighter1_1384_1750_Closed_Image.style.display='inline'; Codehighlighter1_1384_1750_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1384_1750_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1384_1750_Closed_Text.style.display='none'; Codehighlighter1_1384_1750_Open_Image.style.display='inline'; Codehighlighter1_1384_1750_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1384_1750_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1384_1750_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65535</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Screen.PrimaryScreen.Bounds.Width;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dy&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">65535</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Screen.PrimaryScreen.Bounds.Height;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftDown&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;dx,&nbsp;dy,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftUp&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;dx,&nbsp;dy,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Test2_Click(</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<br><img id=Codehighlighter1_1822_2361_Open_Image onclick="this.style.display='none'; Codehighlighter1_1822_2361_Open_Text.style.display='none'; Codehighlighter1_1822_2361_Closed_Image.style.display='inline'; Codehighlighter1_1822_2361_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1822_2361_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1822_2361_Closed_Text.style.display='none'; Codehighlighter1_1822_2361_Open_Image.style.display='inline'; Codehighlighter1_1822_2361_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1822_2361_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1822_2361_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;POINT&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;POINT();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;p);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_1921_2229_Open_Image onclick="this.style.display='none'; Codehighlighter1_1921_2229_Open_Text.style.display='none'; Codehighlighter1_1921_2229_Closed_Image.style.display='inline'; Codehighlighter1_1921_2229_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1921_2229_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1921_2229_Closed_Text.style.display='none'; Codehighlighter1_1921_2229_Open_Image.style.display='inline'; Codehighlighter1_1921_2229_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1921_2229_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_1921_2229_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowCursor(</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCursorPos(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftDown&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mouse_event((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(MouseEventFlags.LeftUp&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MouseEventFlags.Absolute),&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;IntPtr.Zero);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">finally</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_2263_2351_Open_Image onclick="this.style.display='none'; Codehighlighter1_2263_2351_Open_Text.style.display='none'; Codehighlighter1_2263_2351_Closed_Image.style.display='inline'; Codehighlighter1_2263_2351_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_2263_2351_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_2263_2351_Closed_Text.style.display='none'; Codehighlighter1_2263_2351_Open_Image.style.display='inline'; Codehighlighter1_2263_2351_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_2263_2351_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_2263_2351_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCursorPos(p.X,&nbsp;p.Y);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowCursor(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
</span></div>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/799837.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47986/" 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>]]></description></item><item><title>Javascript: IE中命名函数直接量的Bug？</title><link>http://www.cnblogs.com/leafyoung/archive/2007/04/28/730934.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sat, 28 Apr 2007 04:44:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/04/28/730934.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/730934.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/04/28/730934.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/730934.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/730934.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/leafyoung/archive/2007/04/28/730934.html'>阅读全文</a><img src ="http://www.cnblogs.com/leafyoung/aggbug/730934.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47985/" target="_blank">杰克逊悼念仪式或成史上最大规模Web活动</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>]]></description></item><item><title>ASP.NET AJAX Client Library: 更繁？更简？</title><link>http://www.cnblogs.com/leafyoung/archive/2007/04/11/708679.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Wed, 11 Apr 2007 04:45:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/04/11/708679.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/708679.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/04/11/708679.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/708679.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/708679.html</trackback:ping><description><![CDATA[摘要: 这两周周末终于决定忙里偷闲，利用业余时间好好学习ASP.NET AJAX，虽然服务器端控件比如UpdatePanel、Timer等很好用，不过总感觉雾里看花，没法看到ASP.NET AJAX的原貌，所以决定花些时间学习它的Client Library。断断续续看了一些资料，在稍微了解大概之后决定用它写点东西检验一下学习成果，毕竟实际动手才能证明我确实掌握了这门技术，而不仅是纸上谈兵，呵呵。拖拽效果&nbsp;&nbsp;<a href='http://www.cnblogs.com/leafyoung/archive/2007/04/11/708679.html'>阅读全文</a><img src ="http://www.cnblogs.com/leafyoung/aggbug/708679.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47984/" target="_blank">《商业周刊》:Mozilla的志愿者开发模式被复制</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>]]></description></item><item><title>喜讯，公司换宽屏液晶显示器了</title><link>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688538.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 26 Mar 2007 07:24:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688538.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/688538.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688538.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/688538.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/688538.html</trackback:ping><description><![CDATA[今天公司给所有研发系列的员工、以及所有怀孕的女员工换液晶显示器（宽屏，三星）了，下一步就是给所有的员工换！<br><br>不过现在还不太适应，感觉屏幕变矮了，VS 2005显示的行数也少了，虽然还是17寸，感觉怪怪的，看来需要一段时间适应啊，呵呵@_@ 
<img src ="http://www.cnblogs.com/leafyoung/aggbug/688538.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</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>]]></description></item><item><title>分享：基于UDP协议实现可靠的数据传输</title><link>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688002.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 26 Mar 2007 02:35:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688002.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/688002.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/03/26/688002.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/688002.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/688002.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">这几天一直在研究P2P相关的技术，对于底层的传输使用了UDP协议，但是大家都知道UDP协议是不可靠的，如果在传输对话信息或文件的时候发生丢包，那么就会造成数据出错；即使不丢包，UDP协议也不能保证接收方按照发送的顺序接收到那些包，也会造成数据出问题！</span><br><br>为了使UDP有序可靠地发送数据，那么必须在它的基础上进行封装，实现类似TCP协议的功能，在网上找到的资料有:<br><a href="http://dev.csdn.net/author/huanghongbo/760eee4d4e7f48bbac43495ebd58a872.html">http://dev.csdn.net/author/huanghongbo/760eee4d4e7f48bbac43495ebd58a872.html</a><br><a href="http://www.htbsp.com/data/2007/0104/article_23737.htm">http://www.htbsp.com/data/2007/0104/article_23737.htm</a><br><a href="http://www.codelover.com/dev/5201/4191654.htm">http://www.codelover.com/dev/5201/4191654.htm</a><br><a href="http://dev.csdn.net/article/56/56196.shtm">http://dev.csdn.net/article/56/56196.shtm</a><br><br>上面资料中提到的方法大都是模拟TCP的做法，也就是重复&#8220;发送－确认－发送－确认&#8230;&#8230;&#8221;，当然这种过程是比较低效的，比较好的实现会使用&#8220;滑动窗口&#8221;机制进行流量控制，从而提升一部分性能！</span> <br><br>附：正在做一个仿MSN（或QQ、泡泡等）的IM程序，界面实在做得难看，大家如果有这方面的源码（只要有界面即可）不妨贡献一下，呵呵！<br><br>再附：我已经知道windowforms.net上面有一个 MSN Messenger Clone，不过只有一个主界面，消息发送窗口都没有，比较郁闷 
<img src ="http://www.cnblogs.com/leafyoung/aggbug/688002.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47977/" target="_blank">Mono 的Virtual PC 虚拟机</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>]]></description></item><item><title>C#线程：只要任何一个线程在运行，程序就不退出？！</title><link>http://www.cnblogs.com/leafyoung/archive/2007/03/25/687101.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sun, 25 Mar 2007 04:28:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/03/25/687101.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/687101.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/03/25/687101.html#Feedback</comments><slash:comments>33</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/687101.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/687101.html</trackback:ping><description><![CDATA[<div style="FONT-FAMILY: Verdana">第一次使用线程相关的东西就遇到一个很&#8220;奇怪&#8221;的问题，明明程序（或者说主线程）已经结束了，但是整个程序就是不退出，赖在进程列表里面！因为以前从来没遇到这个问题，而这个程序是我首次使用线程（土了点，呵呵），问题肯定是出在这里了，因此写了一个控制台程序进行验证，代码如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System;<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Collections.Generic;<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Text;<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Net;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Net.Sockets;<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&nbsp;System.Threading;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;Test<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Program<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&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></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;testThread&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Thread(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ThreadStart(Program.TestThread));<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testThread.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">testThread</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testThread.Start();<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&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;TestThread()<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.Sleep(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000"></span></div>
<br>运行上面这个例子，由于线程testThread是个死循环，所以这个线程是不会退出的。但是我的期望是主线程一旦结束，就意味着程序要退出了，那么那些辅助线程应该自动被结束才是。但显然从上面的实验代码运行结果可以看出：只要存在任何一个活动线程，那么进程就持续运行！<br><br>要解决这个问题也非常简单，在Main函数的结尾添加一行：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #000000">testThread.Abort();</span></div>
<br>那么就一切正常了，不过感觉有点多此一举，而且不明白为什么这么设计，系统完全可以自动帮我们这么做了嘛，难道有什么难以预料的不良后果么？？？<br><br>// update<br>纠正：应该是只要任何一个&#8220;前台&#8221;线程在运行，程序就无法退出<br></div>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/687101.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47970/" target="_blank">19岁天才黑客发布首个iPhone 3GS破解软件</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>]]></description></item><item><title>基于Web的仿WF工作流设计器</title><link>http://www.cnblogs.com/leafyoung/archive/2007/03/17/678401.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sat, 17 Mar 2007 10:12:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/03/17/678401.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/678401.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/03/17/678401.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/678401.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/678401.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><span style="FONT-SIZE: 10pt">微软的WF是个不错的工作流开发平台，相对于开源的工作流实现而言，它的设计器不可谓不漂亮（当然，也和我以前看到的连线式设计器大不一样），上个星期突然冒出个想法，能不能在Web页面上实现一个类似的工作流设计器呢？！大家都知道用js在Web页面上画线是困难的（实际上，根本就无法画出线来，除非用n个div元素模拟），但是WF的工作流设计器的样子非常容易在Web页面上实现，看来有戏！<br><br>有了这个想法后，我第一个反应就是上网搜索是不是已经有人做过类似的工作了，鉴于以前&#8220;惨痛&#8221;的经验：一般我能想出来的点子都已经有人做过了！果不其然，还真让我找到一个 </span><a style="FONT-SIZE: 12pt" href="http://www.netfxlive.com/">http://www.netfxlive.com/</a><span style="FONT-SIZE: 10pt">，不过还好，以前我的想法都是N年前就有人做好了，这次只不过是几个月前，而且好像还是个开发中的作品，呵呵！不过做得相当不错了，赞一个！<br><img height=492 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/netfxlive.png" width=717 border=0><br><br>下面是我仿照它的样子自己实现的，目前和它比功能差远了，不过界面看起来差不多吧，呵呵！<br><img height=491 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/mywfdesigner.png" width=716 border=0><br><br>如果对怎么实现感兴趣，到上面提供的网址，然后页面另存为，然后将就看看就行了，呵呵！<br></p>
</span>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/678401.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47969/" target="_blank">新浪邮箱大本营粉墨登场！Sina.cn开放注册</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>]]></description></item><item><title>[ASP.NET AJAX]谨记给UpdatePanel中动态添加的控件赋ID</title><link>http://www.cnblogs.com/leafyoung/archive/2007/02/08/644728.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Thu, 08 Feb 2007 05:05:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/02/08/644728.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/644728.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/02/08/644728.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/644728.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/644728.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt"><span style="FONT-FAMILY: Verdana">昨天下定决心对上次做的布局编辑器控件加以改进，其中最主要变化的就是要完全使用ASP.NET AJAX！但是很遗憾，虽然耳闻已久，但目前对ASP.NET AJAX的熟悉程度实在令人汗颜，而且有一段时间没有怎么关注了，以前学会的那点皮毛也忘得差不多了，不过即使从头开始也没什么大不了的。虽然决心很大，不过刚拿起UpdatePanel它就给了我一个下马威，实在有够郁闷的！</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">就是下面很简单的一段代码，意图很简单，动态创建一个UpdatePanel，然后在其中放置一个LinkButton！（为了做对比，我在UpdatePanel外面也放置了一个LinkButton）按照以前的经验，这就是实现局部刷新所需的全部工作了，而且ASP.NET AJAX 1.0中，UpdatePanel的ChildrenAsTriggers属性默认true，也就是说UpdatePanel中的LinkButton自动成为触发器。</span><br style="FONT-FAMILY: Verdana">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">public&nbsp;partial&nbsp;class&nbsp;_Default&nbsp;:&nbsp;System.Web.UI.Page<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;override&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnInit(EventArgs&nbsp;e)<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.OnInit(e);<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdatePanel&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UpdatePanel();<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.ID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyUpdatePanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinkButton&nbsp;lbInside&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LinkButton();<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbInside.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Inside&nbsp;updatepanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.ContentTemplateContainer.Controls.Add(lbInside);<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.PlaceHolder1.Controls.Add(p1);<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinkButton&nbsp;lbOutside&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LinkButton();<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbOutside.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Outside&nbsp;updatepanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.PlaceHolder1.Controls.Add(lbOutside);<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">可是运行结果却让我大跌眼镜（虽然我不带眼镜，呵呵），<span style="COLOR: red">点击&#8220;Inside updatepanel&#8221;并没有像我想的那样局部刷新，而是刷新了整个页面，出现的浏览历史记录就是明证</span>！而点击设计期添加的那个LinkButton则完全正常！<br><img height=240 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/updatepanl_linkbutton_view.PNG" width=466></span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">到了这里，出于对MS的一贯信任，我不禁怀疑起自己的智商来，那么一小段代码居然会有问题，难道我年纪轻轻就老年痴呆了？？？天哪！我战战兢兢查看了一下页面源码：</span><br style="FONT-FAMILY: Verdana"><img height=340 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/updatepanl_linkbutton_source.PNG" width=656><br><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">嗯，细看之下果然有点区别，那些&#8220;ctlXXX&#8221;无疑是自动生成的ID，但是我怎么就没看到对应的id属性呢？难道就是它们在搞鬼？反正死马做活马医，加上ID再说，再次运行，果然，一切搞定，哈哈~~~（旁白：果然是老年痴呆，至于笑成这样嘛！！！）</span><br style="FONT-FAMILY: Verdana">
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">public&nbsp;partial&nbsp;class&nbsp;_Default&nbsp;:&nbsp;System.Web.UI.Page<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;override&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnInit(EventArgs&nbsp;e)<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;base.OnInit(e);<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdatePanel&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UpdatePanel();<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.ID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">MyUpdatePanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinkButton&nbsp;lbInside&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LinkButton();<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="FONT-WEIGHT: bold; COLOR: red">lbInside.ID&nbsp;</span></span><span style="FONT-WEIGHT: bold; COLOR: red">=&nbsp;"lbInside"</span><span style="COLOR: #000000"><span style="FONT-WEIGHT: bold; COLOR: red">;</span><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbInside.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Inside&nbsp;updatepanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p1.ContentTemplateContainer.Controls.Add(lbInside);<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.PlaceHolder1.Controls.Add(p1);<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinkButton&nbsp;lbOutside&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LinkButton();<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lbOutside.Text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Outside&nbsp;updatepanel</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.PlaceHolder1.Controls.Add(lbOutside);<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">}</span></div>
</span>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/644728.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47968/" target="_blank">IE市场份额首次跌破60%</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>]]></description></item><item><title>VS 2005 BUG: 新增JScript文件编码问题引起乱码？</title><link>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641995.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 06 Feb 2007 04:15:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641995.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/641995.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641995.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/641995.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/641995.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">测试环境：WIN 2003 + VS2005(无SP1) + IE7，其他环境不详<br><br>在编写布局编辑器的过程中遇到了一个很奇怪的问题，着实让我郁闷了好几个小时，最后在同事（以前遇到过类似问题）的提醒下才发现是咋回事，个人认为这应该是VS 2005的一个BUG，至少说是一个不应该的疏忽！<br><br>如下图所示，我建立一个解决方案，包含两个工程[WebSite]WebSite1和[Web Control Library]EncodingTest：<br><img height=243 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/encodingtest_sln.PNG" width=333><br><br>EncodingTest中包含一个控件WebCustomControl1，然后在EncodingTest中（通过Add New Item对话框）添加一个JScript文件Test1.js，在WebSite1中添加一个JScript文件Test2.js，二者内容如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Test1.js</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">alert(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">alert&nbsp;中文&nbsp;from&nbsp;class&nbsp;library</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Test2.js</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">alert(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">alert&nbsp;中文&nbsp;from&nbsp;website</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
<br>然后将Test1.js以WebResource的方式嵌入到该assembly中，并注册到客户端，如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">[assembly:&nbsp;WebResource(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EncodingTest.Test1.js</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text/javascript</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&nbsp;EncodingTest<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[DefaultProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Text</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[ToolboxData(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&lt;{0}:WebCustomControl1&nbsp;runat=server&gt;&lt;/{0}:WebCustomControl1&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)]<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;WebCustomControl1&nbsp;:&nbsp;WebControl<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;OnPreRender(EventArgs&nbsp;e)<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Page.ClientScript.RegisterClientScriptResource(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(WebCustomControl1),<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">EncodingTest.Test1.js</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">}</span></div>
<br>在WebSite1的Default.aspx文件中插入如下代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form&nbsp;</span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="form1"</span><span style="COLOR: #ff0000">&nbsp;runat</span><span style="COLOR: #0000ff">="server"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">div</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">cc1:WebCustomControl1&nbsp;</span><span style="COLOR: #ff0000">ID</span><span style="COLOR: #0000ff">="WebCustomControl1_1"</span><span style="COLOR: #ff0000">&nbsp;runat</span><span style="COLOR: #0000ff">="server"</span><span style="COLOR: #ff0000">&nbsp;Text</span><span style="COLOR: #0000ff">="Test"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">div</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script&nbsp;</span><span style="COLOR: #ff0000">language</span><span style="COLOR: #0000ff">="javascript"</span><span style="COLOR: #ff0000">&nbsp;src</span><span style="COLOR: #0000ff">="Test2.js"</span><span style="COLOR: #0000ff">&gt;&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>好了，运行一下WebSite1，如果照理说结果很简单，就是两个alert先后输出&#8220;alert("alert 中文 from class library"); &#8221;和&#8220;alert 中文 from website &#8221;罢了，但是诡异的事情就此发生，弹出的两个对话框显示如下：<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/encodingtest_alert.PNG"><br><br>从本文的标题可以看出发生该问题的缘由：编码。经过检查，惊讶地发现，<span style="COLOR: red">在WebSite1中添加的JScript编码方式<strong><u>默认</u></strong>是UTF-8的，而在EncodingTest添加的JScript编码方式却<strong><u>默认</u></strong>是ANSI的</span>，这就是造成以上现象的罪魁祸首，无语ING&#8230;&#8230;<br><br>其实以上的问题还是小事，在布局编辑器编写过程中问题更为严重，由于（<span style="COLOR: red">ANSI编码方式的那个</span>）JScript文件中的中文注释，居然还可能引起其中JS代码执行出错，不过这个问题IE 6.0以及以下版本才会出现，我机器上用的是IE 7和Firefox 2，一开始还没注意到，直到在同事机器上测试才发现！（不过我现在怎么也复现不了，不知道漏了什么地方）<br><br>P.S. 前文提到，我同事以前也遇到这个问题，不过那时他用了其他的文本编辑器才导致出现问题，我却是始终在VS 2005开发环境中，居然也出现问题，实在是不该啊！ <br><br><span style="COLOR: red">Update：2007-02-06 13:48<br></span><span style="COLOR: red">1. 我猜测可能是工程项目模板中模板文件有问题（编码不统一???）导致的！</span></span> <br>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/641995.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</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>]]></description></item><item><title>[ASP.NET]如何灵活定制皮肤/页面：布局设计器介绍</title><link>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641582.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 06 Feb 2007 01:22:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641582.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/641582.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/02/06/641582.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/641582.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/641582.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt"><span style="FONT-FAMILY: Verdana">以前看过DotNetNuke 4（以下简称DNN）的部分源码，作为一个CMS它的实现无疑有很多值得借鉴的地方。个人比较注重页面的呈现部分，所以特别关注其中的换肤、布局等部分，虽然DNN的这方面的实现已经十分优秀，但是我认为还是有改进的地方的，这也是本文要介绍的主要内容：布局设计器！</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">那DNN在皮肤/布局方面到底有什么不好的呢？那就是，<span style="COLOR: red">用户不能很方便地添加新的皮肤</span>！要添加新的皮肤，只能是Web开发/设计人员设计添加新的用户控件（.ASCX，这是DNN皮肤的实现机制），并将相关的图片文件拷贝到Portals\*\Skins目录下，如果站点没有提供相关的上传功能的话，这项工作只能由管理员进行；而且修改起来也特别不方便，可能还需要重新上传。如果能够在线修改皮肤的布局和内容，那岂不是完美了么？！</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">为了达到以上目的，DNN那种将皮肤实现为&#8220;静态&#8221;的ascx形式显然不可取！大家知道，DNN的页面是通过将模块拖到指定皮肤上形成的，那么我们就模仿这种方式，就是说：皮肤是通过将模块拖放到一个空白页面形成的，这个空白页面已经由布局设计器拆分成特定的布局，如DNN内定的&#8220;三行，中间行分为三列&#8221;的标准布局（不知道怎么描述，大家能看懂么？我驾驭文笔的能力比较差的说！），当然，皮肤中应该留出一个或多个空白区域，让具体页面放置它们各自的内容。</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">如果理解了上面的描述的话，那么毫无疑问，第一步需要将空白页面拆成N个区域，然后才能往各个区域拖放模块形成皮肤。举个例子，我们将页面分成三行，然后往第一行和最后一行放置一个Html模块（看过DNN的人都应该知道这个模块的作用吧？！），然后编辑第一行的Html模块形成页头，编辑最后一行的Html模块形成页脚，哈哈，一个拥有页头、页脚，中间有个空白区域的皮肤就形成了！</span><br style="FONT-FAMILY: Verdana"><br style="FONT-FAMILY: Verdana"><span style="FONT-FAMILY: Verdana">目前我已经把布局编辑器封装成一个服务器端控件，利用ASP.NET 2.0引入的Callback特性，达到类似ajax的效果，演示截图如下：</span><br style="FONT-FAMILY: Verdana"><img height=509 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/layouteditor01.png" width=749><br><br>结合布局设计器以及ASP.NET WebPart框架，我做了一个基本可用的例子，证明其可行性，下面是简单拆分成两列的效果（嘻嘻，好像丑了点，毕竟我不是美工，没有任何加工的嘛）：<br><img height=384 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/layouteditor03.png" width=733><br><br>P.S. 以上均为个人学习研究结果，可能用于公司项目，不提供源码下载，不过实现也不复杂，想想我都能作，可见是多么简单啦，呵呵~~~<br style="FONT-FAMILY: Verdana"></span>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/641582.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</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>]]></description></item><item><title>过滤ASP.NET输出HTML中的无用空格</title><link>http://www.cnblogs.com/leafyoung/archive/2007/02/05/640882.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 05 Feb 2007 08:56:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2007/02/05/640882.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/640882.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2007/02/05/640882.html#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/640882.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/640882.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">刚才&#8220;不小心&#8221;检查了一下ASP.NET生成的代码，惊讶地发现ASP.NET输出的代码居然如此地不紧凑，在标签之间有无数的空格和制表符(TAB)，特别是用了嵌套表格之后，那景象真是惨不忍睹啊，有图为证：<br><img height=411 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/filter_ws_before.PNG" width=720><br><br>照理说在ASP.NET生成的代码中添加这么多无用的空格/tab可能是为了使生成的HTML代码更具可读性，但是由此带来的问题就是使输出的代码变大了，在带宽有限的今天简直就是一种犯罪，浪费用户的钱财，影响用户的体验嘛！<span style="COLOR: #ff0000">而且ASP.NET属于服务器端编程，不可能会直接编辑最终生成的HTML代码，就算把所有的空格/Tab都去了，也不会带来任何不好的影响的吧！？</span><br><br>基于以上考虑，祭出Reflector，果然发现HtmlTextWriter中有Indent属性控制着缩进大小，而且幸运的是该属性还是public类型的，真是天助我也，花了几分钟时间，捣鼓出如下代码：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;FilterHtmlTextWriter&nbsp;:&nbsp;HtmlTextWriter<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;FilterHtmlTextWriter(TextWriter&nbsp;writer,&nbsp;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;tabString)<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">(writer,&nbsp;tabString)<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Indent<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">get</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;始终返回0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">set</span><span style="COLOR: #000000">&nbsp;{&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Indent&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;始终置0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">}</span></div>
<br>然后重载页面的Render方法（如果所有页面有公共的基类的话就更好了），加入一行代码，如下：<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;partial&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;_Default&nbsp;:&nbsp;System.Web.UI.Page<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Render(HtmlTextWriter&nbsp;writer)<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;替换writer为我们自定义的类</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;FilterHtmlTextWriter(writer.InnerWriter,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">.Render(writer);<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;<img src="http://www.cnblogs.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">}</span></div>
<br>至此大功告成，让我们重新看看页面的输出，哇塞，讨厌的空格果然变少了@_@，如下图所示：<br><img height=411 alt="" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/filter_ws_after.PNG" width=720><br><br></span>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/640882.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</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>]]></description></item><item><title>在JavaScript中实现命名空间</title><link>http://www.cnblogs.com/leafyoung/archive/2006/10/11/526570.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Wed, 11 Oct 2006 10:17:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2006/10/11/526570.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/526570.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2006/10/11/526570.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/526570.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/526570.html</trackback:ping><description><![CDATA[<div id=p_ctl01_rptArticles_ctl00_pnlContent>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">注：好久没写了，今天把我在公司内网写的文章拷一份，出来露露脸，刚转Web开发，所以开始学JavaScript！<br><br>在引入命名空间之前，一个令开发人员头疼的问题就是如何防止函数名/类名和其他人的冲突，在一个公司内部项目组之间可以通过命名预定（比如加前缀等）解决这个问题，但是把视线放到整个软件开发领域，在当今协作开发相当盛行的时代，这个问题却依然存在。在使用多个第三方框架或类库的时候，你唯一能作的就是祈祷它们的命名不要冲突，如果真正发生这种灾难的话，你唯一能作的就是放弃其中一个（注：可能是我孤陋寡闻，呵呵）。命名空间的引入相当程度上解决了这个问题，当然，如果你使用的命名空间和其他公司不幸一样，而对方又是微软、SUN等大佬，那恭喜你，呵呵@_@!</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">从事Web开发不可避免要接触JavaScript，目前<strong><font color=#ff0000>最新版本的JavaScript还是不支持命名空间</font></strong>，所以命名冲突的问题凸显无疑，想象一下你引用了两个js文件，却发现由于命名问题导致你不得不放弃其中一个，从而导致多写了许多代码，无疑是十分令人沮丧的。在JavaScript新版本引入命名空间概念之前，发扬自立更生精神和创造性是我们程序员的基本义务;-)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">实现前提：与Delphi、C#等语言不同，JavaScript中的类并不是对象的定义，事实上JavaScript中并不存在真正的类，这里的<u>类实际上是用函数模拟实现</u>的，而JavaScript中的函数实际上是一个对象，因此在JavaScript中：<strong><u>一个类就是一个对象</u></strong>。这和传统概念概念极为不同，在JavaScript中，创建某个类的实例实际上就是将类（=对象，记住）复制了一份。看到这里，有点设计模式概念的应该就可以看出来了，在JavaScript中，类机制使用了<u><font color=#ff0000>原型（prototype）</font></u>模式。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">实现原理：既然看清楚了类的本质，那么问题就简单了，如果将GEA项目组所有JS类和函数作为属性放在名为GEA的对象里面，然后将GEA对象以属性的方式放在名为Grandsoft对象里面不就可以达到我们的目的，比如Grandsoft.GEA.Person实际上是在Grandsoft对象的属性GEA（也是一个对象）中的类Person（还是一个对象）。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">实现非常简单，整个命名空间机制的实现不超过20行代码，分析如下：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;声明一个全局对象Namespace，用来注册命名空间</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">Namespace&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Object();<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;全局对象仅仅存在register函数，参数为名称空间全路径，如"Grandsoft.GEA"</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">Namespace.register&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(fullNS)<br><img id=Codehighlighter1_145_583_Open_Image onclick="this.style.display='none'; Codehighlighter1_145_583_Open_Text.style.display='none'; Codehighlighter1_145_583_Closed_Image.style.display='inline'; Codehighlighter1_145_583_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_145_583_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_145_583_Closed_Text.style.display='none'; Codehighlighter1_145_583_Open_Image.style.display='inline'; Codehighlighter1_145_583_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_145_583_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_145_583_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;将命名空间切成N部分,&nbsp;比如Grandsoft、GEA等</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;nsArray&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fullNS.split('.');<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;sEval&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;sNS&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;i&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;nsArray.length;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_307_547_Open_Image onclick="this.style.display='none'; Codehighlighter1_307_547_Open_Text.style.display='none'; Codehighlighter1_307_547_Closed_Image.style.display='inline'; Codehighlighter1_307_547_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_307_547_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_307_547_Closed_Text.style.display='none'; Codehighlighter1_307_547_Open_Image.style.display='inline'; Codehighlighter1_307_547_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_307_547_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_307_547_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(i&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;sNS&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sNS&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;nsArray[i];<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;依次创建构造命名空间对象（假如不存在的话）的语句</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;比如先创建Grandsoft，然后创建Grandsoft.GEA，依次下去<img src="http://www.cnblogs.com/Images/dot.gif"></span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sEval&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">if&nbsp;(typeof(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sNS&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)&nbsp;==&nbsp;'undefined')&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sNS&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;=&nbsp;new&nbsp;Object();</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(sEval&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">)&nbsp;eval(sEval);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">上面就是在JavaScript中模拟命名空间机制的完整实现，使用方式如下：</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;注册命名空间Grandsoft.GEA,&nbsp;Grandsoft.GCM</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">Namespace.register(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Grandsoft.GEA</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>Namespace.register(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Grandsoft.GCM</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;在Grandsoft.GEA命名空间里面声明类Person</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">Grandsoft.GEA.Person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">(name,&nbsp;age)<br><img id=Codehighlighter1_189_233_Open_Image onclick="this.style.display='none'; Codehighlighter1_189_233_Open_Text.style.display='none'; Codehighlighter1_189_233_Closed_Image.style.display='inline'; Codehighlighter1_189_233_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_189_233_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_189_233_Closed_Text.style.display='none'; Codehighlighter1_189_233_Open_Image.style.display='inline'; Codehighlighter1_189_233_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_189_233_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_189_233_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;name;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.age&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;age;<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;给类Person添加一个公共方法show()</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">Grandsoft.GEA.Person.prototype.show&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()<br><img id=Codehighlighter1_311_371_Open_Image onclick="this.style.display='none'; Codehighlighter1_311_371_Open_Text.style.display='none'; Codehighlighter1_311_371_Closed_Image.style.display='inline'; Codehighlighter1_311_371_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_311_371_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_311_371_Closed_Text.style.display='none'; Codehighlighter1_311_371_Open_Image.style.display='inline'; Codehighlighter1_311_371_Open_Text.style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_311_371_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"></span><span id=Codehighlighter1_311_371_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.name&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;is&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.age&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;years&nbsp;old!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;演示如何使用类Person</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Grandsoft.GEA.Person(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">yanglf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">25</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>p.show();<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana">哈哈，简单吧，这么简单的代码我就不多说了，大家自己看着玩吧，其实我有点懒，呵呵@_@!!!<br></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"></p>
</div>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/526570.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</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>]]></description></item><item><title>【求教】如何控制MSHTML生成源码？</title><link>http://www.cnblogs.com/leafyoung/archive/2006/07/09/446677.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sun, 09 Jul 2006 11:28:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2006/07/09/446677.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/446677.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2006/07/09/446677.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/446677.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/446677.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">这几天利用休息时间做了一个Html设计器，实际上主界面就是一个WebBrowser控件（mshtml），使其进入编辑状态就是一个Html设计器了。也没什么大问题，就是对它生成的源码不大满意，只要我一回车，它就把内容包在&lt;p&gt;...&lt;/p&gt;内(如下图对话框所示)，而我想要的效果则是在两段内容之间插入&lt;br /&gt;，想了好久也没搞定，不知道哪位对IE编程有研究的，请多多指教，感激不尽！<br><br>P.S. 实在有点憋得慌，暂时放在首页了，勿怪，呵呵@_@<br><br><input id=Image1 type=image src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/html_designer.PNG" value=Image1 border=0 name=Html_Designer></span> 
<img src ="http://www.cnblogs.com/leafyoung/aggbug/446677.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</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>]]></description></item><item><title>学习ORM的困惑</title><link>http://www.cnblogs.com/leafyoung/archive/2005/11/29/287249.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 29 Nov 2005 11:50:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/11/29/287249.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/287249.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/11/29/287249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/287249.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/287249.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; 学习了一段时间的ORM相关技术(主要是NHibernate), 现在能看懂基本的程序, 也能自己写点小代码了, 但是总感觉心里没底, 和以前学习一样新技术那种充实感完全不同, 而且在实现某些功能的时候和自己比较熟悉的sql一对比, 更是感觉诚惶诚恐. 此间, 在网上看到不少对ORM的质疑和批评, 更是加重心中的不安(何况本人本来就不是ORM的忠实拥护者, 呵呵).&nbsp;<br>&nbsp;&nbsp;&nbsp; 目前在学习中遇到两个问题, 感觉用目前的任何一种ORM Tool均无法解决, 而这两个问题实际上在应用中经常碰到,如果无法解决, 我感觉对于ORM的应用有很大的限制, 甚至只能被彻底放弃!<br><br>&nbsp;&nbsp;&nbsp; 1. 多库查询: 在SQL中同时查询多个数据库轻而易举, 在orm中好像目前是办不到的, 往往一个映射对应一个数据库, 虽然通过某些方法可能可以做到动态切换数据库进行查询, 但是假如一个原子业务中同时需要两个库的数据, 那该怎么办?<br>&nbsp;&nbsp;&nbsp; 2. 复杂查询: 这里特指那些大数据量且逻辑复杂的查询(可能会有3000行左右), 这时候在sql往往需要一些表变量存储中间数据, 这样几乎所有orm框架提供的查询机制往往都无能为力了, 那么这是不是意味在我在一个框架中同时需要原生的sql呢? 如果是这样的话, 那么采用ORM的意义将大大失去!<br><br>&nbsp;&nbsp;&nbsp; 可以看到, 我遇到的问题主要是查询的问题, 对于简单的查询, ORM可能游刃有余, 但是感觉对于比较复杂的逻辑,&nbsp; 除了SQL, 我不知道有什么更好的方法! 郁闷中&#8230;&#8230;<br><br>&lt;the end&gt; </p>
<img src ="http://www.cnblogs.com/leafyoung/aggbug/287249.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</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>]]></description></item><item><title>[C#]NHibernate处理多帐套问题</title><link>http://www.cnblogs.com/leafyoung/archive/2005/10/23/260248.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sun, 23 Oct 2005 05:46:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/10/23/260248.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/260248.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/10/23/260248.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/260248.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/260248.html</trackback:ping><description><![CDATA[<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; 久仰ORM大名由来已久，但真正学习ORM才是前两周的事，在网上挑来拣去，终于决定好好学习一下NHibernate（IBatisNet我也比较感兴趣，但是鉴于时间有限，暂时搁置），一来因为其鼻祖Hibernate名气大，二来嘛，因为它是开源的，有机会看看它的源码，呵呵！ <BR>&nbsp;&nbsp;&nbsp; 上网搜了好久，没搜到几篇文档，没法子只能啃Hibernate的文档慢慢学习了，不久我就发现一个问题：NHibernate好像不能同时操作几个数据库嘛？假设有这样分布式系统，它有N个客户端，一个应用程序服务器，多个数据库服务器，客户端可以根据自己的配置通过应用程序服务器连接到不同的数据库服务器（应该就是<SPAN style="COLOR: #000080"><STRONG>听棠</STRONG></SPAN>描述的所谓多帐套），NHibernate应该如何处理这种情况呢？如果了解一点NHibernate的配置的话，大概就知道是通过Configuration.BuildSessionFactory获得ISessionFactory接口的，而通过这种方法我们只能利用连接字符串指定一个默认的数据库，在《<A id=viewpost1_TitleUrl href="http://jiezhi.cnblogs.com/archive/2005/01/17/92005.html">在Window Form中使用NHibernate</A>》一文中提到可以通过增加一个配置文件的方式连接到其它的数据库，但按照原文的意思，如果要使用第二个数据库，意味着要第二次进行昂贵的BuildSessionFactory调用，而且假如我们允许用户创建删除数据库的话，配置文件实在是不够灵活，那么有什么办法可以达到我们的目的呢？ <BR>&nbsp;&nbsp;&nbsp; 查阅NHibernate的doc，无意中发现OpenSession有个overload的方法，可以提供一个<SPAN style="COLOR: #993300"><EM><U>IDbConnection</U></EM></SPAN>的参数，看来老天有眼，直觉告诉我，就是它了！！！经过实验，只要指定这个参数，就可以轻轻松松实现动态改变连接的数据库了！废话少说，看代码&#8230;&#8230;&nbsp;<BR>&nbsp;&nbsp;&nbsp; 首先是SessionFactory的代码，这里将SessionFactory实现为单例，主要是因为SessionFactory建立极为耗时耗力，这样可以避免重复创建。</P>
<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"></P>
<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Reflection;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Diagnostics;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Data;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;NHibernate;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;NHibernate.Cfg;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">namespace</SPAN><SPAN style="COLOR: #000000">&nbsp;MyProject.Services<BR><IMG id=Codehighlighter1_155_1678_Open_Image onclick="this.style.display='none'; Codehighlighter1_155_1678_Open_Text.style.display='none'; Codehighlighter1_155_1678_Closed_Image.style.display='inline'; Codehighlighter1_155_1678_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_155_1678_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_155_1678_Closed_Text.style.display='none'; Codehighlighter1_155_1678_Open_Image.style.display='inline'; Codehighlighter1_155_1678_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top></SPAN><SPAN id=Codehighlighter1_155_1678_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_155_1678_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;SessionFactory<BR><IMG id=Codehighlighter1_193_1676_Open_Image onclick="this.style.display='none'; Codehighlighter1_193_1676_Open_Text.style.display='none'; Codehighlighter1_193_1676_Closed_Image.style.display='inline'; Codehighlighter1_193_1676_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_193_1676_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_193_1676_Closed_Text.style.display='none'; Codehighlighter1_193_1676_Open_Image.style.display='inline'; Codehighlighter1_193_1676_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_193_1676_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_193_1676_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;Configuration&nbsp;_configuration&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;ISessionFactory&nbsp;_factory&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;SessionFactory()<BR><IMG id=Codehighlighter1_352_1087_Open_Image onclick="this.style.display='none'; Codehighlighter1_352_1087_Open_Text.style.display='none'; Codehighlighter1_352_1087_Closed_Image.style.display='inline'; Codehighlighter1_352_1087_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_352_1087_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_352_1087_Closed_Text.style.display='none'; Codehighlighter1_352_1087_Open_Image.style.display='inline'; Codehighlighter1_352_1087_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_352_1087_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_352_1087_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Configuration();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration.SetProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hibernate.dialect</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">NHibernate.Dialect.MsSql2000Dialect</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration.SetProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hibernate.connection.provider</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">NHibernate.Connection.DriverConnectionProvider</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration.SetProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hibernate.connection.driver_class</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">NHibernate.Driver.SqlClientDriver</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration.SetProperty(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">hibernate.connection.connection_string</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">@"</SPAN><SPAN style="COLOR: #000000">Server=localhost;initial&nbsp;catalog=master;Integrated&nbsp;Security=SSPI</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_configuration.AddAssembly(Assembly.Load(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">MyProject.Beans</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">));<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_factory&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_configuration.BuildSessionFactory();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;ISession&nbsp;OpenSession()<BR><IMG id=Codehighlighter1_1143_1267_Open_Image onclick="this.style.display='none'; Codehighlighter1_1143_1267_Open_Text.style.display='none'; Codehighlighter1_1143_1267_Closed_Image.style.display='inline'; Codehighlighter1_1143_1267_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1143_1267_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1143_1267_Closed_Text.style.display='none'; Codehighlighter1_1143_1267_Open_Image.style.display='inline'; Codehighlighter1_1143_1267_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1143_1267_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1143_1267_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Assert(_factory&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ISessionFactory&nbsp;is&nbsp;null</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;_factory.OpenSession();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;ISession&nbsp;OpenSession(IDbConnection&nbsp;connection)<BR><IMG id=Codehighlighter1_1347_1552_Open_Image onclick="this.style.display='none'; Codehighlighter1_1347_1552_Open_Text.style.display='none'; Codehighlighter1_1347_1552_Closed_Image.style.display='inline'; Codehighlighter1_1347_1552_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1347_1552_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1347_1552_Closed_Text.style.display='none'; Codehighlighter1_1347_1552_Open_Image.style.display='inline'; Codehighlighter1_1347_1552_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1347_1552_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1347_1552_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Assert(_factory&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">ISessionFactory&nbsp;is&nbsp;null</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Assert(connection&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">IDbConnection&nbsp;is&nbsp;null</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;_factory.OpenSession(connection);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&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;Initialize()<BR><IMG id=Codehighlighter1_1603_1670_Open_Image onclick="this.style.display='none'; Codehighlighter1_1603_1670_Open_Text.style.display='none'; Codehighlighter1_1603_1670_Closed_Image.style.display='inline'; Codehighlighter1_1603_1670_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_1603_1670_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1603_1670_Closed_Text.style.display='none'; Codehighlighter1_1603_1670_Open_Image.style.display='inline'; Codehighlighter1_1603_1670_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1603_1670_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_1603_1670_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">&nbsp;do&nbsp;nothing,&nbsp;just&nbsp;trigger&nbsp;the&nbsp;static&nbsp;.ctor</SPAN><SPAN style="COLOR: #008000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp;大家可以发现，我连接的居然<STRONG style="COLOR: #ff0000">master</STRONG>数据库，嘿嘿，不错，这就是奥妙所在了，调用BuildSessionFactory的时候，指定哪个数据库并没有太大关系，你可以指定任何一个数据库都没有问题，当然，这样做的后果就是你<STRONG>必须</STRONG>在OpenSession的时候指定一个连接，否则的话，狠狠，后果自负哦！<BR>&nbsp;&nbsp;&nbsp; 好了，上面就是全部的关键了，接下来就是如何使用的问题了，我这里举个例子，以做抛砖引玉之用:</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&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;TestAddUser(User&nbsp;newUser)<BR><IMG id=Codehighlighter1_61_840_Open_Image onclick="this.style.display='none'; Codehighlighter1_61_840_Open_Text.style.display='none'; Codehighlighter1_61_840_Closed_Image.style.display='inline'; Codehighlighter1_61_840_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_61_840_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_840_Closed_Text.style.display='none'; Codehighlighter1_61_840_Open_Image.style.display='inline'; Codehighlighter1_61_840_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_61_840_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_61_840_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;connstring&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">@"</SPAN><SPAN style="COLOR: #000000">Server=localhost;initial&nbsp;catalog=gcs2;Integrated&nbsp;Security=SSPI</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;(SqlConnection&nbsp;conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;SqlConnection(connstring))<BR><IMG id=Codehighlighter1_245_830_Open_Image onclick="this.style.display='none'; Codehighlighter1_245_830_Open_Text.style.display='none'; Codehighlighter1_245_830_Closed_Image.style.display='inline'; Codehighlighter1_245_830_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_245_830_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_245_830_Closed_Text.style.display='none'; Codehighlighter1_245_830_Open_Image.style.display='inline'; Codehighlighter1_245_830_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_245_830_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_245_830_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Open();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ISession&nbsp;session&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;SessionFactory.OpenSession(conn&nbsp;</SPAN><SPAN style="COLOR: #0000ff">as</SPAN><SPAN style="COLOR: #000000">&nbsp;IDbConnection);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ITransaction&nbsp;transaction&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;session.BeginTransaction();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_469_572_Open_Image onclick="this.style.display='none'; Codehighlighter1_469_572_Open_Text.style.display='none'; Codehighlighter1_469_572_Closed_Image.style.display='inline'; Codehighlighter1_469_572_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_469_572_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_469_572_Closed_Text.style.display='none'; Codehighlighter1_469_572_Open_Image.style.display='inline'; Codehighlighter1_469_572_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_469_572_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_469_572_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.Save(newUser);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.Commit();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;ex)<BR><IMG id=Codehighlighter1_627_719_Open_Image onclick="this.style.display='none'; Codehighlighter1_627_719_Open_Text.style.display='none'; Codehighlighter1_627_719_Closed_Image.style.display='inline'; Codehighlighter1_627_719_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_627_719_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_627_719_Closed_Text.style.display='none'; Codehighlighter1_627_719_Open_Image.style.display='inline'; Codehighlighter1_627_719_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_627_719_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_627_719_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transaction.Rollback();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;ex;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000"><BR><IMG id=Codehighlighter1_761_816_Open_Image onclick="this.style.display='none'; Codehighlighter1_761_816_Open_Text.style.display='none'; Codehighlighter1_761_816_Closed_Image.style.display='inline'; Codehighlighter1_761_816_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><IMG id=Codehighlighter1_761_816_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_761_816_Closed_Text.style.display='none'; Codehighlighter1_761_816_Open_Image.style.display='inline'; Codehighlighter1_761_816_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_761_816_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_761_816_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session.Close();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">相关的调用代码如下：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;btnAdd_Click(</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">&nbsp;sender,&nbsp;EventArgs&nbsp;e)<BR><IMG id=Codehighlighter1_70_340_Open_Image onclick="this.style.display='none'; Codehighlighter1_70_340_Open_Text.style.display='none'; Codehighlighter1_70_340_Closed_Image.style.display='inline'; Codehighlighter1_70_340_Closed_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align=top><IMG id=Codehighlighter1_70_340_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_70_340_Closed_Text.style.display='none'; Codehighlighter1_70_340_Open_Image.style.display='inline'; Codehighlighter1_70_340_Open_Text.style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_70_340_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG src="http://www.cnblogs.com/Images/dot.gif"></SPAN><SPAN id=Codehighlighter1_70_340_Open_Text><SPAN style="COLOR: #000000">{<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;newUser&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;User();<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser.Name&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;new&nbsp;user&gt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser.Password&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&lt;none&gt;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser.CreateDate&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DateTime.Now;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newUser.LastLogin&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;DateTime.Now;<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UserFactory.TestAddUser(newUser);<BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"><BR><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV>
<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">如果没有问题的话，最终User将被保存到gcs2数据库中，而不是master数据库！事实上，通过改变TestAddUser成员函数中的连接字符串（可以由客户端传过来），你说吧，你想连到哪儿？呵呵！<BR><BR>&nbsp;&nbsp;&nbsp; 当然大家也看到了，<EM>强行指定connection是以牺牲代码的平台移植性为代价的。</EM>我这里就强行指定了SqlConnection作为实际连接，当然，这个问题很好解决，一个简单工厂就绰绰有余了，好，enjoy it！<BR><BR>注：这是本人<STRONG><EM>第一次</EM></STRONG>发表有关NHibernate的文章，而且本人才疏学浅，如有遗漏或错误之处，请各位指正！<BR><BR>『the end』 </P><img src ="http://www.cnblogs.com/leafyoung/aggbug/260248.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" 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>]]></description></item><item><title>[C#]实现序列号生成器</title><link>http://www.cnblogs.com/leafyoung/archive/2005/10/10/251436.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 10 Oct 2005 02:45:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/10/10/251436.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/251436.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/10/10/251436.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/251436.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/251436.html</trackback:ping><description><![CDATA[<P style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; 对于数据库应用而言, 一个合适的序列号生成器是非常有用的, 用它我们可以方便地给新增的记录的id字段(主键)赋值, 当然我们同样可以用Identity类型主键, 但是假如同时存在父子关系的记录, 那么给子记录赋parent_id就极为不便, 我们必须先将父记录插入到数据库, 然后从数据库中取得自动生成的id, 然后才成给子记录的parent_id字段赋值. 毫无疑问, 假如我们可以给父记录的id直接赋值的话, 问题就简单得多了. <BR>&nbsp;&nbsp;&nbsp; 但是, 对于一个分布式应用而言, 不经过周密的考虑往往会带来id重复的问题. 在我们公司既有的产品中采用段号来解决这个问题, 就是说为每个用户分配一个足够长的区间(比如10000000)作为可选id, 每个用户使用独立的区间的id一般不会带来问题, 但是作为一个完美主义者来说, 不能不考虑到一个极端情况, 假如区间重叠了怎么办? 而且这样的分配方式无疑极大地浪费了id资源, 是否有更好的解决方案呢? <BR>&nbsp;&nbsp;&nbsp; 前几天阅读Martin Fowler的大作&lt;Patterns of Enterprise Application Architecture&gt;, 其中提到了一种不错的解决方案, 即使利用<STRONG>键表(key table)</STRONG>, 典型的键表有两列: 名字(name)和下一个有效id(nextID). 如果使用数据库唯一键的话, 这个表只有一条记录, 如"DB, 1"; 如果使用表唯一键, 那么对于每个数据库表都有一行数据与之对应, 比如: "Users, 11", "Roles, 31"等等. 我们要获得一个新的可用id, 只需要从一个合适的行中获得nextID值, 然后把nextID + incrementBy存入数据库, 这里每次加上一个incrementBy是为了减少数据库的操作, 避免浪费宝贵的数据库连接资源, 减少冲突发生的可能行. <BR>&nbsp;&nbsp;&nbsp; 下面看看我在.net下的实现(模仿Martin Fowler的大作): <BR></P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Diagnostics; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Data; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">using</SPAN><SPAN style="COLOR: #000000">&nbsp;System.Data.Common; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">namespace</SPAN><SPAN style="COLOR: #000000">&nbsp;MyProject.Core <BR><IMG id=Codehighlighter1_111_1855_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_1855_Open_Text.style.display='none'; Codehighlighter1_111_1855_Closed_Image.style.display='inline'; Codehighlighter1_111_1855_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_111_1855_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_1855_Closed_Text.style.display='none'; Codehighlighter1_111_1855_Open_Image.style.display='inline'; Codehighlighter1_111_1855_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN id=Codehighlighter1_111_1855_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_111_1855_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;KeyGenerator <BR><IMG id=Codehighlighter1_147_1853_Open_Image onclick="this.style.display='none'; Codehighlighter1_147_1853_Open_Text.style.display='none'; Codehighlighter1_147_1853_Closed_Image.style.display='inline'; Codehighlighter1_147_1853_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_147_1853_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_147_1853_Closed_Text.style.display='none'; Codehighlighter1_147_1853_Open_Image.style.display='inline'; Codehighlighter1_147_1853_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_147_1853_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_147_1853_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG id=Codehighlighter1_157_384_Closed_Image onclick="this.style.display='none'; Codehighlighter1_157_384_Closed_Text.style.display='none'; Codehighlighter1_157_384_Open_Image.style.display='inline'; Codehighlighter1_157_384_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top><IMG id=Codehighlighter1_157_384_Open_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_157_384_Open_Text.style.display='none'; Codehighlighter1_157_384_Closed_Image.style.display='inline'; Codehighlighter1_157_384_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_157_384_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">private&nbsp;members</SPAN><SPAN id=Codehighlighter1_157_384_Open_Text style="DISPLAY: none"><SPAN style="COLOR: #0000ff">#region</SPAN><SPAN style="COLOR: #000000">&nbsp;private&nbsp;members</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;IDbConnection&nbsp;_connection&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;_keyName; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;_incrementBy; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;_nextId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;_maxId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">#endregion</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;KeyGenerator(IDbConnection&nbsp;conn,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;keyName,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;incrementBy) <BR><IMG id=Codehighlighter1_476_590_Open_Image onclick="this.style.display='none'; Codehighlighter1_476_590_Open_Text.style.display='none'; Codehighlighter1_476_590_Closed_Image.style.display='inline'; Codehighlighter1_476_590_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_476_590_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_476_590_Closed_Text.style.display='none'; Codehighlighter1_476_590_Open_Image.style.display='inline'; Codehighlighter1_476_590_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_476_590_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_476_590_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_connection&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;conn; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_keyName&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;keyName; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_incrementBy&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;incrementBy; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">long</SPAN><SPAN style="COLOR: #000000">&nbsp;NextKey <BR><IMG id=Codehighlighter1_629_826_Open_Image onclick="this.style.display='none'; Codehighlighter1_629_826_Open_Text.style.display='none'; Codehighlighter1_629_826_Closed_Image.style.display='inline'; Codehighlighter1_629_826_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_629_826_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_629_826_Closed_Text.style.display='none'; Codehighlighter1_629_826_Open_Image.style.display='inline'; Codehighlighter1_629_826_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_629_826_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_629_826_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">get</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_659_816_Open_Image onclick="this.style.display='none'; Codehighlighter1_659_816_Open_Text.style.display='none'; Codehighlighter1_659_816_Closed_Image.style.display='inline'; Codehighlighter1_659_816_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_659_816_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_659_816_Closed_Text.style.display='none'; Codehighlighter1_659_816_Open_Image.style.display='inline'; Codehighlighter1_659_816_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_659_816_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_659_816_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(_nextId&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;_maxId) <BR><IMG id=Codehighlighter1_716_768_Open_Image onclick="this.style.display='none'; Codehighlighter1_716_768_Open_Text.style.display='none'; Codehighlighter1_716_768_Closed_Image.style.display='inline'; Codehighlighter1_716_768_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_716_768_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_716_768_Closed_Text.style.display='none'; Codehighlighter1_716_768_Open_Image.style.display='inline'; Codehighlighter1_716_768_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_716_768_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_716_768_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reserveIds(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;_nextId</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;reserveIds() <BR><IMG id=Codehighlighter1_871_1847_Open_Image onclick="this.style.display='none'; Codehighlighter1_871_1847_Open_Text.style.display='none'; Codehighlighter1_871_1847_Closed_Image.style.display='inline'; Codehighlighter1_871_1847_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_871_1847_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_871_1847_Closed_Text.style.display='none'; Codehighlighter1_871_1847_Open_Image.style.display='inline'; Codehighlighter1_871_1847_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_871_1847_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_871_1847_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDbTransaction&nbsp;tx&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_connection.BeginTransaction(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IDbCommand&nbsp;cmd&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_connection.CreateCommand(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.Transaction&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;tx; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">try</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_1057_1640_Open_Image onclick="this.style.display='none'; Codehighlighter1_1057_1640_Open_Text.style.display='none'; Codehighlighter1_1057_1640_Closed_Image.style.display='inline'; Codehighlighter1_1057_1640_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_1057_1640_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1057_1640_Closed_Text.style.display='none'; Codehighlighter1_1057_1640_Open_Image.style.display='inline'; Codehighlighter1_1057_1640_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1057_1640_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_1057_1640_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.CommandText&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">.Format( <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">update&nbsp;keys&nbsp;set&nbsp;nextID&nbsp;=&nbsp;nextID&nbsp;+&nbsp;{0}&nbsp;where&nbsp;name&nbsp;=&nbsp;\'{1}\'</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_incrementBy,&nbsp;_keyName); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;result&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;cmd.ExecuteNonQuery(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.Assert(result&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">,&nbsp;_keyName&nbsp;</SPAN><SPAN style="COLOR: #000000">+</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">&nbsp;not&nbsp;exists</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.CommandText&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">.Format(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">select&nbsp;nextID&nbsp;from&nbsp;keys&nbsp;where&nbsp;name&nbsp;=&nbsp;\'{0}\'</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">, <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_keyName); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_maxId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Convert.ToInt64(cmd.ExecuteScalar()); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nextId&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;_maxId&nbsp;</SPAN><SPAN style="COLOR: #000000">-</SPAN><SPAN style="COLOR: #000000">&nbsp;_incrementBy; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.Commit(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">catch</SPAN><SPAN style="COLOR: #000000">&nbsp;(Exception&nbsp;ex) <BR><IMG id=Codehighlighter1_1687_1758_Open_Image onclick="this.style.display='none'; Codehighlighter1_1687_1758_Open_Text.style.display='none'; Codehighlighter1_1687_1758_Closed_Image.style.display='inline'; Codehighlighter1_1687_1758_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_1687_1758_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1687_1758_Closed_Text.style.display='none'; Codehighlighter1_1687_1758_Open_Image.style.display='inline'; Codehighlighter1_1687_1758_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1687_1758_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_1687_1758_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tx.Rollback(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;ex; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">finally</SPAN><SPAN style="COLOR: #000000"> <BR><IMG id=Codehighlighter1_1792_1837_Open_Image onclick="this.style.display='none'; Codehighlighter1_1792_1837_Open_Text.style.display='none'; Codehighlighter1_1792_1837_Closed_Image.style.display='inline'; Codehighlighter1_1792_1837_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_1792_1837_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1792_1837_Closed_Text.style.display='none'; Codehighlighter1_1792_1837_Open_Image.style.display='inline'; Codehighlighter1_1792_1837_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN id=Codehighlighter1_1792_1837_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_1792_1837_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd.Dispose(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN> </DIV><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; 使用的方法也很简单, 如下所示:</SPAN> <BR>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #000000">OleDbConnection&nbsp;conn&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;OleDbConnection(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>conn.ConnectionString&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Provider=SQLOLEDB;Data&nbsp;Source=(local);Initial&nbsp;Catalog=gcs;Trusted_Connection=Yes</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>conn.Open(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>KeyGenerator&nbsp;gen&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;KeyGenerator(conn,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">Users</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN><SPAN style="COLOR: #0000ff">for</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="COLOR: #0000ff">int</SPAN><SPAN style="COLOR: #000000">&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">0</SPAN><SPAN style="COLOR: #000000">;&nbsp;i&nbsp;</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">10</SPAN><SPAN style="COLOR: #000000">;&nbsp;i</SPAN><SPAN style="COLOR: #000000">++</SPAN><SPAN style="COLOR: #000000">) <BR><IMG id=Codehighlighter1_256_291_Open_Image onclick="this.style.display='none'; Codehighlighter1_256_291_Open_Text.style.display='none'; Codehighlighter1_256_291_Closed_Image.style.display='inline'; Codehighlighter1_256_291_Closed_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width=11 align=top><IMG id=Codehighlighter1_256_291_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_256_291_Closed_Text.style.display='none'; Codehighlighter1_256_291_Open_Image.style.display='inline'; Codehighlighter1_256_291_Open_Text.style.display='inline';" height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width=11 align=top></SPAN><SPAN id=Codehighlighter1_256_291_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15></SPAN><SPAN id=Codehighlighter1_256_291_Open_Text><SPAN style="COLOR: #000000">{ <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(gen.NextKey); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width=11 align=top>}</SPAN></SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>conn.Close(); <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top></SPAN> </DIV><BR><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">附: 创建键表的sql <BR></SPAN>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top><SPAN style="COLOR: #0000ff">CREATE</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">TABLE</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">keys</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;( <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">varchar</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;(</SPAN><SPAN style="FONT-WEIGHT: bold; COLOR: #800000">32</SPAN><SPAN style="COLOR: #000000">)&nbsp;COLLATE&nbsp;Chinese_PRC_CI_AS&nbsp;</SPAN><SPAN style="COLOR: #808080">NOT</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">NULL</SPAN><SPAN style="COLOR: #000000">&nbsp;, <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">nextID</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">int</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">NULL</SPAN><SPAN style="COLOR: #000000">&nbsp;, <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">PRIMARY</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">KEY</SPAN><SPAN style="COLOR: #000000">&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">CLUSTERED</SPAN><SPAN style="COLOR: #000000">&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;( <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">name</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000"> <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">ON</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">PRIMARY</SPAN><SPAN style="COLOR: #ff0000">]</SPAN><SPAN style="COLOR: #000000">&nbsp; <BR><IMG height=16 src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width=11 align=top>)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">ON</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #ff0000">[</SPAN><SPAN style="COLOR: #ff0000">PRIMARY</SPAN><SPAN style="COLOR: #ff0000">]</SPAN> </DIV><img src ="http://www.cnblogs.com/leafyoung/aggbug/251436.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</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>]]></description></item><item><title>体验boost::spirit</title><link>http://www.cnblogs.com/leafyoung/archive/2005/08/01/205040.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 01 Aug 2005 12:34:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/08/01/205040.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/205040.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/08/01/205040.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/205040.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/205040.html</trackback:ping><description><![CDATA[<SPAN style="FONT-FAMILY: Courier New">&nbsp;&nbsp;&nbsp; 一直对解释器的实现感兴趣, 为此也找了不少资料, 但是几乎没有一个可以让我满意的, 要不产生的代码几乎没有可读性(Lex/YACC), 要不就是产生的代码都是非面向对象的, 唯一让我有点兴趣的就是ANTLR(Another Tool for Language Recognition), 它可以基于产生C++/Java/C#/Python的代码, 可读性也不错, 但是在编写语法文件并嵌入Action的时候没有IntelliSense让人着实不爽.&nbsp; <BR>&nbsp;&nbsp;&nbsp; 就在这时候在网上看到关于spirit的介绍, 这是一个包含在boost中的parser框架, 从网上同仁对它的评价来看, 应该不错, 于是到sf上下了boost(1.30以上版本包含spirit), 就照着文档的介绍开工了.&nbsp; <BR>&nbsp;&nbsp;&nbsp; 可惜整个过程非常不顺利, 按照doc的介绍原模原样输进去的代码居然编译通不过: <BR><BR>#include "stdafx.h" <BR>#include &lt;iostream&gt; <BR>#include &lt;vector&gt; <BR>#include &lt;string&gt; <BR>#include &lt;boost/spirit.hpp&gt; <BR><BR>using namespace std; <BR>using namespace boost::spirit; <BR><BR>int main() <BR>{ <BR>&nbsp;&nbsp;&nbsp;&nbsp;string str; <BR>&nbsp;&nbsp;&nbsp;&nbsp;vector&lt;double&gt; v; <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;rule&lt;&gt; r = real_p[append(v)] &gt;&gt; *(',' &gt;&gt; real_p[append(v)]); <BR>&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;getline(cin, str); <BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if (parse(str.c_str(),&nbsp;r, space_p).full)&nbsp; <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "sucessful" &lt;&lt; endl; <BR>&nbsp;&nbsp;&nbsp;&nbsp;else <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "failed" &lt;&lt; endl; <BR><BR>&nbsp;&nbsp;&nbsp; return 0; <BR>}&nbsp; <BR><BR>&nbsp;&nbsp;&nbsp; 这样一个简单的程序, 居然死活通不过编译, 老天, 这可是咱家一摸一样抄书上的啊!!!&nbsp; <BR>&nbsp;&nbsp;&nbsp; 没法子, 看来只能google一把了, 谁叫咱家对template不熟了, 天知道那些一坨一坨的参数是什么意思,&nbsp;经过n(n&lt;=1)个小时的搜索,&nbsp;终于让我找到原因了, 原来问题出在下面这行代码: <BR>&nbsp;&nbsp;&nbsp; rule&lt;&gt; r = real_p[append(v)] &gt;&gt; *(',' &gt;&gt; real_p[append(v)]); <BR>改成 <BR>&nbsp;&nbsp;&nbsp; rule&lt;phrase_scanner_t&gt; r = real_p[append(v)] &gt;&gt; *(',' &gt;&gt; real_p[append(v)]); <BR>就可以了!!! (至此终于让我的第一个spirit程序跑起来了, :( ) <BR><BR>事后记: <BR>&nbsp;&nbsp;&nbsp; 想想也真是的, 网上那些狗屁教程给了个例子, 居然还是通不过的, 不知道是咱家运气差, 还是研究spirit的人都跑到爪哇国去了, 怎么找来找去就那么几篇文章呢? 让本菜鸟头疼不已啊! 希望有这方面的高手能发扬风格, 可供我辈瞻仰! <BR><BR>另: 发现spirit编译真是有点小慢啊, 上面那么一个小程序, 每次编译都要10秒以上, 不知道我的2.8g CPU在干嘛? 要想快一点的话, 可以把 #include &lt;boost/spirit.hpp&gt; 改成 #include &lt;boost/spirit/core.hpp&gt;, 不过也快不了多少, 呵呵:) <BR>(The End)</SPAN> <img src ="http://www.cnblogs.com/leafyoung/aggbug/205040.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</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>]]></description></item><item><title>[编译原理]突然对编译原理有兴趣了……</title><link>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149077.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 03 May 2005 11:02:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149077.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/149077.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149077.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/149077.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/149077.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Courier New">收集一些东西, 说不定以后可以派上用场, 呵呵^_^ 
<br/>
<br/><span class="atitle">1.&#160; <a href="http://www-128.ibm.com/developerworks/cn/linux/sdk/lex/index.html" target="_blank">Yacc与Lex快速入门</a> 
<br/>2.&#160; <a href="http://www.codeproject.com/cpp/introlexyacc.asp" target="_blank">An introduction to lex and yacc part 1</a> 
<br/>3.&#160; <a href="http://www.codeproject.com/cpp/lexyacc2.asp" target="_blank">An introduction to lex and yacc part 2</a> 
<br/>4.&#160; <a href="http://www.51ym.org/Lex-YACC-HOWTO.html" target="_blank">Lex and YACC primer/HOWTO</a> 
<br/>5.&#160; <a href="http://epaperpress.com/lexandyacc/" target="_blank">A Compact Guide to Lex &amp; Yacc</a> 
<br/>6.&#160; <a href="http://www.chinadir.net/otherlanguage/6200.shtml" target="_blank">C编译器LEX和YACC输入源文件</a> 
<br/>7.&#160; <a href="http://blog.chinaunix.net/article.php?articleId=11263&amp;blogId=164" target="_blank">GCC的编译流程及中间表示层RTL的初步探索</a> 
<br/>8.&#160; <a href="http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html" target="_blank">Lex/YACC(actually FLEX and BISON)</a> 
<br/>9.&#160; <a href="http://www.codeproject.com/cpp/parser_ajr.asp" target="_blank">A simple hand-coded script parser</a> 
<br/>10. <a href="http://www.codeproject.com/csharp/spart.asp" target="_blank">Spart, a parser generator framework 100% C# 
<br/></a>11. <a href="http://dinosaur.compilertools.net/" target="_blank">The Lex &amp; Yacc Page</a> 
<br/>12. <a href="http://compilers.iecc.com/crenshaw/" target="_blank">Let&#39;s Build a Compiler</a> 
<br/>13. <a href="http://www.codeproject.com/csharp/compiler.asp" target="_blank">A Simple Compiler for the Common Language Runtime</a> 
<br/>14. <a href="http://www.antlr.org/doc/getting-started.html" target="_blank">Getting Started with ANTLR</a> 
<br/>15. <a href="http://www.csie.ncu.edu.tw/~chia/Course/Compiler/lexparse.html" target="_blank">Lexer and Parser Generators</a> 
<br/>16. <a href="http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/" target="_blank">The Compiler Generator Coco/R</a> 
<br/>17. <a href="http://www.scifac.ru.ac.za/compilers/conts.htm" target="_blank">COMPILERS AND COMPILER GENERATORS</a> 
<br/>18. <a href="http://www.codeproject.com/cpp/exceptionhandler.asp" target="_blank">How a C++ compiler implements exception handling</a> 
<br/>19. <a href="http://blog.joycode.com/cavingdeep/archive/2005/04/05/47039.aspx" target="_blank">又一个语言识别工具(ANTLR)</a> 
<br/>20. <a href="http://www.graysage.com/cg/Compilers/Toy/" target="_blank">The Toy Language and Compiler</a> 
<br/>21. <a href="http://dev.cq118.com/web/en/Research/Compiler/" target="_blank">Compilers</a> 
<br/>22. <a href="http://supportweb.cs.bham.ac.uk/documentation/tutorials/docsystem/build/tutorials/antlr/antlrhome.html" target="_blank">ANTLR</a> 
<br/>23. <a href="http://javadude.com/articles/antlrtut/" target="_blank">An ANTLR Tutorial</a> 
<br/>24. <a href="http://topaz.cs.byu.edu/text/html/Textbook/" target="_blank">Compiler Theory and Design</a>
<br/>
<br/>(未完待续)...</span></span><img src ="http://www.cnblogs.com/leafyoung/aggbug/149077.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&T多项纪录</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>]]></description></item><item><title>[疑难杂症]系统文件不适用于运行MS-DOS与Microsoft Windows应用程序</title><link>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149031.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Tue, 03 May 2005 07:22:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149031.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/149031.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/05/03/149031.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/149031.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/149031.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Courier New">
<p>WinXP下, 某些应用程序无法在Win32模式下运行.
<br/>
<br/>警告窗口标题是: 16位Windows系统 
<br/>内容: C:\WINDOWS\SYSTEM32\CONFIG.NT. 系统文件不适用于运行MS-DOS与Microsoft Windows应用程序. 请选择&quot;关闭&quot;终止应用程序.
<br/>
<br/>解决方法:
<br/>插入WinXP的安装盘到光驱中，在命令提示符下面分别执行如下命令(假设你的系统安装在C:下面, 光驱为F:)
<br/>
<br/>expand F:\i386\config.nt_ C:\windows\system32\config.nt
<br/>expand F:\i386\autoexec.nt_ C:\windows\system32\autoexec.nt
<br/>expand F:\i386\command.co_ C:\windows\system32\command.com
<br/>
<br/>重启即可.
</p></span><img src ="http://www.cnblogs.com/leafyoung/aggbug/149031.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&T多项纪录</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>]]></description></item><item><title>[疑难杂症]扩展AxWebBrowser的问题???</title><link>http://www.cnblogs.com/leafyoung/archive/2005/05/02/148823.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Mon, 02 May 2005 08:16:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2005/05/02/148823.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/148823.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2005/05/02/148823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/148823.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/148823.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: Courier New">&#160; 一直喜欢M$提供的WebBrowser控件, 但是这几天体验了一下VS2005 Beta2提供的WebBrowser控件, 感觉超级不爽, 虽然以前梦寐以求的功能(比如去掉3D边框, 控制Ctrl+N快捷键, 自定义上下文菜单)都被集成到这个控件里来了, 但是总感觉功能还是不够强大, 因此想从这个控件继承下来加以定制, 但是浏览了它所提供的所有属性, 却找不到原来的AxWebBrowser所提供的Application属性, 而Document成员对象的类型也成了HtmlDocument类. 这下可犯了难了, 该怎么样扩展啊! 经过查阅, 从寥寥无几的几篇文章中得知2005提供的WebBrowser是Web控件的托管版本, 看来想通过com的方法加以扩展是没门了(哪位兄弟知道请不吝赐教^_^) 
<br/>&#160; 既然不能扩展这个托管版本的WebBrowser, 那么就拿AxWebBrowser开刀吧! 说做就做, 拿出AxImpl, TlbImp等工具就是一个猛搞, 弄到了所需的接口定义和常量声明, 并从AxWebBrowser控件派生出一个新控件WebBrowserEx, 一切顺利进行, 既然要定制, 当然少不了IDocHostUIHandler接口, 实现了IDocHostUIHandler接口, F5运行, 唉, 怎么滚动条还是3d而不是Flat的啊! 仔细一想, 原来忘了把接口实现挂上去了, 那就挂吧, 挂接代码如下: 
<br/>
<br/>
</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
   <div><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System.ComponentModel; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System.Windows.Forms; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;mshtml; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;SHDocVw; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System.Runtime.InteropServices; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System.Reflection; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&#160;WBExtended 
<br/><img id="Codehighlighter1_185_581_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_185_581_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_185_581_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_185_581_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_185_581_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_185_581_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_185_581_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_185_581_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="DISPLAY: none" /></span><span id="Codehighlighter1_185_581_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_185_581_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;[System.ComponentModel.ToolboxItem(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">)] 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;partial&#160;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&#160;WebBrowserEx&#160;:&#160;AxWebBrowser,&#160; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IDocHostUIHandler, 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOleClientSite,&#160; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IServiceProvider 
<br/><img id="Codehighlighter1_342_579_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_342_579_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_342_579_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_342_579_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_342_579_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_342_579_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_342_579_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_342_579_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;</span><span id="Codehighlighter1_342_579_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_342_579_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160; ...&#160; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">override</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;OnCreateControl() 
<br/><img id="Codehighlighter1_398_576_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_398_576_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_398_576_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_398_576_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_398_576_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_398_576_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_398_576_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_398_576_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span id="Codehighlighter1_398_576_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_398_576_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOleObject&#160;obj&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.GetOcx()&#160;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&#160;IOleObject; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&#160;(obj&#160;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&#160; 
<br/><img id="Codehighlighter1_473_572_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_473_572_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_473_572_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_473_572_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_473_572_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_473_572_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_473_572_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_473_572_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span id="Codehighlighter1_473_572_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_473_572_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;IOleClientSite&#160;ocs&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&#160;IOleClientSite; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&#160;(ocs&#160;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&#160;obj.SetClientSite(ocs); 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</span></span><span style="COLOR: #000000"> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</span></span><span style="COLOR: #000000"> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width="11" align="top" />&#160;&#160;&#160;&#160;}</span></span><span style="COLOR: #000000"> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width="11" align="top" />}</span></span> 
   </div>
</div>
<p style="FONT-FAMILY: Courier New">
<br/>看到那个SetClientSite没有, 问题出来了, 看似正常的代码居然报了一个大大的异常: 
<br/>
<br/><img height="226" src="http://www.cnblogs.com/images/cnblogs_com/leafyoung/24895/o_AxWebBrowser_Help.jpg" width="647" /> 
<br/>
<br/>郁闷了许久, 始终没有找到解决方法, 不知哪位达人知道怎么回事, 一定要告诉小弟啊!!! 先谢谢啦 
<br/>
</p><img src ="http://www.cnblogs.com/leafyoung/aggbug/148823.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</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>]]></description></item><item><title>[C#]利用反射调用COM组件</title><link>http://www.cnblogs.com/leafyoung/archive/2004/12/26/82095.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Sun, 26 Dec 2004 06:27:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2004/12/26/82095.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/82095.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2004/12/26/82095.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/82095.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/82095.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: Courier New">&#160; 最常见的调用com组件的方法就是添加对这个组件的引用，但是这会在最终可执行文件边生成一个伴随的dll如MyCom.Interop.dll等，这给程序的分发带来相当程度的不便，而且添加引用是我们只能引用某个特定版本的com组件，而我们往往无法确定程序所运行的机器上是否有相应版本的com组件，这可能造成我们的程序无法运行。我们要如何解决这个问题呢？ 
<br/>&#160; 首先要解决com组件的版本问题，这就要求我们不直接使用clsid，而用ProgId来代替客户机上的com组件就可以解决相当程度的问题了，就是这么简单。 
<br/>&#160; 至于如何才能把那个可恶的dll文件给去掉，这就需要利用dotNet提供的反射功能了，我们一代码为例，这里我们假设有一个ProgId为&quot;ReflectionCom.TestObj&quot;的com组件，这个组件有唯一一个方法string SayHello(string AName): 
<br/>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
   <div><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">using</span><span style="COLOR: #000000">&#160;System.Reflection; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" width="11" align="top" /></span><span style="COLOR: #0000ff">namespace</span><span style="COLOR: #000000">&#160;TestConsole 
<br/><img id="Codehighlighter1_62_440_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_62_440_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_62_440_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_62_440_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_62_440_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_62_440_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_62_440_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_62_440_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" style="DISPLAY: none" /></span><span id="Codehighlighter1_62_440_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_62_440_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&#160;MainEntryPoint 
<br/><img id="Codehighlighter1_87_438_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_87_438_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_87_438_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_87_438_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" /><img id="Codehighlighter1_87_438_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_87_438_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_87_438_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_87_438_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;</span><span id="Codehighlighter1_87_438_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_87_438_Open_Text"><span style="COLOR: #000000">{ 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;Main(</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">[]&#160;args) 
<br/><img id="Codehighlighter1_125_435_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_125_435_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_125_435_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_125_435_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" style="DISPLAY: inline" /><img id="Codehighlighter1_125_435_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_125_435_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_125_435_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_125_435_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span id="Codehighlighter1_125_435_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_125_435_Open_Text" style="DISPLAY: inline"><span style="COLOR: #000000">{ 
<br/><img id="Codehighlighter1_162_176_Open_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_162_176_Open_Text.style.display=&#39;none&#39;; Codehighlighter1_162_176_Closed_Image.style.display=&#39;inline&#39;; Codehighlighter1_162_176_Closed_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" width="11" align="top" style="DISPLAY: inline" /><img id="Codehighlighter1_162_176_Closed_Image" onclick="this.style.display=&#39;none&#39;; Codehighlighter1_162_176_Closed_Text.style.display=&#39;none&#39;; Codehighlighter1_162_176_Open_Image.style.display=&#39;inline&#39;; Codehighlighter1_162_176_Open_Text.style.display=&#39;inline&#39;;" height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" width="11" align="top" style="DISPLAY: none" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">[]&#160;oParams&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">[]&#160;</span><span id="Codehighlighter1_162_176_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img height="20" src="http://www.cnblogs.com/images/dot.gif" width="15" /></span><span id="Codehighlighter1_162_176_Open_Text" style="DISPLAY: inline"><span style="COLOR: #000000">{&#160;</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">leafyoung</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">&#160;}</span></span><span style="COLOR: #000000">; 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&#160;oComObj&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Activator.CreateInstance( 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Type.GetTypeFromProgID(</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">ReflectionCOM.TestObj</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">)); 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">object</span><span style="COLOR: #000000">&#160;rez&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;oComObj.GetType().InvokeMember(</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">SayHello</span><span style="COLOR: #000000">&quot;</span><span style="COLOR: #000000">, 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;BindingFlags.InvokeMethod, 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">, 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;oComObj, 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;oParams); 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Console.WriteLine(rez); 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width="11" align="top" />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</span></span><span style="COLOR: #000000"> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" width="11" align="top" />&#160;&#160;&#160;&#160;}</span></span><span style="COLOR: #000000"> 
<br/><img height="16" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" width="11" align="top" />}</span></span> 
   </div>
</div>&#160; 行了，我们就是怎么简简单单就可以调用com组件的任何功能了。 
<br/>&#160; 不过我们要看到这种方法的不足，由于这里用了迟绑定，因此我们无法让编译器做任何的类型检查工作，因此只有在运行时才能知道程序对错；而且，可以以这种方法调用的com组件必须实现IDispatch接口，也就是说必须是一个自动化组件，假如你要调用的组件是一个普通的com组件的话，那就一边哭去吧！呵呵</span><img src ="http://www.cnblogs.com/leafyoung/aggbug/82095.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47947/" 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>]]></description></item><item><title>[Delphi]如何挂上IDocHostUIHandler接口实现？</title><link>http://www.cnblogs.com/leafyoung/archive/2004/11/25/68637.html</link><dc:creator>游民一族</dc:creator><author>游民一族</author><pubDate>Thu, 25 Nov 2004 07:19:00 GMT</pubDate><guid>http://www.cnblogs.com/leafyoung/archive/2004/11/25/68637.html</guid><wfw:comment>http://www.cnblogs.com/leafyoung/comments/68637.html</wfw:comment><comments>http://www.cnblogs.com/leafyoung/archive/2004/11/25/68637.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/leafyoung/comments/commentRss/68637.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/leafyoung/services/trackbacks/68637.html</trackback:ping><description><![CDATA[<P><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&#160; 为了更好地控制WebBrowser，我们可以在一个com对象中实现IDocHostUIHandler（和IDocHostUIHandler2）接口，并把这个接口实现挂到WebBrowser实例上去，成功挂接之后，我们就可以通过实现这些接口的com对象控制WebBrowser的行为方式及其外观了。<br/>&#160; 为了演示如何挂接COM对象，我们假设我们在窗体上放置了一个TWebBrowser实例WB，并且实例化了一个实现IDocHostUIHandler接口的对象IEObject。我们将分别演示通过TWebBrowser的ICustomDoc接口和IOleObject实现挂接。<br/><STRONG>1. 使用IOleObject接口<br/></STRONG>&#160; TWebBrowser对象在初始化时会向宿主查询其是否实现了IDocHostUIHandler接口，假如宿主实现了该接口的话，就会调用该接口的方法控制自己的行为和外观。因此我们只要在TWebBrowser初始化之前将实现IDocHostUIHandler的com对象注册为TWebBrower对象的宿主的话，就可以让TWebBrowser控件自身来查询IDocHostUIHandler接口了。<br/>{code start}<br/>procedure TMainForm.FormCreate(Sender: TObject);<br/>var<br/>&#160; Rect: TRect;<br/>begin<br/>&#160; //设置浏览器站点，设置之后浏览器将自动查询IDocHostUIHandler、IDocHostUIHandler2、<br/>&#160; //IDocHostShowUI等接口<br/><SPAN style="COLOR: #0000ff">&#160; (WB.Application as IOleObject).SetClientSite(IEObject as IOleClientSite);<br/></SPAN>&#160; //本地激活浏览器控件<br/>&#160; Rect := Self.GetClientRect;<br/>&#160; (WB.Application as IOleObject).DoVerb(OLEIVERB_INPLACEACTIVATE, nil,<br/>&#160;&#160;&#160; Self, 0, Self.Handle, Rect);<br/>&#160; ManageConnection(True); //注册事件连接<br/>&#160; WB.GoHome;&#160; //程序启动时导航到首页<br/>end;<br/>{code end}<br/><STRONG>2. 使用ICustomDoc接口<br/></STRONG>&#160; 如果IEObject由于某种原因无法实现IOleClientSite的话，我们就不能简单地让TWebBrowser对象来查询其宿主的IDocHostUIHandler接口，我们必须显式地将实现该接口的对象赋给</SPAN>TWebBrowser的Document对象，ICustomDoc可以说就是为了这个目的而生的。<br/><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">&#160;&#160; 使用该方法的一个至关重要的问题是必须在TWebBrowser的Document对象建立的时候才可以调用其ICustomDoc接口，否则就会挂接失败，由于Navigate方法是异步执行的，因此我们不能像这样挂接：<br/>{code start}<br/><SPAN style="FONT-FAMILY: 宋体">&#160; WB.GoHome;&#160;&#160;&#160;&#160;//or WB.Navigate(&#39;http://xxx&quot;);<br/>&#160; (WB.Document as ICustomDoc).SetUIHandler(IEObject);<br/></SPAN>{code end}<br/>这种挂接方式可能会生效，但是SetUIHiandler完全可能在Document对象建立之前就被调用，因此这不是一个好的途径，我们可以在TWebBrowser的OnDocumentComplete处理函数中进行挂接，这时候我们可以确保TWebBrowser的Document对象确确实实已经建立起来了，因此调用理论上讲可以100％成功。<br/>&#160; 除此之外，我们还可以这样做：<br/>{code start}<br/>&#160; WB.GoHome;<br/>&#160; while (WB.ReadState &lt;&gt; READYSTATE_COMPLETE&#160;)<br/>&#160;&#160;&#160; ;<br/>&#160;(WB.Document as ICustomDoc).SetUIHandler(IEObject);<br/>{code end}<br/>这样做同样可以达到我们的目的。<SPAN style="COLOR: red">缺点</SPAN>: 虽然这种方法可以达到挂接的目的，但是在实践中发现，由于WB是在装载文档完成之后才挂上IDocUIHandler接口实现的，因此第一次转载文档的时候是不会使用该接口来控制外观和行为的（没挂上当然就不知道怎么用了），因此必须在挂上之后再一次进行刷新才行。<br/><br/></SPAN><SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New">附：由于Delphi本身缺少IDocHostUIHandler等接口的声明，如果要编译上述代码，你可以去<A href="http://www.euromind.com/iedelphi/index.htm">IE&amp;Delphi</A>下载IEConst.pas。其中ICustomDoc接口声明不存在于该文件中，特声明如下：<br/>{code start}<br/>&#160; ICustomDoc = interface(IUnknown)<br/>&#160;&#160;&#160; [&#39;{3050F3F0-98B5-11CF-BB82-00AA00BDCE0B}&#39;]<br/>&#160;&#160;&#160; function SetUIHandler(const pUIHandler: IDocHostUIHandler): HRESULT; stdcall;<br/>&#160; end;<br/>{code end}</SPAN> 
</P><img src ="http://www.cnblogs.com/leafyoung/aggbug/68637.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</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>]]></description></item></channel></rss>