<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sleepiness in Seattle &#187; C#</title>
	<atom:link href="http://stanblog.jojoyao.com/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://stanblog.jojoyao.com</link>
	<description>Stanley&#039;s Chat on the Technology and Business</description>
	<lastBuildDate>Tue, 21 Apr 2009 04:29:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Use Windows Desktop Search API Inside of Managed Code</title>
		<link>http://stanblog.jojoyao.com/2007/04/use-windows-desktop-search-api-inside-of-managed-code/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=use-windows-desktop-search-api-inside-of-managed-code</link>
		<comments>http://stanblog.jojoyao.com/2007/04/use-windows-desktop-search-api-inside-of-managed-code/#comments</comments>
		<pubDate>Tue, 17 Apr 2007 14:10:36 +0000</pubDate>
		<dc:creator>Stanley Yao</dc:creator>
				<category><![CDATA[Search Engine]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[desktop search]]></category>
		<category><![CDATA[search]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://stanblog.jojoyao.com/newblog/?p=34</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div style="MARGIN: 0in 0in 10pt"><font face="Calibri">Starting from Windows Desktop Search (WDS) 3.0, a new helper API ISearchQueryHelper is added to help simplify the construction of index OLE DB connection string and search queries.&nbsp;The search service is implemented and the API is exposed as COM objects.&nbsp;Fortunately, there is a way for managed code to invoke the WDS too.</font></div>
<div style="MARGIN: 0in 0in 10pt"><font face="Calibri"><a href="http://www.microsoft.com/downloads/thankyou.aspx?familyId=645300ae-5e7a-4ce7-95f0-49793f8f76e8&amp;displayLang=en">Download</a> the Windows Search SDK.&nbsp;After unzip the package, the search interop assembly (Microsoft.Search.Interop.dll) is in the &quot;Managed&quot; folder.&nbsp;Add it to the reference inside of your solution and put &ldquo;</font><span style="FONT-SIZE: 10pt; COLOR: blue; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'">using</span><span style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'"> Microsoft.Search.Interop;</span><font face="Calibri"> &rdquo; at the top of your C# code.&nbsp;Now it&rsquo;s ready to write C# code and make use of WDS API.&nbsp;Some of the unmanaged and managed counterparts of classes are the following:</font></div>
<div align="center">
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; WIDTH: 90%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="80%" border="1">
<tbody>
<tr>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 179.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="239">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><strong><font face="Calibri">Unmanaged</font></strong></div>
</td>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ffffff; WIDTH: 203.8pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="272">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><strong><font face="Calibri">Managed</font></strong></div>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 179.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="239">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">ISearchManager</font></div>
</td>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ffffff; WIDTH: 203.8pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="272">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">CSearchManager</font></div>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 179.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="239">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">ISearchCatalogManager</font></div>
</td>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ffffff; WIDTH: 203.8pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="272">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">CSearchCatalogManager</font></div>
</td>
</tr>
<tr>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 179.25pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="239">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">ISearchQueryHelper</font></div>
</td>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: #ffffff; WIDTH: 203.8pt; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="272">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><font face="Calibri">CSearchQueryHelper</font></div>
</td>
</tr>
</tbody>
</table>
</div>
<div style="MARGIN: 0in 0in 10pt">&nbsp;</div>
<div style="MARGIN: 0in 0in 10pt"><font face="Calibri">The following sample code constructs a search query using ISearchQueryHelper to display the sender, recipients, and summary of the first 100 emails that contain a particular keyword (&ldquo;share&rdquo; in this example). </font></div>
<div align="center">
<table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; WIDTH: 90%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" width="80%" border="1">
<tbody>
<tr>
<td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0in; BORDER-LEFT: black 1pt solid; WIDTH: 6.65in; PADDING-TOP: 0in; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent" valign="top" width="638">
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">int maxSumLength = 100;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">// Setup the catalog and search query helper</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">CSearchManager srchMngr = new CSearchManager();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">CSearchCatalogManager srchCatMngr = srchMngr.GetCatalog(&quot;SystemIndex&quot;);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">CSearchQueryHelper srchQueryHelper = srchCatMngr.GetQueryHelper();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">// Assemble the query</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">srchQueryHelper.QuerySelectColumns = &quot;System.Message.FromAddress, System.Message.ToAddress, System.Search.AutoSummary&quot;;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">srchQueryHelper.QueryWhereRestrictions = &quot;AND CONTAINS(System.Kind, &#8216;\&quot;email\&quot;&#8217;)&quot;;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">string sqlQuery = srchQueryHelper.GenerateSQLFromUserQuery(&quot;share&quot;);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">// Setup the OLE DB connection</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">OleDbConnection conn = new OleDbConnection(srchQueryHelper.ConnectionString);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">conn.Open();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">// Execute the query</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">OleDbCommand cmd = new OleDbCommand(sqlQuery, conn);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">OleDbDataReader srchResult = cmd.ExecuteReader();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">// Process the search result and send to output</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">for (int i = 0; (i &lt; 100) &amp;&amp; srchResult.Read(); ++i)</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">{</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string fromAddr = &quot;&quot;;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string toAddr = &quot;&quot;;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string sumAddr = &quot;&quot;;</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != srchResult.GetValue(0) &amp;&amp; !(srchResult.GetValue(0) is System.DBNull))</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string[] addrs = (string[])srchResult.GetValue(0);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fromAddr = &quot;From: &quot; + System.String.Join(&quot;,&quot;, addrs);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != srchResult.GetValue(1) &amp;&amp; !(srchResult.GetValue(1) is System.DBNull))</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string[] addrs = (string[])srchResult.GetValue(1);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toAddr = &quot;To: &quot; + System.String.Join(&quot;,&quot;, addrs);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null != srchResult.GetValue(2) &amp;&amp; !(srchResult.GetValue(2) is System.DBNull))</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sumAddr = (string)srchResult.GetString(2);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textBox1.AppendText(&quot;(&quot; + i + &quot;) &quot;);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textBox1.AppendText(fromAddr + &quot; &quot; + toAddr + &quot; &quot;);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textBox1.AppendText(&quot;Content: &quot; + (sumAddr.Length &lt;= maxSumLength ? sumAddr : sumAddr.Substring(0, maxSumLength)));</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; textBox1.AppendText(Environment.NewLine);</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">}</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left">&nbsp;</div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">srchResult.Close();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal" align="left"><span style="FONT-SIZE: 10pt"><font face="Calibri">conn.Close();</font></span></div>
<div style="MARGIN: 0in 0in 0pt; LINE-HEIGHT: normal"><span style="FONT-SIZE: 10pt"><font face="Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></span></div>
</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://stanblog.jojoyao.com/2007/04/use-windows-desktop-search-api-inside-of-managed-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extract Favorite Websites Collection from Bookmark RSS feeds</title>
		<link>http://stanblog.jojoyao.com/2007/02/extract-favorite-websites-collection-from-bookmark-rss-feeds/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=extract-favorite-websites-collection-from-bookmark-rss-feeds</link>
		<comments>http://stanblog.jojoyao.com/2007/02/extract-favorite-websites-collection-from-bookmark-rss-feeds/#comments</comments>
		<pubDate>Sun, 25 Feb 2007 18:11:41 +0000</pubDate>
		<dc:creator>Stanley Yao</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[bookmark]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[favorite]]></category>
		<category><![CDATA[rss]]></category>

		<guid isPermaLink="false">http://stanblog.jojoyao.com/newblog/?p=17</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p>Bookmarking a website and bookmarking an article are different usage of the bookmarking tools.  You may want to have a clean collection of all your favorite websites and on the other hand you may want to bookmark multiple good articles from the same website.  This way your bookmark collection is a mixture of both.  This is my little frustration of using sites like <a href="http://del.icio.us/">http://del.icio.us/</a>.  It&#8217;s great in collect articles and links, but not so great to keep a clean list of my favorite <strong>websites</strong>.  Although I can use a different bookmarking tool (e.g., <a href="http://favorites.live.com/">http://favorites.live.com/</a>, which could sync with IE bookmarks) to collect just sites, it&#8217;d be nice if I could keep them in one place.  So I developed a custom web control that could be put on your website to display all the websites of a list of <a href="http://del.icio.us/">http://del.icio.us/</a> RSS feeds in the order of popularity.  Multiple articles of each websites are collapsed into one entry shown for that website, and the number of the articles bookmarked from that site is used as the indicator of the popularity of that site within the RSS feeds.  So the more articles of a website that are bookmarked, the more popular the website is.  In my example of using this web control, I put my bookmark feeds and the del.icios.us homepage hotlist feeds in so that I will get a list of all the websites either I bookmarked or on the hostlist. </p>
<div>
<table border="0" style="border-collapse: collapse;">
<colgroup>
<col style="width: 575px;"></col>
</colgroup>
<tbody valign="top">
<tr>
<td style="border: 0.5pt solid black; padding-left: 7px; padding-right: 7px;">
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">&lt;</span><span style="color: rgb(163, 21, 21);">cc1</span><span style="color: blue;">:</span><span style="color: red;">BookmarkedWebsites<br />
&nbsp;&nbsp;&nbsp; id</span><span style="color: red;">=&quot;WebCustomControl1_1&quot;<br />
&nbsp;&nbsp;&nbsp; Url</span><span style="color: red;">=&quot;<a href="http://del.icio.us/rss/dbtu/; http://del.icio.us/rss/">http://del.icio.us/rss/dbtu/; http://del.icio.us/rss/</a>&quot;<br />
&nbsp;&nbsp;&nbsp; runat</span><span style="color: blue;">=&quot;server&quot;&gt;&lt;/</span><span style="color: rgb(163, 21, 21);">cc1</span><span style="color: blue;">:</span><span style="color: rgb(163, 21, 21);">BookmarkedWebsites</span><span style="color: blue;">&gt;</span></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p>The &quot;Url&quot; property of the control specifies a list of RSS feeds to extract from.  The delimiter is &quot;;&quot;. </p>
<p><a href="http://www.rssdotnet.com/">RSS.NET</a> library is used to parse the RSS feed.  The website part (domain) of the URL is extracted and used as the collapsing key. </p>
<div>
<table border="0" style="border-collapse: collapse;">
<colgroup>
<col style="width: 575px;"></col>
</colgroup>
<tbody valign="top">
<tr>
<td style="border: 0.5pt solid black; padding-left: 7px; padding-right: 7px;">
</p>
<p><span style="font-family: Courier New; font-size: 10pt;"> 								<span style="color: blue;">protected</span> 								<span style="color: blue;">override</span> 								<span style="color: blue;">void</span> RenderContents(<span style="color: rgb(43, 145, 175);">HtmlTextWriter</span> output)<br />
{<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; // Get each individual RSS feed<br />
&nbsp;&nbsp;&nbsp; char</span>[] delimiters = { <span style="color: rgb(163, 21, 21);">&#8216;;&#8217;</span> };<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; string</span>[] feeds = Url.Split(delimiters);<br />
<span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; // Get all websites<br />
&nbsp;&nbsp;&nbsp; SortedDictionary</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt; sites =<span style="color: blue;"><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new </span><span style="color: rgb(43, 145, 175);">SortedDictionary</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt;();<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; foreach</span> (<span style="color: blue;">string</span> feedUrl <span style="color: blue;">in</span> feeds)<br />
&nbsp;&nbsp;&nbsp; {<br />
<span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; RssFeed</span> feed = <span style="color: rgb(43, 145, 175);">RssFeed</span>.Read(feedUrl);<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; foreach</span> (<span style="color: rgb(43, 145, 175);">RssChannel</span> channel <span style="color: blue;">in</span> feed.Channels)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; foreach</span> (<span style="color: rgb(43, 145, 175);">RssItem</span> item <span style="color: blue;">in</span> channel.Items)<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; string</span> link = item.Link.Scheme + <span style="color: rgb(163, 21, 21);">&quot;://&quot;</span> +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; item.Link.Host;<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if</span> (sites.ContainsKey(link))<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sites[link]++;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else<br />
</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sites[link] = 1;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<span style="color: green;"><br />
</span></span></p>
</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp; // Reorder it on the number of occurrence (thus popularity)<br />
&nbsp;&nbsp;&nbsp; KeyValuePair</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt;[] popSites = <span style="color: blue;"><br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; new</span> <span style="color: rgb(43, 145, 175);">KeyValuePair</span>&lt;<span style="color: blue;">string</span>,<span style="color: blue;">int</span>&gt;[sites.Count];<br />
&nbsp;&nbsp;&nbsp; sites.CopyTo(popSites, 0);<br />
<span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp; Array</span>.Sort(popSites, <span style="color: blue;">new</span> 								<span style="color: rgb(43, 145, 175);">SitePopularityComparer</span>());<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; foreach</span> (<span style="color: rgb(43, 145, 175);">KeyValuePair</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt; s <span style="color: blue;">in</span> popSites)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; output.Write(<span style="color: rgb(163, 21, 21);">&quot;( &quot;</span> + s.Value + <span style="color: rgb(163, 21, 21);">&quot; ) &lt;a href=\&quot;&quot;</span> +<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; s.Key + <span style="color: rgb(163, 21, 21);">&quot;\&quot;&gt;&quot;</span>+ s.Key + <span style="color: rgb(163, 21, 21);">&quot;&lt;/a&gt;&lt;br /&gt;&quot;</span>);<br />
&nbsp;&nbsp;&nbsp; }<br />
} </span></p>
</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">public</span> 								<span style="color: blue;">class</span> 								<span style="color: rgb(43, 145, 175);">SitePopularityComparer</span> : <span style="color: rgb(43, 145, 175);">IComparer</span><br />
{<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; int</span> 								<span style="color: rgb(43, 145, 175);">IComparer</span>.Compare(<span style="color: blue;">object</span> x, <span style="color: blue;">object</span> y)<br />
&nbsp;&nbsp;&nbsp; {<br />
<span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return</span> ((<span style="color: rgb(43, 145, 175);">KeyValuePair</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt;)y).Value -<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; ((<span style="color: rgb(43, 145, 175);">KeyValuePair</span>&lt;<span style="color: blue;">string</span>, <span style="color: blue;">int</span>&gt;)x).Value;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</span></p>
</td>
</tr>
</tbody>
</table>
</div>
<p> The web control looks like the following:<br />
<a onclick="window.open('http://stanblog.jojoyao.com/myimg/sitelist.html','popup','width=281,height=354,scrollbars=no,resizable=no,toolbar=no,directories=no,location=no,menubar=no,status=no,left=0,top=0'); return false" href="http://stanblog.jojoyao.com/myimg/sitelist.html"><img width="281" height="354" alt="" src="http://stanblog.jojoyao.com/myimg/sitelist-thumb.JPG" /></a><br />
&nbsp;
</p>
<p>Furthermore, it would be cooler to be able to sync this website list into the browser bookmark so that you can use them as your reading list even more conveniently.</p>
<p>The prototype source code can be downloaded here: <a href="http://stanblog.jojoyao.com/myupload/MyFavoriteWebSites.zip">MyFavoriteWebSites.zip</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://stanblog.jojoyao.com/2007/02/extract-favorite-websites-collection-from-bookmark-rss-feeds/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Create thumbnails of PowerPoint presentations in C#</title>
		<link>http://stanblog.jojoyao.com/2007/02/create-thumbnails-of-powerpoint-presentations-in-c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=create-thumbnails-of-powerpoint-presentations-in-c</link>
		<comments>http://stanblog.jojoyao.com/2007/02/create-thumbnails-of-powerpoint-presentations-in-c/#comments</comments>
		<pubDate>Thu, 08 Feb 2007 04:53:43 +0000</pubDate>
		<dc:creator>Stanley Yao</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[office]]></category>
		<category><![CDATA[PowerPoint]]></category>
		<category><![CDATA[thumbnail]]></category>

		<guid isPermaLink="false">http://stanblog.jojoyao.com/newblog/?p=12</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s sometimes useful to generate JPEG thumbnails of office documents programmatically.&nbsp; With Office object library, it&#8217;s very convenient to do this in C#.NET.&nbsp; If it&#8217;s for a quick and dirty task, an easy way is to convert the office document into a webpage and then use a WebBrowser control to generate the thumbnail.&nbsp; For a more performance oriented task, customized controls subclassed from the Office classes could be written to dump the bitmaps directly into images.&nbsp; The following is a sample implementation of the first approach.&nbsp; Don&#8217;t forget to add the reference to COM object library &quot;Microsoft PointPoint 12.0 Object Library&quot;.</p>
<table width="90%" cellspacing="1" cellpadding="1" border="1" align="center" summary="">
<caption>Creating Thumbnails for PowerPoint Presentations</caption>
<tbody>
<tr>
<td>using PowerPoint = Microsoft.Office.Interop.PowerPoint;</p>
<p>private void pptThumbnail(string sourceFile, string targetFile, int thumbW, int thumbH)<br />
{<br />
&nbsp;&nbsp;&nbsp; // Open the document and convert into HTML pages<br />
&nbsp;&nbsp;&nbsp; PowerPoint.ApplicationClass oApp = new PowerPoint.ApplicationClass();<br />
&nbsp;&nbsp;&nbsp; PowerPoint.Presentation oDoc = oApp.Presentations.Open(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sourceFile,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.Office.Core.MsoTriState.msoTrue, // read only<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.Office.Core.MsoTriState.msoTrue, // untitled<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.Office.Core.MsoTriState.msoFalse); // with window<br />
&nbsp;&nbsp;&nbsp; string tmpHtmlFile = System.IO.Path.GetTempFileName() + &quot;.html&quot;;<br />
&nbsp;&nbsp;&nbsp; oApp.Presentations[1].SaveCopyAs(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmpHtmlFile,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PowerPoint.PpSaveAsFileType.ppSaveAsHTML, // format<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Microsoft.Office.Core.MsoTriState.msoTrue); // embed true type font</p>
<p>&nbsp;&nbsp;&nbsp; // Create the thumbnail from the HTML pages<br />
&nbsp;&nbsp;&nbsp; Size browserSize = new Size(800, 800);<br />
&nbsp;&nbsp;&nbsp; WebBrowser browser = new WebBrowser();<br />
&nbsp;&nbsp;&nbsp; browser.Size = browserSize;<br />
&nbsp;&nbsp;&nbsp; browser.Navigate(tmpHtmlFile);<br />
&nbsp;&nbsp;&nbsp; while (WebBrowserReadyState.Complete != browser.ReadyState)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Application.DoEvents();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; Bitmap bm = new Bitmap(browserSize.Width, browserSize.Height);<br />
&nbsp;&nbsp;&nbsp; browser.DrawToBitmap(bm,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Rectangle(0, 0, browserSize.Width, browserSize.Height));<br />
&nbsp;&nbsp;&nbsp; Bitmap thumbnail = new Bitmap(thumbW, thumbH);<br />
&nbsp;&nbsp;&nbsp; Graphics g = Graphics.FromImage(thumbnail);<br />
&nbsp;&nbsp;&nbsp; g.DrawImage(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bm,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Rectangle(0, 0, thumbnail.Width, thumbnail.Height),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Rectangle(0, 0, browserSize.Width, browserSize.Height),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GraphicsUnit.Pixel);<br />
&nbsp;&nbsp;&nbsp; thumbnail.Save(targetFile);<br />
}
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://stanblog.jojoyao.com/2007/02/create-thumbnails-of-powerpoint-presentations-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

