﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-『听风且吟』</title><link>http://www.cnblogs.com/xiaoshatian/</link><description>倚楼听风雨,淡看江湖路......
不用怀疑了，“笑煞天”和“Windie Chai”都是在下的马甲。</description><language>zh-cn</language><lastBuildDate>Fri, 10 Oct 2008 21:50:41 GMT</lastBuildDate><pubDate>Fri, 10 Oct 2008 21:50:41 GMT</pubDate><ttl>60</ttl><item><title>MVP，多谢……</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/10/08/1305929.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 07 Oct 2008 16:00:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/10/08/1305929.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1305929.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/10/08/1305929.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1305929.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1305929.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/10/08/1305929.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1305929.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42930/" target="_blank">[新闻]Silverlight 2.0正式版下周发布</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>《WF编程》系列之45 - 承载工作流：持久化与跟踪</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/09/12/1289542.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Fri, 12 Sep 2008 01:16:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/09/12/1289542.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1289542.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/09/12/1289542.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1289542.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1289542.html</trackback:ping><description><![CDATA[SQL持久化和跟踪服务分别为工作流状态和跟踪信息提供了持久的存储。但是，它们并没有一起工作。具体来说，每个服务都会使用不同的数据库连接来进行操作。工作流Runtime也因此会使用多个数据库连接。如果跟踪服务开启了事务支持，则会导致额外的开销出现。当事务跨越多个连接时，微软分布式事务协调程序（Microsoft Distributed Transaction Coordinator，MSDTC）会接受事务的管理。MSDTC也会造成一些开销。WF为同时使用了SQL持久化和SQL跟踪服务的应用程序提供了优化方案：SharedConnectionWorkflowCommitWorkBatchService类。这个服务允许两个SQL服务共享一个连接（前提是这两个SQL服务的连接字符串是相同的）。<br />
<br />
<h3>6.5.1 共享连接的配置<br />
</h3>
下面的配置文件配置了SQL工作流服务和共享连接服务。因为我们把连接字符串定义在了CommonParameters节中，所以所有的服务都会使用这个连接字符串。<br />
<div class="cnblogs_code"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF;">&lt;?</span><span style="color: #FF00FF;">xml&#160;version="1.0"&#160;encoding="utf-8"&#160;</span><span style="color: #0000FF;">?&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">configSections</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">section&#160;</span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="WorkflowConfiguration"</span><span style="color: #FF0000;"><br />
&#160;&#160;type</span><span style="color: #0000FF;">="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection,&#160;System.Workflow.Runtime,&#160;Version=3.0.00000.0,&#160;Culture=neutral,&#160;PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">configSections</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">WorkflowConfiguration</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">CommonParameters</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add&#160;</span><span style="color: #FF0000;">name</span><span style="color: #0000FF;">="ConnectionString"</span><span style="color: #FF0000;">&#160;value</span><span style="color: #0000FF;">="Data&#160;Source=(local);Initial&#160;Catalog=WorkflowDB;Integrated&#160;Security=true"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">CommonParameters</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">Services</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add&#160;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="System.Workflow.Runtime.Tracking.SqlTrackingService,&#160;System.Workflow.Runtime,&#160;Version=3.0.00000.0,&#160;Culture=neutral,&#160;PublicKeyToken=31bf3856ad364e35"</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add&#160;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService,&#160;System.Workflow.Runtime,&#160;Version=3.0.00000.0,&#160;Culture=neutral,&#160;PublicKeyToken=31bf3856ad364e35"</span><span style="color: #FF0000;"><br />
&#160;&#160;UnloadOnIdle</span><span style="color: #0000FF;">="true"</span><span style="color: #FF0000;">&#160;</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;</span><span style="color: #800000;">add&#160;</span><span style="color: #FF0000;">type</span><span style="color: #0000FF;">=&#160;"System.Workflow.Runtime.Hosting.SharedConnectionWorkflowCommitWorkBatchService,&#160;System.Workflow.Runtime,&#160;Version=3.0.00000.0,&#160;Culture=neutral,&#160;PublicKeyToken=31bf3856ad364e35"</span><span style="color: #FF0000;">&#160;</span><span style="color: #0000FF;">/&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">Services</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
&#160;&#160;</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">WorkflowConfiguration</span><span style="color: #0000FF;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000FF;">&lt;/</span><span style="color: #800000;">configuration</span><span style="color: #0000FF;">&gt;</span></div>
我们不需要更改我们的应用程序，共享连接服务会在后台和其它Runtime服务一起协调。<br />
<br />
<h2>6.6 小结<br />
</h2>
本章回顾了Windows Workflow Runtime的一些功能。我们分析了如何通过订阅Runtime事件和配置跟踪信息来监视工作流Runtime，还分析了如何通过添加服务来定制Runtime。这些服务包括调度服务（用作管理线程）、持久化服务（用作管理状态）和跟踪服务（用作记录跟踪信息）。如果内置的服务并不能完全满足你的需求，我们可以自己编写服务来替换掉它们。这中架构给予了Windows Workflow Runtime很大的灵活性和扩展性。<br />
<br />
<br />
<table style="margin-top: 10px; margin-right: 10px; margin-bottom: 10px; margin-left: 10px; width: 90%; border-collapse: collapse" bordercolor="#c0c0c0" cellspacing="0" cellpadding="10" rules="rows" align="center" bgcolor="#f0f0f0" border="1">
    <tr>
        <td width="50%">译者注：<br />
        终于译完了第六章，这才发现MSDN已经更新了WF部分中文资源，许多词语也终于有了官方译法，比如之前我一直译作&#8220;持久化&#8221;的&#8220;Persistence&#8221;，官方译作了&#8220;持久性&#8221;，虽然我个人还是认为持久化更加形象，但日后的翻译还是以官方的为准，之前翻译好的部分，也就不再做更新了，相信也不会给大家的阅读造成太大的影响。</td>
    </tr>
</table>
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1289542.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42925/" target="_blank">[新闻]Wikipedia“变心”，力挺Ubuntu</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>《WF编程》系列之44 - 承载工作流：跟踪服务 Tracking Service</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/09/10/1288016.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Wed, 10 Sep 2008 01:07:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/09/10/1288016.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1288016.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/09/10/1288016.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1288016.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1288016.html</trackback:ping><description><![CDATA[摘要: Windows Workflow 提供了可扩展可收缩的跟踪功能来捕捉和记录工作流的执行信息。对于接收到的工作流信息，跟踪服务会使用跟踪配置（tracking profile）来进行筛选。WF Runtime可以发送许多信息，包括工作流事件、活动状态更改、规则判断和我们的自定义检测数据（custom instrumentation data）。跟踪服务有能力决定如何处理接收到的数据，可以把它们记录到日志文件里，也可以保存到数据库中。在本节，我们将会看到Tracking信息是如何通过WF提供的API保存在数据库里的。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/09/10/1288016.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1288016.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42924/" 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>在用c#开发的ActiveX中调用JavaScript方法</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/09/02/1281786.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 02 Sep 2008 01:57:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/09/02/1281786.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1281786.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/09/02/1281786.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1281786.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1281786.html</trackback:ping><description><![CDATA[<p>这段时间要写一个ActiveX控件来控制扫描仪，并在扫描完成之后将文件路径通知页面。因为扫描的过程是异步的，所以我不能利用ActiveX控件公开的Scan方法来返回文件路径，结合Name Ctrl订阅联系人状态的思路，我想，如果可以用JavaScript来订阅ActiveX完成扫描的&#8220;事件&#8221;，我就可以在这个&#8220;事件&#8221;中把文件路径当作参数传递给页面了。<br />
关于如何用c#开发ActiveX控件，<a href="http://www.cnblogs.com/homer" target="_blank">红马天下</a>兄的系列文章写的非常不错，我这里主要讲一下如何在ActiveX中调用页面上的JavaScript方法。<br />
<br />
</p>
<h2>1.引用Microsoft.mshtml<br />
</h2>
<p>Microsoft.mshtml的路径是C:\Program Files\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll，添加引用后在ActiveX对应类中编写：</p>
<p>
<div class="cnblogs_code"><span style="color: #0000FF;">using</span><span style="color: #000000;">&#160;mshtml;</span></div>
<p>&#160;</p>
<h2>2.用c#实现两个COM类，IOleClientSite和IOleContainer<br />
</h2>
<p>
<div class="cnblogs_code"><span style="color: #000000;">[ComImport,<br />
&#160;Guid(</span><span style="color: #800000;">"</span><span style="color: #800000;">00000118-0000-0000-C000-000000000046</span><span style="color: #800000;">"</span><span style="color: #000000;">),<br />
&#160;InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]<br />
</span><span style="color: #0000FF;">public</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">interface</span><span style="color: #000000;">&#160;IOleClientSite<br />
&#160;{<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;SaveObject();<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;GetMoniker(</span><span style="color: #0000FF;">uint</span><span style="color: #000000;">&#160;dwAssign,&#160;</span><span style="color: #0000FF;">uint</span><span style="color: #000000;">&#160;dwWhichMoniker,&#160;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">&#160;ppmk);<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;GetContainer(</span><span style="color: #0000FF;">out</span><span style="color: #000000;">&#160;IOleContainer&#160;ppContainer);<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;ShowObject();<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;OnShowWindow(</span><span style="color: #0000FF;">bool</span><span style="color: #000000;">&#160;fShow);<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;RequestNewObjectLayout();<br />
&#160;}<br />
<br />
[ComImport,<br />
&#160;Guid(</span><span style="color: #800000;">"</span><span style="color: #800000;">0000011B-0000-0000-C000-000000000046</span><span style="color: #800000;">"</span><span style="color: #000000;">),<br />
&#160;InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]<br />
</span><span style="color: #0000FF;">public</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">interface</span><span style="color: #000000;">&#160;IOleContainer<br />
&#160;{<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;EnumObjects([In,&#160;MarshalAs(UnmanagedType.U4)]&#160;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&#160;grfFlags,<br />
&#160;[Out,&#160;MarshalAs(UnmanagedType.LPArray)]&#160;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">[]&#160;ppenum);<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;ParseDisplayName([In,&#160;MarshalAs(UnmanagedType.Interface)]&#160;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">&#160;pbc,<br />
&#160;[In,&#160;MarshalAs(UnmanagedType.BStr)]&#160;</span><span style="color: #0000FF;">string</span><span style="color: #000000;">&#160;pszDisplayName,<br />
&#160;[Out,&#160;MarshalAs(UnmanagedType.LPArray)]&#160;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">[]&#160;pchEaten,<br />
&#160;[Out,&#160;MarshalAs(UnmanagedType.LPArray)]&#160;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">[]&#160;ppmkOut);<br />
</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;LockContainer([In,&#160;MarshalAs(UnmanagedType.I4)]&#160;</span><span style="color: #0000FF;">int</span><span style="color: #000000;">&#160;fLock);<br />
&#160;}</span></div>
<h2><img id="Code_Closed_Image_094453" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_094453').style.display='none'; document.getElementById('Code_Open_Image_094453').style.display='inline'; document.getElementById('Code_Open_Text_094453').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top">3.调用JavaScript方法<br />
</h2>
<p>在Activex控件的对应类中就可以编写如下的CallJavaScript方法：<br />
<img id="Code_Closed_Image_094511" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_094511').style.display='none'; document.getElementById('Code_Open_Image_094511').style.display='inline'; document.getElementById('Code_Open_Text_094511').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top">
<div class="cnblogs_code"><span style="color: #0000FF;">private</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">void</span><span style="color: #000000;">&#160;CallJavaScript(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">&#160;Filenames)<br />
{<br />
&#160;Type&#160;typeIOleObject&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">this</span><span style="color: #000000;">.GetType().GetInterface(</span><span style="color: #800000;">"</span><span style="color: #800000;">IOleObject</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #0000FF;">true</span><span style="color: #000000;">);&#160;<br />
</span><span style="color: #0000FF;">object</span><span style="color: #000000;">&#160;oleClientSite&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;typeIOleObject.InvokeMember(</span><span style="color: #800000;">"</span><span style="color: #800000;">GetClientSite</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&#160;BindingFlags.Instance</span><span style="color: #000000;">|</span><span style="color: #000000;">BindingFlags.InvokeMethod</span><span style="color: #000000;">|</span><span style="color: #000000;">BindingFlags.Public,<br />
</span><span style="color: #0000FF;">null</span><span style="color: #000000;">,<br />
</span><span style="color: #0000FF;">this</span><span style="color: #000000;">,<br />
</span><span style="color: #0000FF;">null</span><span style="color: #000000;">);&#160;<br />
<br />
&#160;IOleClientSite&#160;oleClientSite2&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;oleClientSite&#160;</span><span style="color: #0000FF;">as</span><span style="color: #000000;">&#160;IOleClientSite;<br />
&#160;IOleContainer&#160;pObj;<br />
&#160;oleClientSite2.GetContainer(</span><span style="color: #0000FF;">out</span><span style="color: #000000;">&#160;pObj);<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">参数数组</span><span style="color: #008000;"><br />
</span><span style="color: #0000FF;">object</span><span style="color: #000000;">[]&#160;args&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">new</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">object</span><span style="color: #000000;">[</span><span style="color: #800080;">1</span><span style="color: #000000;">];<br />
&#160;args[</span><span style="color: #800080;">0</span><span style="color: #000000;">]&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;Filenames;<br />
<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">获取页面的Script集合</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&#160;IHTMLDocument&#160;pDoc2&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;(IHTMLDocument)pObj;<br />
</span><span style="color: #0000FF;">object</span><span style="color: #000000;">&#160;script&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;pDoc2.Script;<br />
<br />
</span><span style="color: #0000FF;">try</span><span style="color: #000000;"><br />
&#160;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">调用JavaScript方法OnScaned并传递参数，因为此方法可能并没有在页面中实现，所以要进行异常处理</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&#160;script.GetType().InvokeMember(</span><span style="color: #800000;">"</span><span style="color: #800000;">OnScaned</span><span style="color: #800000;">"</span><span style="color: #000000;">,<br />
&#160;BindingFlags.Instance&#160;</span><span style="color: #000000;">|</span><span style="color: #000000;">&#160;BindingFlags.InvokeMethod&#160;</span><span style="color: #000000;">|</span><span style="color: #000000;">&#160;BindingFlags.Public,<br />
</span><span style="color: #0000FF;">null</span><span style="color: #000000;">,&#160;<br />
&#160;script,&#160;<br />
&#160;args);<br />
&#160;}<br />
</span><span style="color: #0000FF;">catch</span><span style="color: #000000;">&#160;{&#160;}<br />
}</span></div>
<p>&#160;</p>
<h2>4.在页面中实现相应的JavaScript方法<br />
</h2>
<p>在包含这个ActiveX控件的页面中添加如下的JavaScript方法：<br />
<img id="Code_Closed_Image_094528" style="display: none" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_094528').style.display='none'; document.getElementById('Code_Open_Image_094528').style.display='inline'; document.getElementById('Code_Open_Text_094528').style.display='inline';" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" alt="" width="11" height="16" align="top">
<div class="cnblogs_code"><span style="color: #000000;">&lt;</span><span style="color: #000000;">script&#160;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;">&#160;<br />
</span><span style="color: #0000FF;">function</span><span style="color: #000000;">&#160;OnScaned(files)<br />
&#160;{<br />
</span><span style="color: #0000FF;">if</span><span style="color: #000000;">(files)<br />
&#160;{<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">do&#160;something</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&#160;}<br />
&#160;}&#160;<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">/</span><span style="color: #000000;">script&gt;</span><span style="color: #000000;"><br />
</span></div>
这样，在ActiveX控件中调用CallJavaScript方法时，最终就会调用到页面中的OnScaned方法，藉此实现了ActiveX的&#8220;事件&#8221;机制。<br />
<br />
在测试的过程中发现一些有趣的事情，不妨也和大家分享一下：
<ol>
    <li>object元素的结束：object元素只能以&lt;object&gt;&lt;/object&gt;的方式结束，而不能简单的用&lt;object/&gt;来结束，这样结束的后果是object后边的元素都无法在JavaScript方法中获取，可能是浏览器还认为object元素没有结束吧。</li>
    <li>参数的类型：最初我想在c#中给JavaScript方法传递数组类型的参数，但当JavaScript方法执行时，我发现JavaScript将该参数识别为&#8220;unknown&#8221;，并且无法对其做任何处理，所以最后只好作罢，用传递以&#8220;|&#8221;分隔的字符串代替。</li>
    <li><a tabindex="-1" href="http://www.cnblogs.com/liubiqu/articles/92632.html" target="_blank">小草的这篇文章</a>提供了更简单的调用JavaScript方法，只需要在初始化时传递页面的window属性，但我还没弄清楚如何给JavaScript传递参数。</li>
</ol>
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1281786.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42923/" target="_blank">[新闻]13款Firefox Gmail扩展</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>《WF编程》系列之43 - 承载工作流：持久性服务 Persistence Services</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/08/27/1277130.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Wed, 27 Aug 2008 01:03:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/08/27/1277130.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1277130.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/08/27/1277130.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1277130.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1277130.html</trackback:ping><description><![CDATA[摘要: 工作流在长时间运行时难免会遇到一些问题，许多业务逻辑需要花费数日、数周乃至数月。在这段时间中，我们不能让工作流实例一直驻留在内存中（比如，我们需要一份开支报告，而不巧的是对此负责的会计师却在西班牙海滩休假，怎么办呢？）。在Windows Workflow中，可以通过持久化服务来解决长时间运行的工作流可能遇到的问题。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/08/27/1277130.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1277130.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42922/" target="_blank">[新闻]支持鼠标手势的Chrome中文修改版</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>使用NameCtrl为网页集成Office Communicator状态信息</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/08/04/1258399.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Mon, 04 Aug 2008 01:05:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/08/04/1258399.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1258399.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/08/04/1258399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1258399.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1258399.html</trackback:ping><description><![CDATA[<strong>NameCtrl</strong>是Office自带的一个ActiveX控件，它存在于C:\Program Files\Microsoft Office\Office12\NAME.DLL中。利用它可以显示<strong>Office Communicator</strong>的状态图标，并且图标包含了菜单，通过菜单可以进行聊天，发送邮件等操作。<br />
关于NameCtrl的细节请访问<a tabindex="-1" href="http://msdn.microsoft.com/en-us/library/bb862236.aspx">http://msdn.microsoft.com/en-us/library/bb862236.aspx</a><br />
Spirit在《<a tabindex="-1" href="http://www.cnblogs.com/shangmeizhai/archive/2008/01/15/1040245.html">Web系统集成ＯＣＳ在线状态功能</a>》一文中向大家介绍了如何使用这个控件，而我这篇文章将从NameCtrl的一个方法和一个事件入手，来更完美的在网页中集成Office Communicator状态信息。<br />
<br />
先来谈谈直接使用NameCtrl来显示状态的好处吧：<br />
NameCtrl是Office提供的ActiveX控件，我们只需要直接在HTML中编写非常简单的JavaScript代码来和它交互，而不必编写Server端代码，轻而易举的实现Ajax效果。<br />
但是它也有一些缺憾：<br />
首先，NameCtrl是不可以永久显示的，它需要你调用它的<strong>ShowOOUI</strong>来显示状态图标，当你点击此状态图标打开菜单，然后关闭菜单后，这个图标也就不见了；<br />
其次，NameCtrl的菜单是不可以自定义的，有时候我们并不想显示这个菜单。<br />
<br />
<p>如果你想要像Office Communicator内置的联系人状态显示效果，方法不止一种，本文还是使用NameCtrl控件，利用它的一个方法（<strong>GetStatus</strong>）和一个事件（<strong>OnStatusChange</strong>）来完成这样的效果。<br />
<img src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/oc_contacts.png" border="0" alt="" width="260" height="441" /><br />
</p>
<br />
下面来介绍一下GetStatus方法和OnStatusChange事件：<br />
<br />
<strong>GetStatus(bstrName, bstrID)</strong><br />
此方法用来订阅联系人的状态信息。它的参数<strong>bstrName</strong>表示联系人的账号；而参数<strong>bstrID</strong>则是一个HTML元素的ID，这个ID有什么用呢？请往下看。<br />
<br />
<strong>MyOnStatusChange(name, status, id)</strong><br />
当通过GetStatus订阅的联系人状态发生了改变，就会触发此事件。它的参数<strong>name</strong>表示联系人的账号；参数<strong>status</strong>表示联系人的当前状态，是一个int值，下面我会列出可能的值和其含义；参数<strong>id</strong>就是我们调用GetStatus是传入的参数bstrID了。<br />
在我的测试中发现，status的值和Office Communicator的默认状态有如下对应关系：<br />
0：空闲<br />
1：显示为脱机；脱机<br />
2：离开<br />
3：忙碌<br />
4：马上回来<br />
9：请勿打扰<br />
中间空了几个是什么我也不知道。<br />
<br />
那么在我们的网页中如何使用这两个方法呢？<br />
<br />
首先，我们在初始化联系人列表时，在所有联系人前面默认添加一个状态图标（这个图标可以显示为脱机状态），然后，调用GetStatus方法来订阅所有联系人的状态信息。<br />
<div class="cnblogs_code"><span style="color: #000000;">NameObj.GetStatus(childNode.Attributes[</span><span style="color: #000000;">"</span><span style="color: #000000;">Email</span><span style="color: #000000;">"</span><span style="color: #000000;">],&#160;childNode.ImageElement().id);</span></div>
<p>&#160;</p>
<p>然后，处理OnStatusChange事件，根据传入参数来改变UI的中相应的状态图标。<br />
</p>
<div class="cnblogs_code"><span style="color: #000000;">&#160;&#160;</span><span style="color: #0000FF;">function</span><span style="color: #000000;">&#160;MyOnStatusChange(name,&#160;status,&#160;id)<br />
&#160;&#160;{<br />
&#160;&#160;</span><span style="color: #0000FF;">var</span><span style="color: #000000;">&#160;img&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;document.getElementById(id);<br />
&#160;&#160;img.src&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;</span><span style="color: #000000;">"</span><span style="color: #000000;">images/</span><span style="color: #000000;">"</span><span style="color: #000000;">&#160;</span><span style="color: #000000;">+</span><span style="color: #000000;">&#160;status&#160;</span><span style="color: #000000;">+</span><span style="color: #000000;">&#160;</span><span style="color: #000000;">"</span><span style="color: #000000;">.png</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&#160;&#160;}</span></div>
<p>&#160;</p>
<p>最后，别忘了初始化NameCtrl控件并为其绑定OnStatusChange事件。<br />
<div class="cnblogs_code"><span style="color: #000000;">&#160;&#160;</span><span style="color: #0000FF;">function</span><span style="color: #000000;">&#160;InitializeObject()&#160;<br />
&#160;&#160;{<br />
&#160;&#160;</span><span style="color: #0000FF;">try</span><span style="color: #000000;"><br />
&#160;&#160;{<br />
&#160;&#160;NameObj&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;</span><span style="color: #0000FF;">new</span><span style="color: #000000;">&#160;ActiveXObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Name.NameCtrl</span><span style="color: #000000;">"</span><span style="color: #000000;">);&#160;<br />
&#160;&#160;NameObj.OnStatusChange&#160;</span><span style="color: #000000;">=</span><span style="color: #000000;">&#160;MyOnStatusChange;<br />
&#160;&#160;}<br />
&#160;&#160;</span><span style="color: #0000FF;">catch</span><span style="color: #000000">(e){}<br />
&#160;&#160;}&#160;<br />
&#160;&#160;InitializeObject();&#160;</span></div>
<br />
OK，看一下最终的效果吧：<br />
<p>
<img src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/oc_status.png" border="0" alt="" width="184" height="120" /><br />
</p>
<p>不过NameCtrl有个缺陷，如果你为Office Communicator定制了自定义状态，那么这些自定义状态被NameCtrl捕获后，永远是空闲（0）状态。</p>
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1258399.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42921/" 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>为Office Communicator启用超链接</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/08/01/1258304.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Fri, 01 Aug 2008 08:31:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/08/01/1258304.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1258304.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/08/01/1258304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1258304.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1258304.html</trackback:ping><description><![CDATA[<p>在Office Communicator中集成内部办公的话，很多情况下需要向用户发送一些信息的URL，但是默认情况下，用户收到的URL并不是一个可以点击的链接，而是一个在URL前添加了一个下划线的字符串，如：_http://xiaoshatian.cnblogs.com</p>
<p>&#160;</p>
<p>为Office Communicator启用链接只需要两步：配置URL筛选和允许超链接，下面来介绍这两步的操作。</p>
<p>&#160;</p>
<p>第一步，在&#8220;管理工具&#8221;中打开&#8220;Office Communication Server 2007&#8221;，找到相应的池，点击右键，在&#8220;应用程序属性&#8221;点击&#8220;智能IM筛选器&#8221;，会弹出如下图所示的对话框：<br />
</p>
<p><img src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/im_filter.png" border="0" alt="" width="663" height="502" /></p>
<br />
在&#8220;URL筛选器&#8221;标签页中设置。如果你不勾选&#8220;启用URL筛选&#8221;，那么OCS就会将URL正确的发送给客户端。<br />
如果启用了筛选，则可以对消息中的URL做进一步的控制，对话框中的文字描述的很清楚了，就不在解释了。<br />
如果在这一步配置后，如果消息中的URL通过了OCS筛选，那么将就会以链接的形式发送给客户端。<br />
<br />
第二步，允许超链接。<br />
这一步是客户端的设置，但是你一定不希望逐个客户端去设置，我们可以在域控制器中做相关的设置，然后将这些设置推到客户端。<br />
有两种方式可以设置客户端允许超链接：注册表和组策略，我更倾向于后者，因为后者有更容易理解的用户界面。<br />
Office Communicator 2007的功能策略管理模板被包含与Office Communicator 2007策略文档中，可以移步至微软下载中心下载（<a tabindex="-1" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=dd3cae08-3153-4c6a-a314-daa79d616248">http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=dd3cae08-3153-4c6a-a314-daa79d616248</a>）。<br />
添加了管理模板后，我们可以找到&#8220;在即时消息中允许超链接&#8221;一项，将其启用即可。<br />
<br />
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1258304.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42911/" 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>《WF编程》系列之42 - 承载工作流：调度（Scheduling）服务</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/07/29/1255113.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 29 Jul 2008 05:09:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/07/29/1255113.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1255113.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/07/29/1255113.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1255113.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1255113.html</trackback:ping><description><![CDATA[摘要: Windows Workflow Foundation中有两种调度服务：DefaultWorkflowSchedulerService和ManualWorkflowSchedulerService。
本文将为大家介绍这两种调度服务的区别，通过配置文件配置服务的方法，各自适合的场景。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/07/29/1255113.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1255113.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42910/" target="_blank">[新闻]MySpace音乐下载量2周内破10亿 苹果用了3年</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/xiaoshatian/archive/2008/07/22/1248102.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 22 Jul 2008 01:04:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/07/22/1248102.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1248102.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/07/22/1248102.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1248102.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1248102.html</trackback:ping><description><![CDATA[<p style>
在上一篇文章《<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2008/07/15/1242998.html">MOSS多级审批工作流【StateMachine版】</a>》中，有这样一个情景，我创建了两个任务，并且要等到这两个任务都完成后，根据其结果进行一些操作。在这一部分，我遇到一个问题，如何并行的处理这两个任务呢？
</p>
<p>&#160;</p>
<p>已知一个EventDrivenActivity不能跳转到一个以上的StateActivity中，所以我只能在同一个StateActivity中处理这两个任务。于是又引出一个问题，既然要并行的处理这两个任务，那么就得将OnTaskChangedActivity分别添加到不同的EventDrivenActivity中，那么如何在两个任务都被修改之后再进行操作呢？也就是说，如何在两个EventDrivenActivity都结束之后继续操作呢？
</p>
<p>&#160;</p>
<p>在上一篇文章中，我的方法是每一次修改任务之后，都维护一个bool值，然后在每个EventDrivenActivity的最后添加IfElseActivity来判断两个bool值是否都为TRUE，如果都为TRUE，再根据任务审批结果跳转到不同的StateActivity。
</p>
<p>这种方法固然没有问题，但终究有些繁琐，而且，如果我们修改了流程，需要使IfElseActivity中某一分支跳转到新添加的StateActivity，那么就得到逐个EventDrivenActivity内部修改。
</p>
<p>&#160;</p>
<p>其实我们完全可以把这种方法再抽象一下，为什么说状态机工作流是&#8220;事件驱动&#8221;工作流呢？是因为每一个状态都依靠事件来决定下一步的流转方向。
</p>
<p>就拿在SharePoint工作流中为用户创建任务为例，我们在StateInitializationActivity中添加CreateTaskActivity来创建任务，然后在EventDrivenActivity中添加OnTaskChangedActivity来接收任务被修改的事件，根据任务修改的结果来决定跳转到哪个StateActivity。
</p>
<p>那么CreateTaskActivity和OnTaskChangedActivity又是什么原理呢？CreateTaskActivity其实是从CallExternalMethodActivity继承而来，而OnTaskChangedActivity是从HandleExternalEventActivity继承而来，这两个活动一个用来调用宿主的方法，一个用来接收宿主的数据（如果想了解这两个活动，请参见我翻译的《WF编程 - 本地通信事件》（<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2007/08/03/841988.html">1</a>、<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2007/08/07/846915.html">2</a>））。</p>
<p>CreateTaskActivity调用SharePoint Service提供的的CrateTask方法来创建一个任务，当用户修改了任务时，SharePoint Service就触发OnTaskChanged事件，工作流中的OnTaskChangedActivity捕获了此事件，进行处理，使得工作流可以继续进行。</p>
<p>&#160;</p>
<p>再回来思考我们的需求，不就是希望在每一次任务修改之后都能触发一个共同的事件，在利用此事件判断是否所有任务都已经完成吗？
</p>
<p>那么参照CreateTaskActivity和OnTaskChangedActivity的方式，我们只需要这样做就可以满足要求了，在每一次任务被修改后，使用CallExternalMethodActivity调用一个方法，这个方法当然不可能是SharePoint提供的了，这需要我们自己提供，这个方法只做一件事情，就是触发一个事件。接着我们在同一个StateActivity中再添加一个新的EventDrivenActivity，在其内部添加一个HandleExternalEventActivity来接收这个事件，接着再利用IfElseActivity来判断所有任务的处理结果并执行相应的跳转。
这样做的好处是把以前每个EventDrivenActivity中的IfElseActivity独立成为一个单独的部分，利用WF的本地通信服务，我们仍然可以实现每一次修改活动，都执行IfElseActivity，但如果需要修改跳转的目标StateActivity，再也不需要逐个修改了。</p>
<p>&#160;</p>
<p>但是在这个示例中，我并没有直接用CallExternalMethodActivity和HandleExternalEventActivity活动，而是继承它们来得到两个自定义活动，为什么要这样做呢？
</p>
<p>前边提到，CallExternalMethodActivity会调用一个方法，这个方法需要我们自己提供，那么我们就要编写相应的接口和实现这个接口的服务，最重要的是，我们必须在ExternalDataExchangehangeService中添加这个服务，然而SharePoint Service并不允许我们接触Workflow Runtime，好在如果开发自定义活动的话，在活动的Execute方法中，我们可以通过ActivityExecutionContext的相关方法获得ExternalDataExchangehangeService，然后为其添加自定义服务。</p>
<p>关于WF本地通信服务的机制和开发方法，请参见我翻译的《WF编程 - 触发事件与调用方法》（<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2007/07/13/816947.html">1</a>、<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2007/07/16/819862.html">2</a>、<a tabindex="-1" href="http://www.cnblogs.com/xiaoshatian/archive/2007/07/16/819862.html">3</a>）。
</p>
<p>&#160;</p>
<p>这篇逻辑混乱的说明文到此结束，各位朋友倘若看的不明白，那一定是我的文笔太差，下载源码一看便能明白了。
</p>
<p><a tabindex="-1" href="http://files.cnblogs.com/xiaoshatian/StateMachineApprovalWithCustomActivity.rar">点击下载源码</a>（本例为MOSS多级审批工作流【StateMachine版】的修改版）</p>
<p>注：</p>
<ul>
    <li>请用Visual Studio 2008打开源码</li>
    <li>需要SharePoint Service支持</li>
    <li>编译之后请手工将WindStyle.WindowsWorkflow.Activities.dll添加到GAC</li>
</ul>
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1248102.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42909/" target="_blank">[新闻]2008年10月10日科技博客精选</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>MOSS多级审批工作流【StateMachine版】v1.1</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/07/15/1242998.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 15 Jul 2008 01:08:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/07/15/1242998.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1242998.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/07/15/1242998.html#Feedback</comments><slash:comments>45</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1242998.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1242998.html</trackback:ping><description><![CDATA[去年我发布过一个<a href="http://www.cnblogs.com/xiaoshatian/archive/2007/02/26/657181.html" target="_blank">MOSS多级审批工作流，采用顺序工作流模式开发</a>；<a href="http://www.cnblogs.com/xiaoshatian/archive/2007/08/01/839609.html" target="_blank">后来又做了一些改进，用ConditionedActivityGroupActivity取代了繁复的WhileActivity+IfElseActivity嵌套，但仍然是顺序工作流</a>。<br />
在第二篇文章的末尾我曾写道：&#8220;审批这样的流程并不适合用顺序工作流来实现，用WF的另外一种工作流-状态机工作流会更好&#8221;，为什么这样说呢？<br />
我们已经知道，顺序工作流的执行过程是一个连续的步骤，从开始到结束，虽然我们可以利用While这样的循环活动让工作流看起来往回去执行了几步，但是这样的后果就是一张难以理解的流程图和复杂的执行逻辑。<br />
真实世界的工作流程是灵活的，往往不是一条线走到底的，中间可能包含这许多决策，每个决策都可能让流程走向另外一个方向。所以包含人类参与的工作流其实是一个决策推动的流程，把它抽象到工作流中，就成了&#8220;事件驱动工作流&#8221;，也就是状态机工作流（StateMachine Workflow）。<br />
状态机工作流由一系列状态（State）组成，每个状态中又可以包含一系列事件的处理程序。状态机工作流总是停留在一个状态中，等待必要的事件被触发，然后跳转到新的状态。<br />
那么现在再来看看这个多级审批工作流的原始流程图：<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/r_preview.PNG" border="0" />&nbsp;<br />
下面是用状态机实现后的流程图：<br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/statemachine.png" border="0" />&nbsp;<br />
你会发现，状态机工作流的流程图和我们最初的流程图相当接近，无论是流程块还是之间的连线。如果再和之前用<a href="http://www.cnblogs.com/xiaoshatian/archive/2007/08/01/839609.html" target="_blank">顺序工作流实现后的流程图</a>对比一下，那么以后你在遇到人类参与的工作流时，一定不会考虑用顺序工作流实现了。<br />
<br />
下面简要的说明一下状态机工作流的开发要点：<br />
<br />
<h4>1.如何规划状态？</h4>
在MOSS的状态机工作流中，我们一般这样规划一个状态： <br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/StateActivity.png" border="0" /><br />
在状态初始（StateInitializationActivity）时创建任务（CreateTaskActivity），在状态结束（StateFinalizationActivity）时删除任务（DeleteTaskActivity）。而在初始化和结束之间，我们可以添加多个事件驱动（EventDrivenActivity），EventDrivenActivity的作用是接收并处理事件（比如任务被修改的事件，OnTaskChangedActivity），然后可以根据事件的处理结果跳转到其它状态（SetStateActivity），你可以将SetStateActivity理解为各个状态之间的连接线。 <br />
<h4>2.如何实现Task3和Task4的并发？</h4>
注意在最初的流程图中，Task3和Task4是两个并列的任务，在这个审批流程的Sequence版实现中，我们当然选择用ParallelActivity来实现并发，在StateMachine中我们仍然可以这样做，不过如果要将Task3和Task4安排成两个状态，我们就得在ParallelActivity的两个分支中都添加一个SetStateActivity并指向相应的State。<br />
但是这时候你会吃惊的发现，虽然每条分支都执行了，但只有最后一条分支中的SetStateActivity正确的执行了跳转。<br />
因为一个EventDrivenActivity只能跳转到一个StateActivity，所以我们需要其它方法来实现Task3和Task4的并发。<br />
<br />
我的方法是将Task3和Task4集成到一个状态里，先在状态初始时创建两个任务，然后添加两个几乎一模一样的EventDrivenActivity来分别处理两个任务被修改的事件，下面是这个EventDrivenActivity的子活动组成： <br />
<img alt="" src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/EventDrivenActivity.png" border="0" /><br />
在处理完任务被修改的事件后，我会将此任务标记为&#8220;已完成&#8221;，并记录其审批结果；接着，利用IfElseActivity判断两个任务是否都被标记为&#8220;已完成&#8221;，如果还有任务没有完成，就不做任何操作，如果两个任务都已经完成，就再根据它们的审批结果来决定跳转到哪个状态。 <br />
<br />
<h4>3.为什么把删除任务的活动添加到了EventDrivenActivity内部而不是StateFinalizationActivity内部？</h4>
这样做是因为我想在任务被处理后马上删除它，但StateActivity总是等到执行SetStateActivity时才会执行到StateFinalizationActivity，而上面我们已经实现了两个任务都完成后才发生跳转，所以如果将DeleteTaskActivity添加到StateFinalizationActivity的话，就做不到实时删除任务了。&nbsp;<br />
<br />
<h4>4.为什么要在EventDrivenActivity内部添加IfElseActivity？</h4>
答案是为了实现直到两个任务都完成后才发生跳转。<br />
但是，这样做的后果就是我不得不在每次处理完任务之后都添加这个IfElseActivity，好在我们的流程只有两个并发的任务，如果有三个、五个甚至更多呢？这种判断方法就显得非常麻烦，而且会让流程结构变得臃肿，难道就没有更好的方法吗？希望和大家一起探讨这个问题，我也会在下一篇文章中介绍一种取代这种频繁利用IfElseActivity进行判断的方法。 <br />
<br />
OK，以上就是这个多级审批工作流（StateMachine版）的实现要点，欢迎大家共同交流探讨。<br />
源码下载：<a href="http://www.cnblogs.com/Files/xiaoshatian/StateMachineApproval.rar">点击下载</a>（Visual Studio 2008） 
 <img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1242998.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42908/" 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>【漫画】兔子，胡萝卜和屎</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/06/30/1232212.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Sun, 29 Jun 2008 17:11:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/06/30/1232212.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1232212.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/06/30/1232212.html#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1232212.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1232212.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/06/30/1232212.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1232212.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42906/" target="_blank">[新闻]Windows应该在错误信息上多做改进</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>简单的Silverlight音乐播放器Widget</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/06/26/1230091.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Thu, 26 Jun 2008 01:33:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/06/26/1230091.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1230091.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/06/26/1230091.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1230091.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1230091.html</trackback:ping><description><![CDATA[摘要: <div><img src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/windstyleplayer.jpg" style="float:right"/>上周尝试了一下发布不久的Silverlight 2 beta2，设计了这么一个简单的播放器widget。它支持循环播放，支持自动播放，支持封面图片，支持暂停（鼠标移动到封面上就会淡入按钮）。<br>本来是想设计的稍微酷一点的，发现Silverlight2的矩阵变形能力还是相当弱的，其实现的功能也就是平移、平行四边形化和旋转，如果再支持梯形化就好了。<br>同时，也发现beta2相较之前版本的一些不同之处。</div>&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/06/26/1230091.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1230091.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42905/" target="_blank">[新闻]是运气还是实力 评诺基亚S60平台的成功</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>C#简单操作Lotus Notes邮件</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/06/17/1223439.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 17 Jun 2008 01:10:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/06/17/1223439.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1223439.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/06/17/1223439.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1223439.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1223439.html</trackback:ping><description><![CDATA[摘要: 前段时间简单的研究了一下.NET操作Lotus Notes邮件的实现，具体的操作包括邮件的读取和发送，而且都要包含附件，其间参考了《在 Microsoft .NET 应用程序中使用 IBM Lotus Domino》一文，现在把成果和大家分享一下。<br>本文将分为获取用户列表、发送邮件、收取邮件三个部分，并会在文末提供范例程序的下载。 &nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/06/17/1223439.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1223439.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42904/" target="_blank">[新闻]首个中美间Tb级直达海底光缆开通</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>Silverlight 2 打造饭否Show</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/04/29/1175401.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 29 Apr 2008 01:38:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/04/29/1175401.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1175401.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/04/29/1175401.html#Feedback</comments><slash:comments>30</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1175401.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1175401.html</trackback:ping><description><![CDATA[摘要: <div><img src="http://www.cnblogs.com/images/cnblogs_com/xiaoshatian/85614/SilverlightFanfouShow.png" style="float:right"/>在Silverlight 1.1的时候，我就像用Silverlight设计一个饭否Show，无奈1.1时代貌似只能通过Web Services来获取跨域的数据，我认为这是一种别扭的开发方式，再加上1.1对中文并不友好，所以就改用Flash实现了这个饭否Show。<br>Silverlight 2终于解决了上述的两个问题，支持跨域获取数据，支持中文显示，于是我迫不及待的尝试着开发了一个饭否Show（在Silverlight 2 beta SDK 发布的几日后开始开发，开发完成后便忘记了，-___-|||），下面来简要的分享一下开发过程，也望各位Silverlight前辈不吝指教。</div>&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/04/29/1175401.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1175401.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42903/" target="_blank">[新闻]Firefox 3.1开发日程表再次延长 11月发布Beta 2</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>《WF编程》系列之41 - 承载工作流：日志和配置文件</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/04/21/1163037.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Mon, 21 Apr 2008 01:37:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/04/21/1163037.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1163037.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/04/21/1163037.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1163037.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1163037.html</trackback:ping><description><![CDATA[摘要: Windows Workflow 其实是一个Runtime，而不是应用程序。在启动工作流之前，宿主进程必须先加载并运行工作流Runtime。宿主进程告诉Runtime要创建什么类型的工作流，Runtime则负责管理工作流的生命周期并通知宿主进程重要的生命周期事件，比如工作流的完成和终结。Runtime并不挑剔它的宿主，宿主可以是台式机上的智能客户端应用程序，也可以是机架上的服务器中运行的ASP.NET进程。所有宿主进程需要做的只是加载.NET 3.0工作流程序集而已。
在本章中，我们将深入探讨Windows Workflow Runtime和它的服务。首先来认识一下日志（Logging）、跟踪（Trackng）和工作流Runtime的配置选项；接着是调度服务（Scheduling Services），调度服务为Runtime执行工作流提供了线程支持；然后是持久化服务，持久化服务允许我们将工作流状态信息保存到持久存储设备；最后，我们将介绍跟踪服务，跟踪服务允许我们监视工作流的执行过程。&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/04/21/1163037.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1163037.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42902/" target="_blank">[新闻]Google浏览器开源版Linux环境安装成功</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/xiaoshatian/archive/2008/04/17/1157224.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Wed, 16 Apr 2008 17:21:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/04/17/1157224.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1157224.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/04/17/1157224.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1157224.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1157224.html</trackback:ping><description><![CDATA[&#8220;<strong>笑煞天</strong>&#8221;这个名字是10年前（感觉很老似的）申请QQ的时候绞尽脑汁想出来的。<br />
毕业之后突然感觉这个名字太&#8220;彪悍&#8221;了，江湖味太重，就换了一个马甲&#8220;<strong>Windie Chai</strong>&#8221;，从此开始了两个ID交错使用的历史。<br />
以为从此后朋友们就会开始犯迷糊：&#8220;到底哪个是你？哪个不是你？还是两个都&#8230;&#8230;&#8221;，但没想到<a href="http://blog.joycode.com/choral/ " target="_blank">Choral兄</a>居然可以把这两个马甲关联起来了，着实佩服，呵呵。<br />
从今天起我在博客园的马甲就换成&#8220;Windie Chai&#8221;了，不过，是试运行哦，如果大家有何不适的话，我还是改回来好了，呵呵。<br />
<img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1157224.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42894/" target="_blank">[新闻]电信IM - “宽乐通信”亮相</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>《WF编程》系列之40 - 自定义活动:活动的执行</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/04/10/1145960.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Thu, 10 Apr 2008 01:30:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/04/10/1145960.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1145960.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/04/10/1145960.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1145960.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1145960.html</trackback:ping><description><![CDATA[摘要: 在Windows Workflow中，一个活动有几种可能的状态？它们之间是如何转换的？如果我们编写自定义复合活动，该如何控制子活动的状态转换？&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/04/10/1145960.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1145960.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42893/" target="_blank">[新闻]Google新卫星传回首张高清晰照片</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>解决HTML内部元素的Mouse事件干扰</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/03/28/1127377.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Fri, 28 Mar 2008 04:10:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/03/28/1127377.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1127377.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/03/28/1127377.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1127377.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1127377.html</trackback:ping><description><![CDATA[摘要: 话说有一个DIV元素，其内部有一个IMG元素和SPAN元素，不用理会这两个内部元素怎么布局，这不是我要讨论的重点。<br>为了实现一些特殊的效果，我需要利用TD的onmouseover和onmouseout事件，测试时就会发现如下的状况：<br>当鼠标移入DIV内部时，onmouseover事件被触发；接着再鼠标移动到DIV内部的IMG或者SPAN元素之上，我们肯定不会认为这时鼠标已经移到了DIV的外边，但奇怪的是onmouseout事件触发了，而且紧接着onmouseover事件也马上被触发了。<br>这可不是我想要的，那么怎么来“屏蔽”内部元素给外层元素带来的Javascript事件干扰呢？<br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/03/28/1127377.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1127377.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42891/" target="_blank">[新闻]微软放出“I'm a PC”广告主角访谈</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>《WF编程》笔记目录</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/818615.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 18 Mar 2008 01:33:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/818615.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/818615.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/818615.html#Feedback</comments><slash:comments>43</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/818615.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/818615.html</trackback:ping><description><![CDATA[摘要: &nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/818615.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/818615.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42869/" target="_blank">[新闻]Google推出AdSense for Games 视频游戏广告</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>《WF编程》系列之39 - 自定义活动:继承法与活动组件</title><link>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/1110693.html</link><dc:creator>Windie Chai（笑煞天）</dc:creator><author>Windie Chai（笑煞天）</author><pubDate>Tue, 18 Mar 2008 01:33:00 GMT</pubDate><guid>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/1110693.html</guid><wfw:comment>http://www.cnblogs.com/xiaoshatian/comments/1110693.html</wfw:comment><comments>http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/1110693.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/xiaoshatian/comments/commentRss/1110693.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/xiaoshatian/services/trackbacks/1110693.html</trackback:ping><description><![CDATA[摘要: 从根本上来说,采用组成法或继承法来创建自定义活动并没有太大的差别.<br>而且相对组成发来说,继承法更加容易理解.<br>在组成法中,我们关注于如何组织自定义活动内的子活动,并且创建了活动属性和执行模型.<br>而继承法是一种相对更加初级的方法,我们关注的更多的是活动本身所承载的功能.<br>让我们用继承法编写一个向控制台输出字符串的自定义活动,并为其添加验证器和友好的设计器外观吧.&nbsp;&nbsp;<a href='http://www.cnblogs.com/xiaoshatian/archive/2008/03/18/1110693.html'>阅读全文</a><img src ="http://www.cnblogs.com/xiaoshatian/aggbug/1110693.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42869/" target="_blank">[新闻]Google推出AdSense for Games 视频游戏广告</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></channel></rss>