<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Weblog of Gopalakrishna Palem : Side-by-Side</title><link>http://blogs.msdn.com/gpalem/archive/tags/Side-by-Side/default.aspx</link><description>Tags: Side-by-Side</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Avoid Registration Free COM manifest problems with Activation Context API</title><link>http://blogs.msdn.com/gpalem/archive/2007/03/26/avoid-registration-free-com-manifest-problems-with-activation-context-api.aspx</link><pubDate>Mon, 26 Mar 2007 20:01:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1953252</guid><dc:creator>P.Gopalakrishna</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/gpalem/comments/1953252.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gpalem/commentrss.aspx?PostID=1953252</wfw:commentRss><wfw:comment>http://blogs.msdn.com/gpalem/rsscomments.aspx?PostID=1953252</wfw:comment><description>
&lt;p&gt;Having difficulties while loading the Side-by-Side assembly manifests for Registration-Free COM? &lt;/p&gt;

&lt;p&gt;Perhaps Activation context API could come to your rescue (Ref: &lt;a href="http://msdn2.microsoft.com/en-us/library/aa374166.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa374166.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa374166.aspx&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;The activation context structure lets you explicitly specify the path of the manifest to be loaded, among other things, using the &lt;span style="font-size: 10pt; font-family: Courier New;"&gt;CreateActCtx&lt;/span&gt; and &lt;span style="font-size: 10pt; font-family: Courier New;"&gt;ActivateActCtx&lt;/span&gt; functions. &lt;/p&gt;

&lt;p&gt;In the sample code below, when we try to create an instance of a COM component (that is not registered using RegSvr32), we encounter a failure. However, after creating an activation context that refers to the path of the Side-by-Side manifest and activating it, the &lt;span style="font-size: 10pt; font-family: Courier New;"&gt;CoCreateInstance&lt;/span&gt; succeeds. &lt;/p&gt;
&lt;div style="background-color: rgb(242, 242, 242); font-size: 9pt; font-family: Courier New;"&gt;&amp;nbsp;IMyComponent* pObj = NULL; &lt;br&gt;&lt;/div&gt;&lt;div style="background-color: rgb(242, 242, 242); font-size: 9pt; font-family: Courier New;"&gt;&lt;br&gt;&lt;span style="color: rgb(51, 153, 51);"&gt;&amp;nbsp;// CoCreateInstance Fails without the component being registered&lt;/span&gt;    &lt;/div&gt;&lt;div style="background-color: rgb(242, 242, 242); font-size: 9pt; font-family: Courier New;"&gt;&amp;nbsp;HRESULT hr = CoCreateInstance(CLSID_MyComponent, NULL, CLSCTX_INPROC_SERVER, IID_IMyComponent, (&lt;span style="color: rgb(51, 102, 204);"&gt;void&lt;/span&gt;**)&amp;amp;pObj);&lt;span style="color: rgb(51, 153, 51);"&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;ACTCTX actctx; &lt;br&gt;&lt;br&gt;&amp;nbsp;ZeroMemory(&amp;amp;actctx, &lt;span style="color: rgb(51, 102, 204);"&gt;sizeof&lt;/span&gt;(actctx)); &lt;br&gt;&lt;br&gt;&amp;nbsp;actctx.cbSize = &lt;span style="color: rgb(51, 102, 204);"&gt;sizeof&lt;/span&gt;(actctx); &lt;br&gt;&lt;br&gt;&amp;nbsp;actctx.lpSource = szManifestFilePath; &lt;span style="color: rgb(51, 153, 51);"&gt;// Path to the Side-by-Side Manifest File &lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;HANDLE pActCtx = CreateActCtx(&amp;amp;actctx); &lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;span style="color: rgb(51, 102, 204);"&gt;if&lt;/span&gt;(pActCtx == INVALID_HANDLE_VALUE)    { &lt;span style="color: rgb(51, 102, 204);"&gt;return&lt;/span&gt; E_FAIL; } &lt;br&gt;&lt;br&gt;&amp;nbsp;ULONG_PTR lpCookie; &lt;br&gt;&lt;br&gt;&amp;nbsp;&lt;span style="color: rgb(51, 102, 204);"&gt;if&lt;/span&gt;(ActivateActCtx(pActCtx, &amp;amp;lpCookie))&lt;br&gt;&amp;nbsp;{&lt;/div&gt;&lt;div style="background-color: rgb(242, 242, 242); font-size: 9pt; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp; &lt;span style="color: rgb(51, 153, 51);"&gt;// CoCreateInstance should succeed now.&lt;/span&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="background-color: rgb(242, 242, 242); font-size: 9pt; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp; hr = CoCreateInstance(CLSID_MyComponent, NULL, CLSCTX_INPROC_SERVER, IID_IMyComponent, (&lt;span style="color: rgb(51, 102, 204);"&gt;void&lt;/span&gt;**)&amp;amp;pObj); &lt;span style="color: rgb(51, 153, 51);"&gt; &lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; DeactivateActCtx(0, lpCookie); &lt;br&gt;&amp;nbsp;}&lt;br&gt;    &lt;br&gt;&amp;nbsp;ReleaseActCtx(pActCtx);&lt;br&gt;    &lt;br&gt;&amp;nbsp;&lt;span style="color: rgb(51, 102, 255);"&gt;return&lt;/span&gt; hr;&lt;br&gt;&lt;/div&gt;
&lt;p&gt;The advantage here is that we can at run-time decide which manifest file to load and can have control over when to load (instead of letting the loader do it at the application loading time). The manifest file path specified in the activation context could be any valid file system path. However, the COM DLL being referred by the manifest should reside within the same sub-directory structure as that of the manifest. &lt;/p&gt;

&lt;p&gt;For a description on the format of the manifest files that should be used for Side-by-Side assemblies, refer to &lt;a href="http://msdn2.microsoft.com/en-us/library/aa375632.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/aa375632.aspx"&gt;http://msdn2.microsoft.com/en-us/library/aa375632.aspx&lt;/a&gt;. &lt;/p&gt;
&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1953252" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gpalem/archive/tags/Side-by-Side/default.aspx">Side-by-Side</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Registration+Free+COM/default.aspx">Registration Free COM</category></item></channel></rss>