<?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>Arnout's Eclectica &#187; Development</title>
	<atom:link href="http://grootveld.com/archives/category/development/feed" rel="self" type="application/rss+xml" />
	<link>http://grootveld.com</link>
	<description>But I digress...</description>
	<lastBuildDate>Wed, 10 Feb 2010 20:00:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Synchronizing two batch files using WAITFOR.exe</title>
		<link>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe</link>
		<comments>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe#comments</comments>
		<pubDate>Thu, 28 Aug 2008 20:58:08 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Reminder]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/28</guid>
		<description><![CDATA[I was writing some unit tests today where I wanted to start some process asynchronously, but have it automatically exit after a specified number of seconds. Preferably something that's available on a standard W2K3 box, so that I wouldn't be creating any additional prerequisites for other developer boxes or the build machine.
Usually I just use [...]]]></description>
			<content:encoded><![CDATA[<p>I was writing some unit tests today where I wanted to start some process asynchronously, but have it automatically exit after a specified number of seconds. Preferably something that's available on a standard W2K3 box, so that I wouldn't be creating any additional prerequisites for other developer boxes or the build machine.</p>
<p>Usually I just use <code>ping -t -n <i>count</i> <i>host</i></code> for this, but I was also thinking that it would be nice to be able to terminate the process before the timeout. Not sure exactly how I came across it, but somehow I found <code>waitfor.exe</code> lying around in my <code>system32</code> directory.</p>
<p><code>WAITFOR</code> uses a <a href='http://msdn.microsoft.com/en-us/library/aa365576(VS.85).aspx' title='Documentation for Win32 mailslots at Microsoft'>mailslot</a> to wait on or send a signal to. The waiting and sending can happen on the same machine, or the signal can be sent across the network.</p>
<p>In one command prompt, you perform the wait:</p>
<pre class="dosbox">C:\\> WAITFOR /T 42 SignalName</pre>
<p>In another, you send the signal:</p>
<pre class="dosbox">C:\\> WAITFOR /SI SignalName</pre>
<p>Way nicer than the old-fashioned approach of having process A poll a directory until process B has created a particular file. And, no less important, if the signal is not received within the specified timeout, you get:</p>
<pre class="dosbox">C:\\> WAITFOR /T 1 Godot
ERROR: Timed out waiting for 'Godot'.

C:\\>_</pre>
<p>:-)</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/28/synchronizing-two-batch-files-using-waitforexe/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>*UPDATE* on REGEDIT experiments</title>
		<link>http://grootveld.com/archives/27/update-on-regedit-experiments</link>
		<comments>http://grootveld.com/archives/27/update-on-regedit-experiments#comments</comments>
		<pubDate>Thu, 21 Aug 2008 20:03:01 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Regedit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/27</guid>
		<description><![CDATA[In my previous post, I wrote about some findings w.r.t. REGEDIT. One of them was about a limitation on the depth of key hierarchies during a registry export.
When I found out about this limitation, I was actually encountering stack overflows in REGEDIT. However, shortly afterwards I wasn't able to reproduce that behaviour, so I considered [...]]]></description>
			<content:encoded><![CDATA[<p>In my <a href='http://grootveld.com/archives/26/regedit-experiments' title='My first post about REGEDIT experiments'>previous post</a>, I wrote about some findings w.r.t. REGEDIT. One of them was about a limitation on the depth of key hierarchies during a registry export.</p>
<p>When I found out about this limitation, I was actually encountering stack overflows in REGEDIT. However, shortly afterwards I wasn't able to reproduce that behaviour, so I considered it to be some fluke and just wrote about the limitation itself.</p>
<p>However, today I managed to overflow REGEDIT's stack again by just having it export a deep hierarchy to <code>.REG</code>, and this time I captured a crash dump:</p>
<pre class='codesample'>
0:000> kb 300
ChildEBP RetAddr  Args to Child
0004308c 77f60938 000002b8 00000000 000430b8 ADVAPI32!LocalBaseRegEnumKey+0x13
000430c4 0100bb37 000002b8 00000000 00043654 ADVAPI32!RegEnumKeyW+0x8c
00043890 0100bb08 000002b8 000438a0 004b0048 regedit!PutBranch+0x124
0004404c 0100bb08 000002bc 0004405c 004b0048 <strong>regedit!PutBranch+0xf5</strong>
00044800 0100bb08 000002c0 00044810 004b0048 <strong>regedit!PutBranch+0xf5</strong>
00044fac 0100bb08 000002c4 00044fbc 004b0048 <strong>regedit!PutBranch+0xf5</strong>

       <em>... Removed 190 lines that all end in</em> <strong>regedit!PutBranch+0xf5</strong>

0007f1d4 0100bb08 00000578 0007f1e4 004b0048 <strong>regedit!PutBranch+0xf5</strong>
0007f458 0100bb08 0000057c 0007f468 004b0048 <strong>regedit!PutBranch+0xf5</strong>
0007f6c8 0100be1b 80000001 0007f6f0 00070e54 <strong>regedit!PutBranch+0xf5</strong>
0007f944 01006be3 0007f974 01059de0 00070e54 regedit!ExportWinNT50RegFile+0x16d
0007f958 01007272 00070e54 00000000 0007f974 regedit!RegEdit_ExportRegFile+0x2e
0007fb80 010062eb 00070e54 0000110a 7739c2ee regedit!RegEdit_OnCommandExportRegFile+0x65
0007fb98 01009751 00070e54 00000293 00000000 regedit!RegEdit_OnCommand+0x7f
0007fbbc 01009947 00070e54 00000293 000ad310 regedit!RegEdit_OnKeyTreeCommand+0xc4
0007fc24 010045ba 00070e54 00160c39 0007fc50 regedit!RegEdit_OnKeyTreeContextMenu+0x1a1
0007fc34 0100689f 00130dc2 00070e54 000002c4 regedit!RegEdit_OnContextMenu+0x2a
0007fc50 7739b6e3 00130dc2 0000007b 00070e54 regedit!RegEditWndProc+0x128
0007fc7c 7739b874 01006777 00130dc2 0000007b USER32!InternalCallWinProc+0x28
0007fcf4 7739c2d3 00000000 01006777 00130dc2 USER32!UserCallWinProcCheckWow+0x151
0007fd30 7739c337 00615210 00615118 00070e54 USER32!SendMessageWorker+0x4bd
0007fd50 7745b0ee 00130dc2 0000007b 00070e54 USER32!SendMessageW+0x7f
0007fd74 7745bcfc 00070e54 00000062 00000025 COMCTL32!TV_SendRButtonDown+0xad
0007fdc4 7739b6e3 00070e54 00000204 00000002 COMCTL32!TV_WndProc+0x616
0007fdf0 7739b874 7745b6e6 00070e54 00000204 USER32!InternalCallWinProc+0x28
0007fe68 7739ba92 00000000 7745b6e6 00070e54 USER32!UserCallWinProcCheckWow+0x151
0007fed0 7739bad0 0007fef8 00000000 0007ff1c USER32!DispatchMessageWorker+0x327
0007fee0 01009cb9 0007fef8 ffffffff 00000000 USER32!DispatchMessageW+0xf
0007ff1c 01016e04 01000000 00000000 000a24a6 regedit!WinMain+0x154
0007ffc0 77e6f23b 00000000 00000000 7ffdf000 regedit!WinMainCRTStartup+0x182
0007fff0 00000000 01016c82 00000000 78746341 kernel32!BaseProcessStart+0x23
</pre>
<p>If somebody wants to dive into the crash dump, let me know.</p>
<p>Exporting a deep key hierarchy on W2K8 X64 didn't work either, BTW:</p>
<p><img src='/images/RegeditStackOverflowW2K8X64.png' width='471' height='385' alt='Screen shot of REGEDIT crashing on W2K8 X64 while trying to export a deep key hierarchy' /></p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/27/update-on-regedit-experiments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>REGEDIT experiments</title>
		<link>http://grootveld.com/archives/26/regedit-experiments</link>
		<comments>http://grootveld.com/archives/26/regedit-experiments#comments</comments>
		<pubDate>Tue, 12 Aug 2008 21:11:16 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Regedit]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/26</guid>
		<description><![CDATA[NOTE (2008-08-21): Also see the update to this post.
I've been working on a tool that can export registry information in REGEDIT's .REG format. Since that format doesn't seem to be fully documented, I spent quite some time experimenting with REGEDIT. Here are some of my more interesting findings (all on W2K3).
No expansion beyond 32 levels
When [...]]]></description>
			<content:encoded><![CDATA[<p><span style='background-color: #ffffaa;border-style: solid; border-width: 1px; padding: 3px'><strong>NOTE</strong> (2008-08-21): Also see the <a href='http://grootveld.com/archives/27/update-on-regedit-experiments' title='Update about the export limitations'>update</a> to this post.</span></p>
<p>I've been working on a tool that can export registry information in REGEDIT's <code>.REG</code> format. Since that format doesn't seem to be fully documented, I spent quite some time experimenting with REGEDIT. Here are some of my more interesting findings (all on W2K3).</p>
<p><strong>No expansion beyond 32 levels</strong><br />
When you expand a key in REGEDIT, it passes the "root" <code>HKEY</code> (like <code>HKLM</code>) and the full path to <code>RegOpenKey()</code> instead of the immediate parent and just the name of the key you're trying to expand. This means that it will run into the <a href='http://msdn.microsoft.com/en-us/library/ms724872(VS.85).aspx' title='Registry Element Size Limits'>"up to 32 levels at a time" limitation</a> of the registry API:</p>
<p><img src='/images/Registry33levels.png' height='159' width='568' alt='Error message when opening level 33'/></p>
<p><strong>No export beyond 200 levels</strong><br />
Although the registry supports 512 levels of keys, REGEDIT will only export upto a depth of about 200, silently ignoring anything beyond that...<br />
Granted, that's not a very common scenario, but I would expect at least a warning message or something.</p>
<p><strong>Importing values of non-existing types</strong><br />
<a href='http://source.winehq.org/source/include/winnt.h#L4178' title='Registry value type definitions at Wine HQ'><code>WinNT.h</code> defines 12 value types</a>, ranging from <code>REG_NONE</code> (0) to <code>REG_QWORD</code> (11). REGEDIT however, will gladly accept all other 32-bit values as well...</p>
<p><code>[HKEY_CURRENT_USER\RegistryTest]<br />
"Type Test"=hex(42):47,11</code></p>
<p>results in</p>
<p><img src='/images/RegistryValueTypes.png' width='302' height='75' alt='A value of type 0x42...'/></p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/26/regedit-experiments/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Making HttpWebRequest work while having Fiddler decrypt SSL</title>
		<link>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl</link>
		<comments>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl#comments</comments>
		<pubDate>Thu, 29 May 2008 11:54:49 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Reminder]]></category>
		<category><![CDATA[Tips & Tricks]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/22</guid>
		<description><![CDATA[Just a quick reminder to myself, so that I can forget about it...
Fiddler can act as a man-in-the-middle and decrypt SSL traffic, but then System.Net.Security rightfully complains about an invalid remote certificate ("The remote certificate is invalid according to the validation procedure."). This results in a System.Net.WebException "The underlying connection was closed: Could not establish [...]]]></description>
			<content:encoded><![CDATA[<p>Just a quick reminder to myself, so that I can forget about it...</p>
<p><a href='http://www.fiddlertool.com'>Fiddler</a> can act as a man-in-the-middle and decrypt SSL traffic, but then System.Net.Security rightfully complains about an invalid remote certificate ("The remote certificate is invalid according to the validation procedure."). This results in a System.Net.WebException "The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.".</p>
<p>To prevent this from happening:</p>
<pre class="codesample">
<span style="color: #2b91af;">ServicePointManager</span>.ServerCertificateValidationCallback = <span style="color: blue;">delegate</span> { <span style="color: blue;">return</span> <span style="color: blue;">true</span>; };
</pre>
<p>Just be sure to not include this in production code :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/22/making-httpwebrequest-work-while-having-fiddler-decrypt-ssl/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>URL-encoded slashes in System.Uri</title>
		<link>http://grootveld.com/archives/21/url-encoded-slashes-in-systemuri</link>
		<comments>http://grootveld.com/archives/21/url-encoded-slashes-in-systemuri#comments</comments>
		<pubDate>Wed, 30 Apr 2008 21:11:18 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/21</guid>
		<description><![CDATA[Two weeks ago, an ex-colleague asked me to take a look at a problem that he and his team had encountered. They tried using a System.Uri with URL-encoded slashes, but those slashes kept ending up unencoded in the resulting URI:

Uri uri = new Uri("http://somesite/media/http%3A%2F%2Fsomesite%2Fimage.gif");
Console.WriteLine(uri.AbsoluteUri);
// Output: http://somesite/media/http%3A//somesite%2Fimage.gif

That's a totally different URL, which the target server refuses [...]]]></description>
			<content:encoded><![CDATA[<p>Two weeks ago, an ex-colleague asked me to take a look at a problem that he and his team had encountered. They tried using a <code>System.Uri</code> with URL-encoded slashes, but those slashes kept ending up unencoded in the resulting URI:</p>
<pre class='codesample'>
<span style="color: #2b91af;">Uri</span> uri = <span style="color: blue;">new</span> <span style="color: #2b91af;">Uri</span>(<span style="color: #a31515;">"http://somesite/media/http%3A%2F%2Fsomesite%2Fimage.gif"</span>);
<span style="color: #2b91af;">Console</span>.WriteLine(uri.AbsoluteUri);
<span style="color: green;">// Output: <b>http://somesite/media/http%3A<span style='border: #c0c0f7 1px solid;'>//</span>somesite%2Fimage.gif</b></span>
</pre>
<p>That's a totally different URL, which the target server refuses to process.</p>
<p>I was sure that they must have overlooked something, and that there would be some way to tell the Uri constructor to leave all encoded characters as-is. But no, it does not seem possible; dots and slashes are always decoded. I find that quite surprising, so if anyone can point me to an official solution, I'd be much obliged.</p>
<p>In the mean time, a reflection-based hack, courtesy of <a href='http://www.aisto.com/roeder/dotnet/' title="Lutz Roeder's .NET Reflector">Reflector</a> and the <a href='http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx' title="ScottGu's post about the .NET Framework Library Source Code">.NET Reference Source</a>:</p>
<pre class='codesample'>
<span style="color: blue;">static</span> <span style="color: blue;">class</span> <span style="color: #2b91af;">UriHacks</span>
{
&nbsp;&nbsp;&nbsp; <span style="color: green;">// System.UriSyntaxFlags is internal, so let's duplicate the flag privately</span>
&nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">const</span> <span style="color: blue;">int</span> UnEscapeDotsAndSlashes = 0x2000000;
&nbsp;
&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">static</span> <span style="color: blue;">void</span> LeaveDotsAndSlashesEscaped(<span style="color: blue;">this</span> <span style="color: #2b91af;">Uri</span> uri)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (uri == <span style="color: blue;">null</span>)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">throw</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">ArgumentNullException</span>(<span style="color: #a31515;">"uri"</span>);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">FieldInfo</span> fieldInfo = uri.GetType().GetField(<span style="color: #a31515;">"m_Syntax"</span>, <span style="color: #2b91af;">BindingFlags</span>.Instance | <span style="color: #2b91af;">BindingFlags</span>.NonPublic);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (fieldInfo == <span style="color: blue;">null</span>)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">throw</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">MissingFieldException</span>(<span style="color: #a31515;">"'m_Syntax' field not found"</span>);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">object</span> uriParser = fieldInfo.GetValue(uri);
&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fieldInfo = <span style="color: blue;">typeof</span>(<span style="color: #2b91af;">UriParser</span>).GetField(<span style="color: #a31515;">"m_Flags"</span>, <span style="color: #2b91af;">BindingFlags</span>.Instance | <span style="color: #2b91af;">BindingFlags</span>.NonPublic);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (fieldInfo == <span style="color: blue;">null</span>)
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">throw</span> <span style="color: blue;">new</span> <span style="color: #2b91af;">MissingFieldException</span>(<span style="color: #a31515;">"'m_Flags' field not found"</span>);
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">object</span> uriSyntaxFlags = fieldInfo.GetValue(uriParser);
&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Clear the flag that we don't want</span>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; uriSyntaxFlags = (<span style="color: blue;">int</span>)uriSyntaxFlags &amp; ~UnEscapeDotsAndSlashes;
&nbsp;
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fieldInfo.SetValue(uriParser, uriSyntaxFlags);
&nbsp;&nbsp;&nbsp; }
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/21/url-encoded-slashes-in-systemuri/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Registration-free COM</title>
		<link>http://grootveld.com/archives/16/registration-free-com</link>
		<comments>http://grootveld.com/archives/16/registration-free-com#comments</comments>
		<pubDate>Fri, 30 Mar 2007 22:40:25 +0000</pubDate>
		<dc:creator>amg</dc:creator>
				<category><![CDATA[COM]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://grootveld.com/archives/16</guid>
		<description><![CDATA[A while ago, I had the following problem:

The build system needed to run a unit test of some code that depended on some COM object.

That COM object was not installed on the build system (it wasn't a part of the system we were developing).

Installing that COM object would mean having to install a large system [...]]]></description>
			<content:encoded><![CDATA[<p>A while ago, I had the following problem:</p>
<ul>
<li>The build system needed to run a unit test of some code that depended on some COM object.
</li>
<li>That COM object was not installed on the build system (it wasn't a part of the system we were developing).
</li>
<li>Installing that COM object would mean having to install a large system with all kinds of dependencies &mdash; not exactly something I wanted to do on the build machine...</li>
</ul>
<p>Fortunately, the interaction with the particular COM object was very basic. I made a fake implementation of it, just returning hard-coded responses for the few calls I needed. With the fake COM object in place, the unit tests passed.</p>
<p>I added some logic to the build file that checks whether a particular ProgID existed in the registry. If not, the build script registers the fake object, runs the specific tests, and then unregisters it again.<br />If the ProgID is found in the registry, however, just the tests are executed. This allows the build to be also run on a developer's machine containing the back-end system (and not mess up its COM registration). Works great.</p>
<p>Fast-forward to yesterday.</p>
<p>Triggered by a discussion with a co-worker about the fact that the unit tests aren't nicely isolated from the back-end system this way, I suddenly remembered reading about registration-free COM on <a href='http://blogs.msdn.com/junfeng/archive/2006/04/20/579748.aspx' title='Junfeng Zhang&apos;s blog post about registration-free COM'>Junfeng Zhang&apos;s blog</a>.</p>
<h3>Registration-free COM</h3>
<p>As the name implies, registration-free COM makes it possible to use COM objects without registering them. An application gets all activation information (typelib, ProgID-to-CLSID mapping, threading model and the like) from a <a href='http://msdn2.microsoft.com/en-us/library/aa375632.aspx' title='Description of side-by-side manifest and configuration files at http://www.microsoft.com'>manifest file</a>, instead of reading it from the registry. This allows multiple applications to use different versions of a COM object, with the same ProgID and/or CLSID.</p>
<p>That's a much nicer solution for my original problem &mdash; I no longer have to dynamically register and unregister my fake implementation, and I can use the fake implementation on systems containing the real one as well.</p>
<h3>A sample manifest file</h3>
<p>The manifest file I'm using looks like this:</p>
<pre class='codesample'>
<span class='TPXMLkw1'>&lt;</span>?xml <span class='TPXMLkw2'>version</span>=<span class='TPXMLstr'>&apos;1.0&apos; </span><span class='TPXMLkw2'>encoding</span>=<span class='TPXMLstr'>&apos;utf-8&apos;</span>?<span class='TPXMLkw1'>&gt;</span>
<span class='TPXMLkw1'>&lt;</span>assembly <span class='TPXMLkw2'>manifestVersion</span>=<span class='TPXMLstr'>&apos;1.0&apos; </span><span class='TPXMLkw2'>xmlns</span>=<span class='TPXMLstr'>&apos;urn:schemas-microsoft-com:asm.v1&apos;</span><span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>assemblyIdentity <span class='TPXMLkw2'>type</span>=<span class='TPXMLstr'>&apos;win32&apos; </span><span class='TPXMLkw2'>name</span>=<span class='TPXMLstr'>&apos;RegFreeCOM-sample.exe&apos; </span><span class='TPXMLkw2'>version</span>=<span class='TPXMLstr'>&apos;1.0.0.0&apos; </span>/<span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>file <span class='TPXMLkw2'>name</span>=<span class='TPXMLstr'>&apos;FakeTCMXML.dll&apos;</span><span class='TPXMLkw1'>&gt;</span>
    <span class='TPXMLkw1'>&lt;</span>comClass <span class='TPXMLkw2'>clsid</span>=<span class='TPXMLstr'>&apos;{69c2082a-61b1-4a83-a947-88420fac54fa}&apos;
              </span><span class='TPXMLkw2'>threadingModel</span>=<span class='TPXMLstr'>&apos;Apartment&apos;
              </span><span class='TPXMLkw2'>progid</span>=<span class='TPXMLstr'>&apos;TCMXML.XMLResponder&apos; </span>/<span class='TPXMLkw1'>&gt;</span>
  <span class='TPXMLkw1'>&lt;</span>/file<span class='TPXMLkw1'>&gt;</span>
<span class='TPXMLkw1'>&lt;</span>/assembly<span class='TPXMLkw1'>&gt;</span>
</pre>
<p>I've saved this as <code>RegistrationFreeCOM.exe.manifest</code> in the same directory as my test application <code>RegistrationFreeCOM.exe</code>, and also copied my fake implementation <code>FakeTCMXML.dll</code> into that directory. The test application will activate <code>TCMXML.XMLResponder</code> from <code>FakeTCMXML.dll</code>, regardless of whether that ProgID already occurs in the registry, and without affecting that registration.</p>
<h3>Creating a manifest file</h3>
<p>For many scenarios, the sample manifest file is sufficient: just update the 'name', 'clsid' and 'progid' attributes. You can find the value for 'clsid' in the IDL for your component, or by using OleView.<br />
You can also have Visual Studio 2005 create a manifest file for you: create a throw-away project, reference your COM dll, view the properties of that reference, and toggle the 'Isolated' flag to 'True'. When you build the project, the manifest file will be generated.</p>
]]></content:encoded>
			<wfw:commentRss>http://grootveld.com/archives/16/registration-free-com/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
