﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-玩转C科技.NET</title><link>http://www.cnblogs.com/volnet/</link><description>从学会做人开始认识这个世界！</description><language>zh-cn</language><lastBuildDate>Wed, 08 Oct 2008 04:40:21 GMT</lastBuildDate><pubDate>Wed, 08 Oct 2008 04:40:21 GMT</pubDate><ttl>60</ttl><item><title>【IE扩展】增加菜单项</title><link>http://www.cnblogs.com/volnet/archive/2008/09/26/adding-menu-items-to-ie.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Thu, 25 Sep 2008 18:18:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/archive/2008/09/26/adding-menu-items-to-ie.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/1299221.html</wfw:comment><comments>http://www.cnblogs.com/volnet/archive/2008/09/26/adding-menu-items-to-ie.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/1299221.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/1299221.html</trackback:ping><description><![CDATA[<p><a href="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/IE_1F73/adding_menu_items_2.jpg"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="adding_menu_items" src="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/IE_1F73/adding_menu_items_thumb.jpg" width="704" height="604" /></a>&nbsp;</p>
<p>作为一个可扩展的系统，IE提供了优良的可扩展性，它的步骤可以很复杂，也可以很简单。这里我就以一个简单的示例来演示一下如何为IE增加一个简单的扩展。</p>
<p>首先，我们需要向注册表中添加一个扩展键值，通过这个预置的外部接口，我们可以添加必要的参数和IE进行交互。这里我们要求我们的IE版本起码在IE5之后。</p>
<p><strong>生成GUID</strong>：</p>
<p>可以利用Visual Studio的工具-&gt;创建GUID工具创建GUID。</p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/IE_1F73/image_2.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" border="0" alt="generate GUID" src="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/IE_1F73/image_thumb.png" width="378" height="343" /></a> </p>
<p><strong>添加注册表项</strong>：</p>
<p>方法一：打开注册表编辑器（在&#8220;开始&#8221;-&gt;&#8220;运行&#8221;输入&#8220;regedit&#8221;（不含引号），确定进入），找到下列键值：</p>
<blockquote>
<p>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Extensions</p>
</blockquote>
<p>其中HKEY_CURRENT_USER部分可以替换为HKEY_LOCAL_MACHINE，这样的替换将导致后续的操作将作用于本机的所有用户，而HKEY_CURRENT_USER则只影响本机的当前用户。</p>
<p>在Extensions节点上添加新项，其名称即为之前所创建的GUID。在该GUID下创建相应的项，这些项的名称和内容按下表所示：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">CLSID：这里将这个值设置为{1FBA04EE</span><span style="color: #000000">-</span><span style="color: #000000">3024</span><span style="color: #000000">-</span><span style="color: #000000">11d2</span><span style="color: #000000">-</span><span style="color: #000000">8F1F</span><span style="color: #000000">-</span><span style="color: #000000">0000F87ABD16}，这个值说明是CLSID_Shell_ToolbarExtExec的扩展类。<br />
<br />
MenuText：这个值将被用于菜单名的显示。<br />
<br />
MenuCustomize：这个值可选，用于指示菜单项应该出现在哪？如果要出现在&#8220;帮助&#8221;旗下，那就设置它为&#8220;help&#8221;，设置成别的选项或者压根不设置都将导致这个菜单被放置到&#8220;工具&#8221;一栏中。<br />
<br />
MenuStatusBar：这个值可选，用于在菜单项被选择的时候在状态栏中会提示相关的提示信息。</span></div>
<p>按动菜单必然需要触发点事件，对IE的扩展需要更加方便的方式，而不是重新修改IE的代码再编译，这通常也不被允许。IE提供的拓展方式有3种，执行一个COM组件、执行一段脚本或者是执行一个可执行程序。而这些需要我们设置相应的值，它们分别是：</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">ClsidExtension：我们首先需要有一个实现了IOleCommandTarget接口的COM对象，然后再将它注册，将COM对象的GUID值作为该项的值。<br />
Script：我们可以在本地磁盘创建一份脚本文件（根据我的经验，可以是</span><span style="color: #000000">*</span><span style="color: #000000">.html,</span><span style="color: #000000">*</span><span style="color: #000000">.htm,</span><span style="color: #000000">*</span><span style="color: #000000">.js等可以执行脚本的文件类型），然后将它们的路径作为该项的值。例如：file:</span><span style="color: #000000">//</span><span style="color: #000000">C:\plug</span>-in.<span style="color: #000000">htm<br />
Exec：与Script基本类似，这里要求添加一个exe文件的路径作为该项的值。</span></div>
<p><br />
以上各项可以并存，运行该菜单的时候就可以执行相应代码了。 </p>
<p>这里我以Script为例，做一个字数统计的示例。</p>
<p>添加脚本代码： </p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&lt;</span><span style="color: #000000">script&nbsp;type</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">text/javascript</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;win&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;external.menuArguments;<br />
</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;document&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;external.menuArguments.document;<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;OnContextMenu(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">MSDN&nbsp;:&nbsp;selection&nbsp;Object</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">http://msdn.microsoft.com/en-us/library/ms535869(VS.85).aspx</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;range&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;document.selection.createRange();<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;str&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String(range.text);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;length&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;str.length;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;output&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">""</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">请选择一段文字!\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">文字的长度为&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;length&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">。\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">calculate&nbsp;how&nbsp;much&nbsp;this&nbsp;subString&nbsp;in&nbsp;the&nbsp;document</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;displayTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;document.body.innerText.split(str).length</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&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">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;displayTime&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">次。\n</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;showMessage(output);<br />
}<br />
<br />
</span><span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;showMessage(message){<br />
&nbsp;&nbsp;&nbsp;&nbsp;alert(message);<br />
}<br />
<br />
OnContextMenu();<br />
<br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">/</span><span style="color: #000000">script&gt;</span></div>
<p>添加脚本代码路径：</p>
<p>名称Script，值<a href="http://www.cnblogs.com/volnet/admin/file:///C:/plug-in.htm">http://www.cnblogs.com/volnet/admin/file:///C:/plug-in.htm</a>（把文件放在C盘之下），并设置ClSID和MenuText值</p>
<p>运行后选择文本，然后在菜单中找到添加项。</p>
<p>方法二：除了使用注册表编辑器进行手动添加，我们也可以通过*.reg文件直接向注册表导入该项目，保存下面的文本为&lt;filename&gt;.reg，并运行它们即可，根据上文设置相应的值。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">[HKEY_CURRENT_USER\Software\Microsoft\Internet&nbsp;Explorer\Extensions\{4D566E3D</span><span style="color: #000000">-</span><span style="color: #000000">15E7</span><span style="color: #000000">-</span><span style="color: #000000">43ed</span><span style="color: #000000">-</span><span style="color: #000000">B2BF</span><span style="color: #000000">-</span><span style="color: #000000">FDC6EE6C98C3}]<br />
</span><span style="color: #000000">@=</span><span style="color: #800000">""</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">MenuStatusBar</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Calculate&nbsp;the&nbsp;count&nbsp;of&nbsp;charactor&nbsp;in&nbsp;the&nbsp;selected&nbsp;word.</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">MenuCustomize</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">help</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">MenuText</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">Word&nbsp;Count</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">CLSID</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">Exec</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">file://E:\\MyCSharpProject\\JavaScript\\HelloWorld.exe</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">Script</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">"</span><span style="color: #800000">file://E:\\MyCSharpProject\\JavaScript\\plug-in.html</span><span style="color: #800000">"</span><span style="color: #000000"><br />
</span><span style="color: #800000">"</span><span style="color: #800000">ClsidExtension</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #800000">""</span><span style="color: #000000"><br />
<br />
</span></div>
<p>以上步骤完成了对IE的菜单进行扩展。</p>
<p>同样类似的还有<strong>Standard Context Menu（标准上下文菜单）</strong>。使用同样的脚本我们可以添加标准上下文菜单。这一步骤仅需我们的浏览器为IE4.0以上即可（之前的步骤要求5.0以上）</p>
<p>我们经常见到在页面中右键，有迅雷下载，添加到QQ表情等，你知道他们是怎么制作的吗？在注册表打开以下键值：</p>
<blockquote>
<p>HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt</p>
</blockquote>
<p>在其下添加脚本文件（和菜单项不同的是它只允许脚本形式而不允许COM对象和可执行文件。）</p>
<p>该项的默认值填写执行脚本的路径，如<a href="http://www.cnblogs.com/volnet/admin/file:///C:/plug-in.htm">http://www.cnblogs.com/volnet/admin/file:///C:/plug-in.htm</a></p>
<p>再添加DWORD值，键名为Contexts，其值是由一组二进制标识符通过&#8220;位或&#8221;的方式叠加的。下表标明它们的含义。</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">0x01</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_DEFAULT&nbsp;&nbsp;&nbsp;&nbsp;在默认情况下在页面的任何位置右键可获得该菜单。<br />
</span><span style="color: #000000">0x02</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_IMAGE&nbsp;&nbsp;&nbsp;&nbsp;只有图像才允许显示该菜单。<br />
</span><span style="color: #000000">0x04</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_CONTROL&nbsp;&nbsp;&nbsp;&nbsp;form才允许显示该菜单。<br />
</span><span style="color: #000000">0x08</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_TABLE&nbsp;&nbsp;&nbsp;&nbsp;tables才允许显示该菜单。<br />
</span><span style="color: #000000">0x10</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_TEXTSELECT&nbsp;&nbsp;&nbsp;&nbsp;选中文本才允许显示该菜单,&nbsp;也包括选中区域内的图像。<br />
</span><span style="color: #000000">0x20</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_ANCHOR&nbsp;&nbsp;&nbsp;&nbsp;链接才允许显示该菜单，不包括链接的图像以及图像地图。<br />
</span><span style="color: #000000">0x40</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CONTEXT_MENU_UNKNOWN&nbsp;&nbsp;&nbsp;&nbsp;在以上任何一个提到的可能性以外（这通常不可能）。 <br />
</span></div>
<p>&nbsp;</p>
<p>好了，下面让我们添加之前的Word Count的代码。 </p>
<p>地址不变，我们要求在HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt下创建&#8220;字数统计&#8221;，在默认中添加C:\plug-in.htm，右键新建DWORD值，名称Contexts，类型REG_DWORD，数据0x30（由0x10|0x20得出，表示我们只在选取文本同时也包括链接文本的时候，才显示&#8220;字数统计&#8221;菜单）。</p>
<p>同理，我们也可以用*.reg的文件来描述上述过程。<br />
</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">Windows&nbsp;Registry&nbsp;Editor&nbsp;Version&nbsp;</span><span style="color: #000000">5.00</span><span style="color: #000000"><br />
<br />
[HKEY_CURRENT_USER\Software\Microsoft\Internet&nbsp;Explorer\MenuExt\字数统计]<br />
</span><span style="color: #800000">"</span><span style="color: #800000">Contexts</span><span style="color: #800000">"</span><span style="color: #000000">=</span><span style="color: #000000">dword:</span><span style="color: #000000">00000030</span><span style="color: #000000"><br />
</span><span style="color: #000000">@=</span><span style="color: #800000">"</span><span style="color: #800000">E:\\MyCSharpProject\\JavaScript\\plug-in.html</span><span style="color: #800000">"</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>至此我们已经将脚本plug-in.htm正确部署到IE中去了。</p>
<p>您是否见过如下图所示的工具栏呢？（IE8中，IE6之前的版本是以图标栏的方式来显示）</p>
<p><img border="0" alt="" src="http://www.cnblogs.com/images/cnblogs_com/volnet/explorer_bar.gif" width="374" height="196" /></p>
<p>之前的步骤并不会让我们添加该选项。但是却为我们完成了很多的工作。下面我们只需要再修改注册表即可。</p>
<p>在对应的GUID下（...\Extension\&lt;GUID&gt;\）添加ButtonText，设置它的值为&#8220;字数统计&#8221;。</p>
<p>前面还有个漂亮的图标呢！自己制作一个图标或者在系统中找到一个漂亮的图标（*.ICO）或者在*.dll中引用图标资源形如："example.dll, &lt;your icon name&gt;.ico"即可。在对应GUID下添加Icon，它的值为*.ICO的完整路径。另添加一个HotIcon，方法与Icon一致。二者的区别是HotIcon是指表示在鼠标移到自定义按钮上时，按钮上所显示的图标。而Icon则是正常显示的风格。但是在IE8下似乎没有什么特别的。不知道IE6下是否会有所区别。</p>
<p>有一个可选的Default Visable，在&lt;GUID&gt;下添加Default Visable，设置它的值为&#8220;Yes&#8221;或&#8220;No&#8221;。言下之意就是是否默认显示。但是这里要注意一点就是如果通过工具栏的&#8220;自定义工具栏&#8221;进行了设置，那么该项将无效。</p>
<p>另外有个可选的Lang####，其中####为语言编号。比如简体中文为0x0804（<a href="http://msdn.microsoft.com/en-us/library/ms776294%28VS.85%29.aspx">可以查阅这里</a>），则为Lang0804。</p>
<p>在执行命令上，上面提到的三种均被支持（COM对象的调用（如常见的&#8220;Gears设置&#8221;）、Script调用（如本示例的&#8220;字数统计&#8221;）、还有Exec的方式。）另外还有Explorer Bar的显示控制（如&#8220;Research&#8221;）</p>
<p>方式：在&lt;GUID&gt;下添加CLSID或者修改CLSID为：{E0DD6CAB-2D10-11D2-8F1A-0000F87ABD16}指定调用CLSID_Shell_ToolbarExtBand扩展，之前调用的是CLSID_Shell_ToolbarExtExec类。然后添加一个项为BandCLSID，它的值为代显示的Explorer Bar的GUID，如果您没有这么一个Bar，可以先用Research的GUID代替一下：{FF059E31-CC5A-4E2E-BF3B-96E929D65503}。</p>
<img src ="http://www.cnblogs.com/volnet/aggbug/1299221.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42841/" target="_blank">[新闻]Google向Wine贡献更多代码</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>JavaScript拖拽，凑个热闹</title><link>http://www.cnblogs.com/volnet/archive/2008/09/23/dragdrop.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Mon, 22 Sep 2008 16:39:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/archive/2008/09/23/dragdrop.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/1264212.html</wfw:comment><comments>http://www.cnblogs.com/volnet/archive/2008/09/23/dragdrop.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/1264212.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/1264212.html</trackback:ping><description><![CDATA[摘要: 很久没来写点什么了，最近看到园子里面做拖拽的人特别多，突然兴起，也就写了这么个拖拽的脚本。刚刚找了找看，发现原来拖拽这种常见的效果已经有了N篇文章M种办法。不过这里还是要分享一下我的这个drag.js。也许哪天您寻找的时候发现您需要的就是这种拖拽。说了这么多，首先阐释一下这个拖拽脚本的实现原理，以备大家在二次开发的时候能够有充分地认识，也便于大家发现这其中可能存在的问题。（本人对HTML方面并不特&nbsp;&nbsp;<a href='http://www.cnblogs.com/volnet/archive/2008/09/23/dragdrop.html'>阅读全文</a><img src ="http://www.cnblogs.com/volnet/aggbug/1264212.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42840/" target="_blank">[新闻]苹果创始人Steve Wozniak称iPod将被淘汰</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>firefox extension</title><link>http://www.cnblogs.com/volnet/archive/2008/09/22/firefox-extension.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Mon, 22 Sep 2008 06:52:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/archive/2008/09/22/firefox-extension.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/1295893.html</wfw:comment><comments>http://www.cnblogs.com/volnet/archive/2008/09/22/firefox-extension.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/1295893.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/1295893.html</trackback:ping><description><![CDATA[<p>浏览器之争着实给开发者带来了诸多不便利，还好各个浏览器基本都有自己的扩展机制。这里就贴一个js文件，引用了该文件的页面允许对firefox进行部分的扩展，以期待跟IE拥有相似的效果。</p>
<p>其中__defineGetter__, __defineSetter__扩展方式详见这里：<a href="http://developer.mozilla.org/En/Core_JavaScript_1.5_Guide:Creating_New_Objects:Defining_Getters_and_Setters">点击进入</a>。<br />
</p>
<p>file:\\__firefox_extension.js</p>
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><img id="Codehighlighter1_1_25_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1_25_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1_25_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1_25_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1_25_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1_25_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1_25_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1_25_Open_Text').style.display='inline';" align="top"><span style="color: #000000;">&nbsp;</span><span id="Codehighlighter1_1_25_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;">/**/</span><span id="Codehighlighter1_1_25_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;">firefox&nbsp;window.event</span><span style="color: #008000;">*/</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__firefox()<br />
<img id="Codehighlighter1_47_645_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_47_645_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_47_645_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_47_645_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_47_645_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_47_645_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_47_645_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_47_645_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_47_645_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_47_645_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HTMLElement.prototype.__defineGetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">runtimeStyle</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__element_style);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;window.constructor.prototype.__defineGetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">event</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__window_event_constructor_getter);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;window.constructor.prototype.__defineSetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">event</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__window_event_constructor_setter);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Event.prototype.__defineGetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">srcElement</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;__event_srcElement);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HTMLElement.prototype.__defineGetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">outerHTML</span><span style="color: #000000;">"</span><span style="color: #000000;">,__element_outerHTML_getter);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HTMLElement.prototype.__defineSetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">outerHTML</span><span style="color: #000000;">"</span><span style="color: #000000;">,__element_outerHTML_setter);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;HTMLElement.prototype.__defineGetter__(</span><span style="color: #000000;">"</span><span style="color: #000000;">canHaveChildren</span><span style="color: #000000;">"</span><span style="color: #000000;">,__canHaveChildren_getter);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="Codehighlighter1_681_805_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_681_805_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_681_805_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_681_805_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_681_805_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_681_805_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_681_805_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_681_805_Open_Text').style.display='inline';" align="top"></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__canHaveChildren_getter()</span><span id="Codehighlighter1_681_805_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_681_805_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">!</span><span style="color: #000000;">/</span><span style="color: #000000;">^(area|base|basefont|col|frame|hr|img|br|input|isindex|link|meta|param)$</span><span style="color: #000000;">/</span><span style="color: #000000;">.test(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.tagName.toLowerCase());<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="Codehighlighter1_844_1023_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_844_1023_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_844_1023_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_844_1023_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_844_1023_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_844_1023_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_844_1023_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_844_1023_Open_Text').style.display='inline';" align="top"></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__element_outerHTML_setter(s)</span><span id="Codehighlighter1_844_1023_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_844_1023_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;r&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ownerDocument.createRange();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;r.setStartBefore(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;df&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;r.createContextualFragment(s);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.parentNode.replaceChild(df,&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;s;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img id="Codehighlighter1_1061_1306_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1061_1306_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1061_1306_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1061_1306_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1061_1306_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1061_1306_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1061_1306_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1061_1306_Open_Text').style.display='inline';" align="top"></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__element_outerHTML_getter()</span><span id="Codehighlighter1_1061_1306_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1061_1306_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;a</span><span style="color: #000000;">=</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.attributes,&nbsp;str</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.tagName,&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">a.length;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(a[i].specified)&nbsp;str</span><span style="color: #000000;">+=</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;">a[i].name</span><span style="color: #000000;">+</span><span style="color: #000000;">'</span><span style="color: #000000;">="</span><span style="color: #000000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">a[i].value</span><span style="color: #000000;">+</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" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.canHaveChildren)&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;str</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;/&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;str</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.innerHTML</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.tagName</span><span style="color: #000000;">+</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__element_style()<br />
<img id="Codehighlighter1_1334_1360_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1334_1360_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1334_1360_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1334_1360_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1334_1360_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1334_1360_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1334_1360_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1334_1360_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_1334_1360_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1334_1360_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.style;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__event_srcElement()<br />
<img id="Codehighlighter1_1392_1419_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1392_1419_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1392_1419_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1392_1419_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1392_1419_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1392_1419_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1392_1419_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1392_1419_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_1392_1419_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1392_1419_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.target;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__window_event_constructor_getter()<br />
<img id="Codehighlighter1_1465_1908_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1465_1908_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1465_1908_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1465_1908_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1465_1908_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1465_1908_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1465_1908_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1465_1908_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_1465_1908_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1465_1908_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(document.all)<br />
<img id="Codehighlighter1_1492_1528_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1492_1528_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1492_1528_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1492_1528_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1492_1528_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1492_1528_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1492_1528_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1492_1528_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1492_1528_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1492_1528_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;window.event;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_caller&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;__window_event_constructor.caller;<br />
<img id="Codehighlighter1_1606_1889_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1606_1889_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1606_1889_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1606_1889_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1606_1889_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1606_1889_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1606_1889_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1606_1889_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(_caller</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)</span><span id="Codehighlighter1_1606_1889_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1606_1889_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_argument&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_caller.arguments[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br />
<img id="Codehighlighter1_1675_1849_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1675_1849_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1675_1849_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1675_1849_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1675_1849_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1675_1849_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1675_1849_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1675_1849_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(_argument)</span><span id="Codehighlighter1_1675_1849_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1675_1849_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">var</span><span style="color: #000000;">&nbsp;_temp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_argument.constructor;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(_temp.toString().indexOf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Event</span><span style="color: #000000;">"</span><span style="color: #000000;">)</span><span style="color: #000000;">!=-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
<img id="Codehighlighter1_1790_1839_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1790_1839_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1790_1839_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1790_1839_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1790_1839_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1790_1839_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1790_1839_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1790_1839_Open_Text').style.display='inline';" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1790_1839_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1790_1839_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" 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;_argument;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" 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" alt="" 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" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_caller&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;_caller.caller;<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</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/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">function</span><span style="color: #000000;">&nbsp;__window_event_constructor_setter(e)<br />
<img id="Codehighlighter1_1955_1965_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1955_1965_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1955_1965_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1955_1965_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1955_1965_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1955_1965_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1955_1965_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1955_1965_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_1955_1965_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1955_1965_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000;">}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">if</span><span style="color: #000000;">(window.addEventListener)<br />
<img id="Codehighlighter1_1994_2014_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1994_2014_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1994_2014_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1994_2014_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_1994_2014_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1994_2014_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1994_2014_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1994_2014_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_1994_2014_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;"><img src="http://www.cnblogs.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_1994_2014_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;__firefox();<br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span><span style="color: #000000;"><br />
<img src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img id="Codehighlighter1_2016_2037_Open_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_2016_2037_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_2016_2037_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_2016_2037_Closed_Text').style.display='inline';" align="top"><img id="Codehighlighter1_2016_2037_Closed_Image" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" style="display: none;" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_2016_2037_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_2016_2037_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_2016_2037_Open_Text').style.display='inline';" align="top"></span><span id="Codehighlighter1_2016_2037_Closed_Text" style="border: 1px solid #808080; background-color: #ffffff; display: none;">/**/</span><span id="Codehighlighter1_2016_2037_Open_Text"><span style="color: #008000;">/*</span><span style="color: #008000;">end&nbsp;firefox.event</span><span style="color: #008000;">*/</span></span></div><img src ="http://www.cnblogs.com/volnet/aggbug/1295893.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42839/" target="_blank">[新闻]福布斯：硅谷日子将更难过 谁下一个倒下</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>如何让DIV固定在页面的某个位置而不随着滚动条随意滚动</title><link>http://www.cnblogs.com/volnet/archive/2008/08/04/fixed-div-in-IE-and-FireFox-and-other-browser.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Sun, 03 Aug 2008 23:21:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/archive/2008/08/04/fixed-div-in-IE-and-FireFox-and-other-browser.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/1259551.html</wfw:comment><comments>http://www.cnblogs.com/volnet/archive/2008/08/04/fixed-div-in-IE-and-FireFox-and-other-browser.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/1259551.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/1259551.html</trackback:ping><description><![CDATA[摘要: <img src="http://news.cnblogs.com/images/logo/IE7.jpg" style="float:right;" />
<p>
1、使用了大量的计算，每次滚动，都少不了一大堆的运算。
2、使用了JavaScript脚本，脚本这东西受到浏览器的限制，即便没有限制，也同样因为网页的下载模式问题，可能因为脚本下载未完成或者下载失败而致使脚本无法正确运行。
3、条条大路通罗马，但是看看那方块，当快速滚动滚动条的时候，会发现那个可爱的方块抖动地厉害。这也难怪，那么多的计算谁能受得了？
</p>
&nbsp;&nbsp;<a href='http://www.cnblogs.com/volnet/archive/2008/08/04/fixed-div-in-IE-and-FireFox-and-other-browser.html'>阅读全文</a><img src ="http://www.cnblogs.com/volnet/aggbug/1259551.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42836/" target="_blank">[新闻]微软老矣 尚能赚否？</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>《从零到知道》(《from0toknow》)专题更新完毕！欢迎前往下载/在线阅读！</title><link>http://www.cnblogs.com/volnet/articles/cpp_from_zero_to_known.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Fri, 18 Jul 2008 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/articles/cpp_from_zero_to_known.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/483421.html</wfw:comment><comments>http://www.cnblogs.com/volnet/articles/cpp_from_zero_to_known.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/483421.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/483421.html</trackback:ping><description><![CDATA[<div class="post">
<div class="post">
<h5>一个关于VC++的专题终于还是写完了，主要是关于VC++，MFC开发的部分知识。其中挺重要的两块,网络和数据库没有写进来，原因主要是因为这两块面比较广，而且也是很重点的，网上随便搜索都能搜索得到很多教程之类的。因此我就没有大费周章来这里写了。这个专题我取名叫《从零到知道》(《from0toknow》)。因为都是一些浅层的知识，对入门的门槛要求比较低。知识是比较陈旧的MFC，但是也是很实用的东西，基本思想等内容还是很受用的。</h5>
<h5>主要特点：《从零到知道》(《from0toknow》)之所以取这个名字，顾名思义是起个入门的作用，文章立足于动手实验，但是不乏理论指导，能提到点到的都记录着呢。学习，最好能看到成效，能做出点东西来，大家就看得比较过瘾，也比较有动力。但是很多朋友在看文档的时候或者由于不是很注意，或者由于文档有疏漏，常常很难编译通过。因此我特地把同步代码更新到相应的压缩包中了。下载压缩包可以获得全部附着代码文档和彩色图文解说的完整版（原因见下）。<span style="color: #808080">原因：写它们的时候我是使用WORD，因此有很多图片都贴进去了。在同步更新到Blog后，丢失了很多图片，可能会影响阅读。由于时间有限不能仔细修改，因此直接把他们分别打包起来了放在相应标题的旁边，大家可以点击下载！</span>所有代码均经过测试，详见附录！</h5>
<h5>以下是本专题在CNBLOGS的文章链接，文章并未附图，如果因为缺失图片而影响阅读，请点旁边的链接下载后用AdobeReader进行阅读。相关代码的开发环境请见附录。</h5>
<p>Contents</p>
<h5>[1]<font color="#223355"><a id="Editor_Results_rprSelectionList_ctl04_Hyperlink1" class="titlelink" href="http://www.cnblogs.com/volnet/articles/472791.html"><font color="#000000">用预编译指令符避免多文件工程中重复定义的问题&nbsp;</font></a> </font><font color="#000000">[文档代码下载]：<a href="http://files.cnblogs.com/volnet/《from0toknow》_cpp_pdf.rar"><font color="#002c99">《from0toknow》_cpp_pdf.rar</font></a></font></h5>
<h5>[2]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl12_TitleUrl" href="http://www.cnblogs.com/volnet/articles/472794.html"><font color="#223355">关于MFC画图的一些总结，MFC （Draw）</a>&nbsp;<font color="#000000">[文档代码下载]：</font><a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Draw_pdf_code.rar"><font color="#002c99">《from0toknow》_Draw_pdf_code.rar</font></a></font></h5>
<h5>[3]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl11_TitleUrl" href="http://www.cnblogs.com/volnet/articles/472796.html"><font color="#223355">Text文本类的部分操作</a>&nbsp;<font color="#000000">[文档代码下载]：</font><a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Text_pdf_code.rar"><font color="#002c99">《from0toknow》_Text_pdf_code.rar</font></a></font></h5>
<h5>[4]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl10_TitleUrl" href="http://www.cnblogs.com/volnet/articles/472797.html"><font color="#223355">Menu-静态菜单和动态菜单</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Menu_pdf_code.rar"><font color="#002c99">《from0toknow》_Menu_pdf_code.rar</font></a></h5>
<h5>[5]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl09_TitleUrl" href="http://www.cnblogs.com/volnet/articles/472799.html"><font color="#223355">对话框资源的各种属性方法的使用</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Dialog_pdf_code.rar"><font color="#002c99">《from0toknow》_Dialog_pdf_code.rar</font></a></h5>
<h5>[6]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl08_TitleUrl" href="http://www.cnblogs.com/volnet/articles/472801.html"><font color="#223355">属性表单——向导的创建</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_DialogControl_pdf_code.rar"><font color="#002c99">《from0toknow》_DialogControl_pdf_code.rar</font></a></h5>
<h5>[7]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl07_TitleUrl" href="http://www.cnblogs.com/volnet/articles/475014.html"><font color="#223355">窗体类型的各种变换</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_WndStyle_pdf_code.rar"><font color="#002c99">《from0toknow》_WndStyle_pdf_code.rar</font></a></h5>
<h5>[8]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl06_TitleUrl" href="http://www.cnblogs.com/volnet/articles/477678.html"><font color="#223355">图像Graphic的相关处理</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Graphic_pdf_code.rar"><font color="#002c99">《from0toknow》_Graphic_pdf_code.rar</font></a></h5>
<h5>[9]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl05_TitleUrl" href="http://www.cnblogs.com/volnet/articles/477680.html"><font color="#223355">窗体重绘，图像更新</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_WndUpdatePicRedraw_pdf_code.rar"><font color="#002c99">《from0toknow》_WndUpdatePicRedraw_pdf_code.rar</font></a></h5>
<h5>[10]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl04_TitleUrl" href="http://www.cnblogs.com/volnet/articles/477682.html"><font color="#223355">文件读写和注册表读写</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_File_pdf_code.rar"><font color="#002c99">《from0toknow》_File_pdf_code.rar</font></a></h5>
<h5>[11]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl03_TitleUrl" href="http://www.cnblogs.com/volnet/articles/478877.html"><font color="#223355">文档序列化（理论+实际）</font></a> [文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_DocSerial_pdf_code.rar"><font color="#002c99">《from0toknow》_DocSerial_pdf_code.rar</font></a>
<h5>[12]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl" href="http://www.cnblogs.com/volnet/articles/482268.html"><font color="#223355">ActiveX的设计</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_ActiveX_pdf_code.rar"><font color="#002c99">《from0toknow》_ActiveX_pdf_code.rar</font></a></h5>
<h5>[13]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl01_TitleUrl" href="http://www.cnblogs.com/volnet/articles/482273.html"><font color="#223355">动态链接库的设计（DLL）</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_dll_pdf_code.rar"><font color="#002c99">《from0toknow》_dll_pdf_code.rar</font></a></h5>
<h5>[14]<a id="CategoryEntryList1_EntryStoryList_Entries_ctl00_TitleUrl" href="http://volnet.cnblogs.com/volnet/articles/482873.html"><font color="#223355">Hooks（钩子）_用于监听消息的方法</font></a>&nbsp;[文档代码下载]：<a href="http://www.cnblogs.com/Files/volnet/《from0toknow》_Hooks_pdf_code.rar"><font color="#002c99">《from0toknow》_Hooks_pdf_code.rar</font></a><font color="#223355"><br />
<br />
</font><font color="#000000">附录：<br />
1、开发工具<br />
Microsoft Visual Studio.NET 2003（VC++7.1）<br />
2、预备知识<br />
基本的C语言知识，类的概念，懂得类的功能和用途。有清晰的思路和敏捷的大脑思维能力和方式。<br />
3、答疑回访<br />
在学习中有任何疑问欢迎发邮件至SupportEmail:mymsdn@163.com或者登陆Blog：<a href="http://volnet.cnblogs.com/">http://volnet.cnblogs.com/</a>进入VC++/C++相关专题内在相应文章的版面内评论（提问）。</font></h5>
</h5>
</div>
</div>
<img src ="http://www.cnblogs.com/volnet/aggbug/483421.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42832/" target="_blank">[新闻]YouTube探索新赢利模式 开始售音乐、视频游戏</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>[WCF]Instance Management</title><link>http://www.cnblogs.com/volnet/archive/2008/07/18/instance_management.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Fri, 18 Jul 2008 12:53:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/archive/2008/07/18/instance_management.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/977680.html</wfw:comment><comments>http://www.cnblogs.com/volnet/archive/2008/07/18/instance_management.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/977680.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/977680.html</trackback:ping><description><![CDATA[<p><span style="font-size: 12pt"><span style="font-size: 10pt">[<span style="color: red; background-color: yellow"><strong><em><u>有兴趣阅读本文的请从头至尾阅读，有兴趣帮助我解答疑问的请从尾至头读(红色部分)，万分感谢！</u></em></strong></span>]<br />
我们很容易理解在旧有编程模型中关于类实例的内容。设计模式中Singleton也就是在描述着档子事。但基于WCF并非适合于以上场景，Service与Client之间要保持良好的Instance模型则需要依靠很多其他机制。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">Programming WCF Service Chapter4 对此进行了细致的描述。（更多细节请自行阅读～）</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">WCF支持三种类型的Instance管理：</span></span></p>
<p><a href="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/WCFInstanceManagement_D45/InstanceManagement.gif"><span style="font-size: 12pt"><span style="font-size: 10pt"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="247" alt="InstanceManagement" src="http://www.cnblogs.com/images/cnblogs_com/volnet/WindowsLiveWriter/WCFInstanceManagement_D45/InstanceManagement_thumb.gif" width="692" border="0" /></span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt"> </span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">1、pre-call services：每个客户端请求对应一个instance</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">2、Sessionful services：每个客户端连接对应一个instance</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">3、Singleton services：所有客户端共享一个instance</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">利用Behaviors可以解决这方面的问题（还有一些其他基于&#8220;服务端&#8221;的其他方面的问题可以通过使用behaviors来解决）。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">注：客户端是不知道服务端设置了什么样的behaviors的。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">VS2008MSDN：</span></span><a title="ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_system.servicemodel/html/88efb135-d425-e5b1-57d6-01a67158c1a5.htm" href="ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_system.servicemodel/html/88efb135-d425-e5b1-57d6-01a67158c1a5.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/fxref_system.servicemodel/html/88efb135-d425-e5b1-57d6-01a67158c1a5.htm</span></span></a></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">Apply the ServiceBehaviorAttribute attribute to a service implementation to specify service-wide execution behavior. (To specify execution behavior at the method level, use the </span></span><a href="ms-help://ms.vscc.v90/b7318cb1-a396-3398-6382-c7595b5188f5.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">OperationBehaviorAttribute</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt"> attribute.) This attribute can be applied only to service implementations.</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">ServiceBehaviorAttribute：仅应用于服务实现。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">OperationBehaviorAttribute：用于方法级别。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"></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"><span style="color: #008000">//</span><span style="color: #008000">瞧这里什么属性都没有&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IMyContract<br />
{}&nbsp;<br />
</span><span style="color: #008000">//</span><span style="color: #008000">而是设置在了具体服务实现上&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #000000">[ServiceBehavior(InstanceContextMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InstanceContextMode.PerSession)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyContract&nbsp;:&nbsp;IMyContract,IDisposable&nbsp;<br />
{}</span></div>
<p><br />
设置instance模式类型由ServiceBehaviorAttribute的属性InstanceContextMode进行设置，默认值为</span></span><a href="ms-help://ms.vscc.v90/d398567a-e231-1ff2-d53b-c3b2168beacd.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">PerSession</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt">.</span></span></p>
<h2><span style="font-size: 12pt"><span style="font-size: 10pt">Per-Call Services</span></span></h2>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">只有当客户端调用的时候才有instance。 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">为了说明问题，书中用了很形象的例子。 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">Code:<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"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;IMyContract<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;GetData(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;value);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;CompositeType&nbsp;GetDataUsingDataContract(CompositeType&nbsp;composite);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;TODO:&nbsp;Add&nbsp;your&nbsp;service&nbsp;operations&nbsp;here</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[OperationContract]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Count();<br />
}<br />
[ServiceBehavior(InstanceContextMode&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;InstanceContextMode.PerCall)]<br />
</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyContract&nbsp;:&nbsp;IMyContract,IDisposable<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Other&nbsp;Members</span><span style="color: #008000"><br />
</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyContract()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Trace.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">WcfServiceLibrary1.MyContract()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;IMyContract&nbsp;Members</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Count()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000">++</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Trace.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">Counter&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;count);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000">&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#region</span><span style="color: #000000">&nbsp;IDisposable&nbsp;Members&nbsp;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Dispose()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Trace.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">WcfServiceLibrary1.Dispose()</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">#endregion</span><span style="color: #000000"><br />
}<br />
</span><span style="color: #008000">//</span><span style="color: #008000">Tester</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
ServiceReference1.MyContractClient&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.ServiceReference1.MyContractClient();&nbsp;<br />
<br />
proxy.Count();<br />
proxy.Count();<br />
proxy.Count();<br />
<br />
proxy.Close();<br />
Console.ReadKey();<br />
</span></div>
<p></span></span><span style="font-size: 12pt"><span style="font-size: 10pt">结果为：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose()<br />
WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose()<br />
WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose() </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">很明显，每次的值都是0+1的结果，这正说明了percall的方式是每个请求一个Instance的。</span></span></p>
<h2><span style="font-size: 12pt"><span style="font-size: 10pt">Per-Session Services</span></span></h2>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">修改上面的例子：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">为：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">结果为：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
Counter = 2<br />
Counter = 3<br />
WcfServiceLibrary1.Dispose() </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">很明显Instance只有一个了。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">我们WcfServiceLibrary默认的Bind是wsHttpBinding，但若是basicHttpBinding，由于每个http到达服务端都是一个新的连接，因此服务端无法判断是哪个连接。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">增加服务端app.config中Endpoint。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">&lt;endpoint address="basic" binding="basicHttpBinding" name="basic" contract="WcfServiceLibrary1.IMyContract" /&gt; </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">重新导入后修改Program里的程序：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">ServiceReference1.MyContractClient proxy = new ConsoleApplication1.ServiceReference1.MyContractClient("basic"); </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">或 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">ServiceReference1.MyContractClient proxy = new ConsoleApplication1.ServiceReference1.MyContractClient("WSHttpBinding_IMyContract"); </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">其中basic和WSHttpBinding_IMyContract为两种不同形式的服务在客户端的Endpoint.Name。 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">之前默认WSHttpBinding_IMyContract，现在由于存在多个Endpoint，则需要显示指定。 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">现指定为basic。再次运行，结果：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose()<br />
WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose()<br />
WcfServiceLibrary1.MyContract()<br />
Counter = 1<br />
WcfServiceLibrary1.Dispose() </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">其结果与PerCall是相同的。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">通过SessionId可以获得Instance的SessionId</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">使用Per-Session方式可以通过设置SessionMode属性（允许、必须、不允许三种枚举）。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">SessionMode：Gets or sets a value that indicates whether a session is required by the contract.</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">SessionMode 枚举</span></span><a title="http://msdn2.microsoft.com/zh-cn/library/system.servicemodel.sessionmode.aspx" href="http://msdn2.microsoft.com/zh-cn/library/system.servicemodel.sessionmode.aspx"><span style="font-size: 12pt"><span style="font-size: 10pt">http://msdn2.microsoft.com/zh-cn/library/system.servicemodel.sessionmode.aspx</span></span></a></p>
<table cellspacing="0" cellpadding="2" width="619" border="1">
    <tbody>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>Allowed(允许)</strong><br />
            Specifies that the contract supports sessions if the incoming binding supports them. </span></span>
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">如果绑定支持Session的话，则让其支持，否则按照可以支持的方式，比如PerCall的方式进行支持。 </span></span></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>Required</strong><strong>(必须)</strong> <br />
            Specifies that the contract requires a sessionful binding. An exception is thrown if the binding is not configured to support session. </span></span>
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">指定契约必须使用Sessionful的方式。如果不支持，则抛出异常。 </span></span></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>NotAllowed</strong><strong>(不允许)</strong> <br />
            Specifies that the contract never supports bindings that initiate sessions. </span></span>
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">指定不能使用Sessionful的方式。作者推荐是用NotAllowed的时候仅用PerCall方式。</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">刚才由于我添加了basic的方式，因为默认选中Allowed，因此刚才的之所以结果与PerCall相同，是因为它，下面我将其修改为Required。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">将</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">[ServiceContract] </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">修改为</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">[ServiceContract(SessionMode=SessionMode.Required)] </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">结果为一个运行时错误：</span></span></p>
<table cellspacing="0" cellpadding="2" width="600" border="1">
    <tbody>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">System.InvalidOperationException: Contract requires Session, </span></span><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it.<br />
            </strong>&nbsp;&nbsp; at System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener&amp; result)<br />
            &nbsp;&nbsp; at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)<br />
            &nbsp;&nbsp; at System.ServiceModel.ServiceHostBase.InitializeRuntime()<br />
            &nbsp;&nbsp; at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)<br />
            &nbsp;&nbsp; at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)<br />
            &nbsp;&nbsp; at System.ServiceModel.Channels.CommunicationObject.Open()<br />
            &nbsp;&nbsp; at Microsoft.Tools.SvcHost.ServiceHostHelper.OpenService(ServiceInfo info)</span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">但是若使用wsHttpBinding，但却without security and without reliable messaging也将无法维持transport-level session。</span></span></p>
<table cellspacing="0" cellpadding="2" width="600" border="1">
    <tbody>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">添加如下代码到app.config(Service)（指定其为无安全并且不可靠消息）</span></span></p>
            <span style="font-size: 12pt"><span style="font-size: 10pt">
            <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 alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">system</span><span style="color: #ff0000">.serviceModel</span><span style="color: #0000ff">&gt;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;Other&nbsp;service&nbsp;Model&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bindings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">wsHttpBinding</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">binding&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="wsBinding"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">reliableSession&nbsp;</span><span style="color: #ff0000">enabled</span><span style="color: #0000ff">="false"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">security&nbsp;</span><span style="color: #ff0000">mode</span><span style="color: #0000ff">="None"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">binding</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">wsHttpBinding</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bindings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">system.serviceModel</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
            <p></span></span>&nbsp;</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="600">
            <p><span style="font-size: 12pt"><span style="font-size: 10pt">&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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">endpoint&nbsp;</span><span style="color: #ff0000">address</span><span style="color: #0000ff">=""</span><span style="color: #ff0000">&nbsp;binding</span><span style="color: #0000ff">="wsHttpBinding"</span><span style="color: #ff0000">&nbsp;contract</span><span style="color: #0000ff">="WcfServiceLibrary1.IMyContract"</span><span style="color: #ff0000">&nbsp;bindingConfiguration</span><span style="color: #0000ff">="wsBinding"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span></div>
            <p><br />
            增加绑定配置为wsBinding</span></span></p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="600"><span style="font-size: 12pt"><span style="font-size: 10pt">确保服务端程序为：<br />
            [ServiceContract(SessionMode = SessionMode.Allowed)]<br />
            (或者没设)<br />
            [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]</span></span></td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">运行结果与PerCall的结果相同。其原因也就是因为wsHttpBinding未设置安全可靠的Session。</span></span></p>
<h4><span style="font-size: 12pt"><span style="font-size: 10pt">超时</span></span></h4>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">inactivityTimeout：超时时间</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">在连接空闲的情况下，以客户端和服务端的超时时间中最短的那个来决定是否移除Instance，若之后再调用则会抛出异常。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">作者额外注明可以采用：</span></span><a href="http://msdn2.microsoft.com/zh-cn/library/system.servicemodel.servicebehaviorattribute.automaticsessionshutdown.aspx"><span style="font-size: 12pt"><span style="font-size: 10pt">AutomaticSessionShutdown</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt">属性。其设置为true则当proxy.Close()的时候自动关闭Session，设为false的时候则只有在服务端将服务关闭才会关闭Session。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">但是，若将其修改为NotAllowed</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">则结果与PerCall相同(手动写为PerSession)。(不管服务配置如何，它总会是PerCall。因为TCP和IPC协议总是维持transport level，你不能将它们配置SessionMode.NotAllowed，它们会在服务载入时进行验证。作者建议是&#8220;在选择使用SessionMode.NotAllowed的同时，将服务配置为PerCall&#8221;。)</span></span></p>
<h2><span style="font-size: 12pt"><span style="font-size: 10pt">Singleton Service</span></span></h2>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">Singleton，顾名思义就是仅有一个Instance，供所有客户端调用。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">在说明问题之前先修改上面的例子：</span></span></p>
<table cellspacing="0" cellpadding="2" width="600" border="1">
    <tbody>
        <tr>
            <td valign="top" width="600">
            <h5><span style="font-size: 12pt"><span style="font-size: 10pt">//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]</span></span></h5>
            <h5><span style="font-size: 12pt"><span style="font-size: 10pt">//[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]</span></span></h5>
            <h5><span style="font-size: 12pt"><span style="font-size: 10pt">为：</span></span></h5>
            <h5><span style="font-size: 12pt"><span style="font-size: 10pt">[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]</span></span></h5>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><span style="font-size: 12pt"><span style="font-size: 10pt">Tester中：<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"><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 />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServiceReference1.MyContractClient&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.ServiceReference1.MyContractClient(</span><span style="color: #000000">"</span><span style="color: #000000">WSHttpBinding_IMyContract</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">_________________________________________________________</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServiceReference1.MyContractClient&nbsp;proxy1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.ServiceReference1.MyContractClient(</span><span style="color: #000000">"</span><span style="color: #000000">WSHttpBinding_IMyContract</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy1.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy1.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy1.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy1.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy1.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy1.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy1.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy1.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">_________________________________________________________</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServiceReference1.MyContractClient&nbsp;proxy2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.ServiceReference1.MyContractClient(</span><span style="color: #000000">"</span><span style="color: #000000">basic</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy2.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy2.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy2.Count();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy2.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy2.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;proxy2.Close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy2.Endpoint.Name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy2.InnerChannel.SessionId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">_________________________________________________________</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();<br />
}<br />
</span></div>
<p><br />
运行的结果：(Output&lt;Debug&gt;)</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//客户端调用前 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//...<br />
//其他代码<br />
//...<br />
WcfServiceLibrary1.MyContract()<br />
//...<br />
//其他代码<br />
//... </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//客户端调用后 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//...<br />
//其他代码<br />
//...<br />
Counter = 1<br />
Counter = 2<br />
Counter = 3<br />
Counter = 4<br />
Counter = 5<br />
Counter = 6<br />
Counter = 7<br />
Counter = 8<br />
Counter = 9<br />
//...<br />
//其他代码<br />
//... </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">从Counter的值看来，多个proxy调用的是同一个Instance。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">值得一提的是WcfServiceLibrary1.MyContract()，也就是构造函数的调用时间是在Service启动的时候，而PerCall与Sessionful构造函数调用时间都是在proxy调用之时。而且只有当Host关闭的时候才会Dispose()。</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">MSDN：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">If the </span></span><a href="ms-help://ms.vscc.v90/43f2ffba-0420-908c-0409-9f662cf03836.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">InstanceContextMode</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt"> value is set to Single the result is that your service can only process one message at a time unless you also set the </span></span><a href="ms-help://ms.vscc.v90/a66ad8f8-f6b7-ee5b-7c2e-45a60d8233c8.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">ConcurrencyMode</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt"> value to </span></span><a href="ms-help://ms.vscc.v90/15f697bf-478b-ae95-499a-29fb4df69bd9.htm"><span style="font-size: 12pt"><span style="font-size: 10pt">Multiple</span></span></a><span style="font-size: 12pt"><span style="font-size: 10pt">. </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">也就是说除非将服务设置成多线程的，否则在一个时间只能处理一个消息请求。</span></span></p>
<h4><span style="font-size: 12pt"><span style="font-size: 10pt">从HOST端控制SingletonInstance</span></span></h4>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">方式一：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">修改代码：</span></span></p>
<table cellspacing="0" cellpadding="2" width="600" border="1">
    <tbody>
        <tr>
            <td valign="top" width="600">
            <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 alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><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 />
            <img id="Codehighlighter1_32_1173_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_1173_Open_Text.style.display='none'; Codehighlighter1_32_1173_Closed_Image.style.display='inline'; Codehighlighter1_32_1173_Closed_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_32_1173_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_1173_Closed_Text.style.display='none'; Codehighlighter1_32_1173_Open_Image.style.display='inline'; Codehighlighter1_32_1173_Open_Text.style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_32_1173_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 alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_32_1173_Open_Text"><span style="color: #000000">{<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Uri&nbsp;baseAddress&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Uri(http:</span><span style="color: #008000">//</span><span style="color: #008000">localhost:8731/Design_Time_Addresses/WcfServiceLibrary1/MyContract/);</span><span style="color: #008000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;WcfServiceLibrary1.MyContract&nbsp;singleInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WcfServiceLibrary1.MyContract();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;singleInstance.CountProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">200</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">设置初始值200</span><span style="color: #008000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;System.ServiceModel.ServiceHost&nbsp;host&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;System.ServiceModel.ServiceHost(singleInstance);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;host.AddServiceEndpoint(</span><span style="color: #0000ff">typeof</span><span style="color: #000000">(WcfServiceLibrary1.IMyContract),&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;WSHttpBinding(),&nbsp;baseAddress);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;host.Open();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">host&nbsp;state&nbsp;=&nbsp;{0}</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;host.State.ToString());&nbsp;<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;ServiceReference1.MyContractClient&nbsp;proxy&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ConsoleApplication1.ServiceReference1.MyContractClient(</span><span style="color: #000000">"</span><span style="color: #000000">WSHttpBinding_IMyContract</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;singleInstance.CountProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">100</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000">修改singletonInstance.CountProperty为100</span><span style="color: #008000"><br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;proxy.Count();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.Endpoint.Name);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.InnerChannel.SessionId);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;proxy.Close();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.Endpoint.Name);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(proxy.InnerChannel.SessionId);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine(</span><span style="color: #000000">"</span><span style="color: #000000">_________________________________________________________</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey();&nbsp;<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;host.Close();<br />
            <img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
            </td>
        </tr>
        <tr>
            <td valign="top" width="600"><font style="font-size: 10pt" face="Courier New">向<br />
            public class MyContract <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%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;CountProperty<br />
            {<br />
            &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000"><br />
            &nbsp;&nbsp;&nbsp;&nbsp;{<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;}<br />
            }</span></div>
            </font></td>
        </tr>
    </tbody>
</table>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">无须启动WcfServiceLibrary1（将用外部Host进行启动）直接运行客户端程序：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">结果：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//客户端调用前 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//...<br />
//其他代码<br />
//...<br />
WcfServiceLibrary1.MyContract()<br />
//...<br />
//其他代码<br />
//... </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//客户端调用后 </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">//...<br />
//其他代码<br />
//...<br />
Counter = 201<br />
Counter = 202<br />
Counter = 101<br />
//...<br />
//其他代码<br />
//... </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">方式二：</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">通过OperationContext.Current.Host 来获取当前进程的host</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">此方法我暂时未调出来，大家有想到或做到的麻烦告诉我！</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">&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"><span style="color: #000000">ServiceHost&nbsp;host&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;OperationContext.Current.Host&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;ServiceHost;<br />
MyContract&nbsp;singletonInstance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;host.SingletonInstance&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;MyContract;<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(singletonInstance&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;singletonInstance.CountProperty&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DateTime.Now.Second;&nbsp;</span></div>
<p></span></span>&nbsp;
<p><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>先假设以上方法可行吧。</strong> </span></span></span>
<p><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>现在我遇到的问题：</strong> </span></span></span>
<p><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>1、OperationContext.Current这里的（MSDN:Gets or sets the execution context for the current thread. <br />
）current thread是指我ConsoleApplication也就是Client的线程呢，还是指Service端的线程？（据我常理分析应该是服务端的线程）。理论上我应该在Count()方法内写这段代码，但是问题又涉及到通过Client端进行调用时是使用proxy，这样真正的情况会是怎样呢？</strong> </span></span></span>
<p><span style="color: red"><span style="font-size: 12pt"><span style="font-size: 10pt"><strong>2、因此我又写了一个在一个ConsoleApplication里完成服务的代码，此时在host.SingletonInstance的确是被赋值了(不再是null了)，但是紧接着我调用OperationContext.Current却发现其为null，也就是说这里的OperationContext并没有被赋值。继而将其转移到同在一个程序内的MyContract.Count()方法中，但是其值仍然为空，因此此法再度失效。</strong> </span></span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><strong><span style="color: red">希望作为高手的您能够提供一个使用OperationContext.Current的场景。什么样算是OperationContext的当前线程？</span></strong> </span></span>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">&nbsp;</span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt">推荐阅读：</span></span></p>
<p><a title="http://www.microsoft.com/china/MSDN/library/Windev/WindowsVista/WCFEssentials.mspx?mfr=true" href="http://www.microsoft.com/china/MSDN/library/Windev/WindowsVista/WCFEssentials.mspx?mfr=true"><span style="font-size: 12pt"><span style="font-size: 10pt">http://www.microsoft.com/china/MSDN/library/Windev/WindowsVista/WCFEssentials.mspx?mfr=true</span></span></a></p>
   <img src ="http://www.cnblogs.com/volnet/aggbug/977680.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42832/" target="_blank">[新闻]YouTube探索新赢利模式 开始售音乐、视频游戏</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>用预编译指令符避免多文件工程中重复定义的问题 </title><link>http://www.cnblogs.com/volnet/articles/cpp_define.html</link><dc:creator>volnet（可以叫我大V）</dc:creator><author>volnet（可以叫我大V）</author><pubDate>Fri, 18 Jul 2008 12:31:00 GMT</pubDate><guid>http://www.cnblogs.com/volnet/articles/cpp_define.html</guid><wfw:comment>http://www.cnblogs.com/volnet/comments/472791.html</wfw:comment><comments>http://www.cnblogs.com/volnet/articles/cpp_define.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/volnet/comments/commentRss/472791.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/volnet/services/trackbacks/472791.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><strong style="mso-bidi-font-weight: normal"><span lang=EN-US>1</span></strong><strong style="mso-bidi-font-weight: normal"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、用预编译指令符可以避免在多文件工程中调用文件的时候可能出现的重复定义的现象。</span><span lang=EN-US><o:p></o:p></span></strong></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">比如：</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Main.cpp<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">#include &#8220;Animal.h&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">#include &#8220;Fish.h&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">&#8230;&#8230;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Animal.h<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">class Animal()<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><span style="mso-tab-count: 2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="FONT-SIZE: 9pt">Fish.h<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">#include &#8220;Animal.h&#8221;<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">class Fish():public Animal<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">{<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt"><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">}<o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt"><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此在调用</span><span lang=EN-US style="FONT-SIZE: 9pt">Main.cpp</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的时候先运行</span><span lang=EN-US style="FONT-SIZE: 9pt"><o:p></o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="FONT-SIZE: 9pt">1</span><span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8594;</span><span lang=EN-US style="FONT-SIZE: 9pt">#include &#8220;Animal.h&#8221;<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; mso-border-alt: solid windowtext .5pt"></span></span><span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; FONT-SIZE: 9pt; 