<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.2.1" -->
<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/"
	>

<channel>
	<title>Steve's Blog</title>
	<link>http://www.lnssoftware.ca/blog</link>
	<description>Random Meanderings on all Things Technical</description>
	<pubDate>Wed, 09 Jan 2013 21:40:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>
	<language>en</language>
			<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Errata</title>
		<link>http://www.lnssoftware.ca/blog/?p=159</link>
		<comments>http://www.lnssoftware.ca/blog/?p=159#comments</comments>
		<pubDate>Wed, 09 Jan 2013 21:40:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Delphi 2010]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=159</guid>
		<description><![CDATA[After I had implemented my plugin and it was just going into production, I discovered a rather ugly truth.  WTSVirtualChannelOpen will succeed even if the plugin is not installed on the client side.  You don&#8217;t find out about the problem until the first time you try to write to the channel, whereupon you get an [...]]]></description>
			<content:encoded><![CDATA[<p>After I had implemented my plugin and it was just going into production, I discovered a rather ugly truth.  WTSVirtualChannelOpen will succeed even if the plugin is not installed on the client side.  You don&#8217;t find out about the problem until the first time you try to write to the channel, whereupon you get an obscure error.  Something about an &#8220;invalid function&#8221;.</p>
<p>It appears as though the only solution to this problem is to implement a &#8220;ping&#8221; function in the plugin. Then, on the server side, you need to open the virtual channel and ping the client.  If both of these succeed then the plugin exists, otherwise it does not.</p>
<p>You would think that Microsoft would at least check to see if the client has registered the virtual channel before returning a handle for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=159</wfw:commentRss>
		</item>
		<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Part 5</title>
		<link>http://www.lnssoftware.ca/blog/?p=157</link>
		<comments>http://www.lnssoftware.ca/blog/?p=157#comments</comments>
		<pubDate>Tue, 04 Dec 2012 17:07:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Delphi 2010]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=157</guid>
		<description><![CDATA[The last thing that I need to do to my remote desktop plugin is add the code required to send data from the client to the server.
]]></description>
			<content:encoded><![CDATA[<p>The last thing that I need to do to my remote desktop plugin is add the code required to send data from the client to the server.<br />
 <a href="http://www.lnssoftware.ca/blog/?p=157#more-157" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=157</wfw:commentRss>
		</item>
		<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Part 4</title>
		<link>http://www.lnssoftware.ca/blog/?p=155</link>
		<comments>http://www.lnssoftware.ca/blog/?p=155#comments</comments>
		<pubDate>Mon, 03 Dec 2012 17:06:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Delphi 2010]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=155</guid>
		<description><![CDATA[Now that we have the client side ready to receive data from the server we need to look at programming the server side.  This actually seems to be quite a bit simpler that the client side.  There are just four functions; WTSVirtualChannelOpen, WTSVirtualChannelClose, WTSVirtualChannelRead and WTSVirtualWrite.  Actually, there are a few more, but these are [...]]]></description>
			<content:encoded><![CDATA[<p>Now that we have the client side ready to receive data from the server we need to look at programming the server side.  This actually seems to be quite a bit simpler that the client side.  There are just four functions; WTSVirtualChannelOpen, WTSVirtualChannelClose, WTSVirtualChannelRead and WTSVirtualWrite.  Actually, there are a few more, but these are the ones that you need to get by. <a href="http://www.lnssoftware.ca/blog/?p=155#more-155" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=155</wfw:commentRss>
		</item>
		<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Part 3</title>
		<link>http://www.lnssoftware.ca/blog/?p=153</link>
		<comments>http://www.lnssoftware.ca/blog/?p=153#comments</comments>
		<pubDate>Sun, 02 Dec 2012 15:38:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=153</guid>
		<description><![CDATA[In parts 1 and 2 of this series I created a shell for a remote desktop client plugin.  The plugin as it stands so far initializes itself with the remote desktop client, responds to a few simple events and displays an &#8220;always on top&#8221; status window.  Still not very useful.  Next we need to actually [...]]]></description>
			<content:encoded><![CDATA[<p>In parts <a href="http://www.lnssoftware.ca/blog/?p=149">1</a> and <a href="http://www.lnssoftware.ca/blog/?p=151">2</a> of this series I created a shell for a remote desktop client plugin.  The plugin as it stands so far initializes itself with the remote desktop client, responds to a few simple events and displays an &#8220;always on top&#8221; status window.  Still not very useful.  Next we need to actually open the virtual channel(s) that we will be using and respond to a few more events so that we can read data from that channel. <a href="http://www.lnssoftware.ca/blog/?p=153#more-153" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=153</wfw:commentRss>
		</item>
		<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Part 2</title>
		<link>http://www.lnssoftware.ca/blog/?p=151</link>
		<comments>http://www.lnssoftware.ca/blog/?p=151#comments</comments>
		<pubDate>Thu, 29 Nov 2012 16:12:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Delphi 2010]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=151</guid>
		<description><![CDATA[In part 1 of this series I set about creating a remote desktop plugin using Delphi. It didn&#8217;t do anything except initialize itself and display a few message boxes indicating its progress.  Not very useful.
In order for this whole thing to work the way I want it to, the plugin is going to have to [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.lnssoftware.ca/blog/?p=149">part 1</a> of this series I set about creating a remote desktop plugin using Delphi. It didn&#8217;t do anything except initialize itself and display a few message boxes indicating its progress.  Not very useful.</p>
<p>In order for this whole thing to work the way I want it to, the plugin is going to have to interact with the user on the remote workstation.  This means displaying a form that will have to be on top of the remote desktop window.  I had some vague misgivings that remote desktop in full screen mode would be an &#8220;always on top&#8221; window that would interfere with the interaction that I need. So, as the next step in the process, I changed the plugin to create a form, make it an &#8220;always on top&#8221; window and display my status messages in a TMemo contained in the form.  Surprisingly enough this actually works quite well.</p>
<p> <a href="http://www.lnssoftware.ca/blog/?p=151#more-151" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=151</wfw:commentRss>
		</item>
		<item>
		<title>Creating a Remote Desktop Plugin Using Delphi - Part 1</title>
		<link>http://www.lnssoftware.ca/blog/?p=149</link>
		<comments>http://www.lnssoftware.ca/blog/?p=149#comments</comments>
		<pubDate>Sat, 17 Nov 2012 22:17:53 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Delphi 2010]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=149</guid>
		<description><![CDATA[I have recently found myself in a situation where I need to have an application running on a server using remote desktop interact with files and devices on the user&#8217;s local workstation.  Specifically, I need to be able to use a scanner to scan documents and / or retrieve files containing documents that have already [...]]]></description>
			<content:encoded><![CDATA[<p>I have recently found myself in a situation where I need to have an application running on a server using remote desktop interact with files and devices on the user&#8217;s local workstation.  Specifically, I need to be able to use a scanner to scan documents and / or retrieve files containing documents that have already been scanned. I found several commercial plugins that would drive the scanner but I couldn&#8217;t find anything that would allow me to interact with the user to allow her to import documents from a file.</p>
<p>Knowing that there are commercial plugins available, I know that it is possible to write a plugin for remote desktop.  So, I&#8217;m thinking; &#8220;How hard can it be?&#8221;.  Since we are virtually a pure Delphi shop I started looking for examples of Delphi plugins.  Surprisingly, I didn&#8217;t find any.  It is difficult to believe that no one else has done this, but I seem to be a pioneer. So, in this and the next few articles, I am going to create a remote desktop plugin using Delphi and remote desktop virtual channels and I am going to document the process here.</p>
<p> <a href="http://www.lnssoftware.ca/blog/?p=149#more-149" class="more-link">(more&#8230;)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=149</wfw:commentRss>
		</item>
		<item>
		<title>Unable to play YouTube Videos in Firefox</title>
		<link>http://www.lnssoftware.ca/blog/?p=148</link>
		<comments>http://www.lnssoftware.ca/blog/?p=148#comments</comments>
		<pubDate>Tue, 19 Jun 2012 19:16:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=148</guid>
		<description><![CDATA[Suddenly I couldn&#8217;t play YouTube or Flixxy videos in Firefox anymore. It turns out that the latest version of the Adobe Flash Player introduced some new security feature that made things so secure that nothing worked anymore.  Oddly enough, I had to disable a setting in Real Player to get things working again.
You need to [...]]]></description>
			<content:encoded><![CDATA[<p>Suddenly I couldn&#8217;t play YouTube or Flixxy videos in Firefox anymore. It turns out that the latest version of the Adobe Flash Player introduced some new security feature that made things so secure that nothing worked anymore.  Oddly enough, I had to disable a setting in Real Player to get things working again.</p>
<p>You need to start <strong>Real Player</strong> and click the <strong>Real Player icon</strong> in the top left corner, then select <strong>Preferences</strong>.  Select <strong>Download &amp; Recording</strong> in the left pane and uncheck <strong>Enable Web Download &amp; Recording</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=148</wfw:commentRss>
		</item>
		<item>
		<title>Firefox V13 Slow Accessing Google</title>
		<link>http://www.lnssoftware.ca/blog/?p=147</link>
		<comments>http://www.lnssoftware.ca/blog/?p=147#comments</comments>
		<pubDate>Tue, 19 Jun 2012 19:09:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=147</guid>
		<description><![CDATA[After installing version 13 of Firefox, I found access to Google sites to be extremely slow.  It turns out that Google has implemented a new protocol on its sites named SPDY (short for speedy) that is supposed to speed up the serving of web pages.  Sadly, the Firefox implementation of this new protocol seems to [...]]]></description>
			<content:encoded><![CDATA[<p>After installing version 13 of Firefox, I found access to Google sites to be extremely slow.  It turns out that Google has implemented a new protocol on its sites named SPDY (short for speedy) that is supposed to speed up the serving of web pages.  Sadly, the Firefox implementation of this new protocol seems to be flawed.  In order to fix the problem you need to turn off the SPDY protocol in Firefox.</p>
<p>To do this you need to enter <strong>about:config</strong> in the URL bar.  Then find <strong>network.http.spdy.enabled</strong> and double click it to change its value to <strong>false</strong>.  This disables SPDY in Firefox and speeds up access to Google.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=147</wfw:commentRss>
		</item>
		<item>
		<title>Delphi Class Completion (Ctl-Shft-C) Stops Working</title>
		<link>http://www.lnssoftware.ca/blog/?p=146</link>
		<comments>http://www.lnssoftware.ca/blog/?p=146#comments</comments>
		<pubDate>Sun, 18 Mar 2012 18:53:06 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=146</guid>
		<description><![CDATA[Suddenly, pressing Ctl-Shft-C in the Delphi XE2 IDE stopped working.  You could press that magic key combination all day and nothing would happen.  It took hours to figure out what the problem was.
I had installed update 4 for Delphi XE2, which contained, among other things, something called AQTime.  This appears to be some kind of [...]]]></description>
			<content:encoded><![CDATA[<p>Suddenly, pressing Ctl-Shft-C in the Delphi XE2 IDE stopped working.  You could press that magic key combination all day and nothing would happen.  It took hours to figure out what the problem was.</p>
<p>I had installed update 4 for Delphi XE2, which contained, among other things, something called AQTime.  This appears to be some kind of application profiler.  Anyway, it was AQTime that was interfering with class completion.  A quick trip to Control Panel to uninstall the offending bit of software and everything went back to normal.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=146</wfw:commentRss>
		</item>
		<item>
		<title>Never build package %s must be recompiled</title>
		<link>http://www.lnssoftware.ca/blog/?p=145</link>
		<comments>http://www.lnssoftware.ca/blog/?p=145#comments</comments>
		<pubDate>Sun, 18 Mar 2012 18:44:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[Delphi XE2]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.lnssoftware.ca/blog/?p=145</guid>
		<description><![CDATA[I was recompiling my application they other day, switching everything from Debug to Release.  Suddenly I started getting &#8220;Never build package %s must be recompiled&#8221; errors.  I couldn&#8217;t understand this, since the previous step in the recompile had just finished compiling the package in question.
It finally turned out to be caused by recompiling the Release [...]]]></description>
			<content:encoded><![CDATA[<p>I was recompiling my application they other day, switching everything from Debug to Release.  Suddenly I started getting &#8220;Never build package %s must be recompiled&#8221; errors.  I couldn&#8217;t understand this, since the previous step in the recompile had just finished compiling the package in question.</p>
<p>It finally turned out to be caused by recompiling the Release packages into a different directory than the Debug packages.  The Debug packages went into Delphi&#8217;s default DCP and BPL directories while the Release packages went into the projects ($Platform)\($Config) directory.  I did this because the packages in question contain Delphi components that appear in the component toolbar and I want to be able to step into the source for those packages while debugging.  I thought that compiling the Release packages to a different directory would solve all kinds of problems related to debugging.   And it did, but it created these errors when compiling for Release.  It was the order of directories on Delphi&#8217;s search path that caused the problem.  The Delphi wide options specify the default package directory early on in the search path.  Even though I had the Release directory on the project&#8217;s search path, the Release DCPs were never found, because the Debug DCPs were found first.  Since I was compiling the Release packages to ..\$(Platform)\($Config) all I had to do was add that to the Delphi wide search path before the default DCP directory and the problem was solved.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lnssoftware.ca/blog/?feed=rss2&amp;p=145</wfw:commentRss>
		</item>
	</channel>
</rss>
