<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Sharing Knowledge</title><subtitle type="html" /><id>http://blogs.msdn.com/varunsekhri/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/varunsekhri/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2007-02-28T11:56:00Z</updated><entry><title>Certificate management for Exchange Unified Messaging 2010</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2009/07/26/certificate-management-for-exchange-unified-messaging-2010.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2009/07/26/certificate-management-for-exchange-unified-messaging-2010.aspx</id><published>2009-07-27T02:05:00Z</published><updated>2009-07-27T02:05:00Z</updated><content type="html">&lt;P&gt;Microsoft Exchange Unified Messaging 2010 will be released with a lot of goodies. One of them is to give more control to the admins so that they can hand pick the certificate with which they want Microsoft Exchange Unified Messaging service to run.&lt;/P&gt;
&lt;P&gt;In UM Exchnage 2007 the service would automatically choose&amp;nbsp;what "it thinks" is the best certificate in the machine store. However, the customer feedback told us to change this design and let admins specify what certificate to choose and tell UM for making the connections using TLS. And with this new design you dont have to learn any new cmdlets: &lt;STRONG&gt;*-exchangecertificate cmdltes can be used to create and assign a certificate to UM service.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Admins&amp;nbsp;of Exchange&amp;nbsp;2007 who have used UM to make connection only over TCP will not have to make any changes. Out of the box UM continues to make connections over&amp;nbsp;TCP &lt;EM&gt;only.&lt;/EM&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Admins who want to accept or make secured calls using TLS will have to do following three steps. I have given some examples below.&lt;/P&gt;
&lt;P&gt;- Change the mode of UM service from TCP to&amp;nbsp;Dual or TLS. Dual mode means that the UM service will listen for calls on both TCP and TLS. TLS means that UM will listen only over TLS. &lt;/P&gt;
&lt;P&gt;- Get a new certificate. &lt;/P&gt;
&lt;P&gt;- Assign the certificate to UM and restart the service.&lt;/P&gt;
&lt;P&gt;Finally, take steps so that the IP Gateway will trust and accept this certificate. &lt;/P&gt;
&lt;P&gt;Here are some examples to do what I have mentioned above using powershell cmdlets. Same can be acheived using EMC as well. I will not be going through the EMC in this blog post.&lt;/P&gt;
&lt;P&gt;1. Change the mode of the server to Dual or&amp;nbsp;TLS&amp;nbsp;using set-umserver cmdlet. As you can see it nicely gives warnings as to what are next steps.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;[PS] D:\Windows\system32&amp;gt;set-umserver -UMStartupMode dual -Identity EXCH-I-349&lt;BR&gt;&lt;/STRONG&gt;&lt;FONT color=#e56717&gt;WARNING: Changes to UMStartupMode will only take effect after the Microsoft Exchange Unified Messaging service is&lt;BR&gt;restarted on server EXCH-I-349.&lt;BR&gt;WARNING: To complete TLS setup, do all of the following: (1) Create a new certificate using the New-ExchangeCertificate&lt;BR&gt;&amp;nbsp;cmdlet (2) Associate this certificate with the Unified Messaging server using the Enable-ExchangeCertificate cmdlet&lt;BR&gt;(3) For self-signed certificates, copy this certificate to the UM IP gateway and&amp;nbsp; correctly import it. For CA-signed&lt;BR&gt;certificates, correctly import the CA certificate to the UM IP gateway.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;2. To get a new certificate, you can use new-exchangecertificate cmdlet. This cmdlet can be used to create a new self signed certificate or a new certificate request. Details of the cmdlet can be seen at &lt;A href="http://technet.microsoft.com/en-us/library/aa998327.aspx" mce_href="http://technet.microsoft.com/en-us/library/aa998327.aspx"&gt;msdn&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[PS] D:\Windows\system32&amp;gt;New-ExchangeCertificate -Services none -Server EXCH-I-349&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Thumbprint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Services&amp;nbsp;&amp;nbsp; Subject&lt;BR&gt;----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;80FAC0BC54F7282D14D326C34F80B02C3AA668CF&amp;nbsp; IP....&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=EXCH-I-349&lt;/P&gt;
&lt;P&gt;In the above example I have created a new self signed certificate which is present in the UM server's machine store and can be used by any MS Exchange service.&lt;/P&gt;
&lt;P&gt;3) Assign the above generated self signed certificate to UM.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[PS] D:\Windows\system32&amp;gt;Enable-ExchangeCertificate -Services UM -Thumbprint 80FAC0BC54F7282D14D326C34F80B02C3AA668CF -s&lt;BR&gt;erver EXCH-I-349&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Confirm&lt;BR&gt;Enable certificate with thumbprint 80FAC0BC54F7282D14D326C34F80B02C3AA668CF for Unified Messaging?&lt;BR&gt;[Y] Yes&amp;nbsp; [A] Yes to All&amp;nbsp; [N] No&amp;nbsp; [L] No to All&amp;nbsp; [?] Help (default is "Y"): yes&lt;BR&gt;&lt;FONT color=#e56717&gt;WARNING: To complete configuration (1) Restart Microsoft Exchange Unified Messaging Service on EXCH-I-349 and (2) For&lt;BR&gt;self-signed certificates, install this certificate on the UM IP Gateway. For CA-signed certificates, import the CA&lt;BR&gt;certificate on the UM IP Gateway.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Again&amp;nbsp;notice the warning it gives.&lt;/P&gt;
&lt;P&gt;4)&amp;nbsp;Restart UM service so that it starts listening on TLS.&lt;/P&gt;
&lt;P&gt;5) As specified by the warnings in the cmdlets ensure that the IP gateway trusts the certifcate used by the UM service. The warnings themselves are self explanatory that I wont be going through them again.&lt;/P&gt;
&lt;P&gt;6) Check the certificate used by the services&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[PS] D:\Windows\system32&amp;gt;Get-ExchangeCertificate&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Thumbprint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Services&amp;nbsp;&amp;nbsp; Subject&lt;BR&gt;----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;80FAC0BC54F7282D14D326C34F80B02C3AA668CF&amp;nbsp; &lt;STRONG&gt;IPU...&lt;/STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=EXCH-I-349&lt;BR&gt;3F4FF713FE8A604BCD84B20075B354DFCE36742B&amp;nbsp; IP.WS.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=EXCH-I-349&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;If your were using a self signed certificate then you could combine steps 2 and 3 together.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;STRONG&gt;[PS] D:\Windows\system32&amp;gt;New-ExchangeCertificate -Services UM -Server EXCH-I-349&lt;/STRONG&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Confirm&lt;BR&gt;Enable certificate with thumbprint 7B14E7BDF61F6461FBF32D4570B7DBE65E136B67 for Unified Messaging?&lt;BR&gt;[Y] Yes&amp;nbsp; [A] Yes to All&amp;nbsp; [N] No&amp;nbsp; [L] No to All&amp;nbsp; [?] Help (default is "Y"): yes&lt;/P&gt;
&lt;P mce_keep="true"&gt;Thumbprint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Services&amp;nbsp;&amp;nbsp; Subject&lt;BR&gt;----------&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; --------&amp;nbsp;&amp;nbsp; -------&lt;BR&gt;7B14E7BDF61F6461FBF32D4570B7DBE65E136B67&amp;nbsp; IPU...&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CN=EXCH-I-349&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9849493" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author><category term="UM" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/UM/default.aspx" /><category term="Exchange unified messaging" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/Exchange+unified+messaging/default.aspx" /><category term="certificate" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/certificate/default.aspx" /></entry><entry><title>Debugging a managed 64 bit service</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2008/04/21/managed-and-native-debuggers.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2008/04/21/managed-and-native-debuggers.aspx</id><published>2008-04-22T09:00:00Z</published><updated>2008-04-22T09:00:00Z</updated><content type="html">&lt;p&gt;I was trying to put a breakpoint in the Main function of a managed process which was being launched by a managed service. I knew about the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxtskLaunchingDebuggerAutomatically.asp" target="_blank" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vsdebug/html/vxtskLaunchingDebuggerAutomatically.asp"&gt;IFEO &lt;/a&gt;(Image file execution option) and I was trying it with vsjitdebugger.exe but it just would not attach. A little web search led me to great blog entries by &lt;a href="http://blogs.msdn.com/jmstall/archive/2006/02/16/ifeo_managed_debugging.aspx" target="_blank" mce_href="http://blogs.msdn.com/jmstall/archive/2006/02/16/ifeo_managed_debugging.aspx"&gt;Mike&lt;/a&gt;. The problem was that both the service and the process were not only managed but also 64 bit. Currently, it seems vsjitdebugger.exe does not support this scenario. Anyhow, Mike also has another &lt;a href="http://blogs.msdn.com/jmstall/archive/2005/01/28/362169.aspx" target="_blank" mce_href="http://blogs.msdn.com/jmstall/archive/2005/01/28/362169.aspx"&gt;blog entry&lt;/a&gt; where he explains a bit on how managed and native debuggers operate.&lt;/p&gt;&lt;p&gt;But I was still stuck on how to debug the service or the foo.exe launched by the service. The only clean way is to modify our code in the Main function (or OnStart if it is a service) and use &lt;a href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx" target="_blank" mce_href="http://msdn2.microsoft.com/en-us/library/system.diagnostics.debugger.launch.aspx"&gt;Debugger.Launch&lt;/a&gt;() (so annoying). &lt;/p&gt;&lt;p&gt;public static void Main()&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //you can use #define DEBUG also so that this become debug only code&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try &lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; if (!Debugger.IsAttached)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debugger.Launch();&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;  &amp;nbsp;&amp;nbsp;&amp;nbsp; Debugger.Break();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; catch (Exception ex)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //log and see which exception was thrown.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // continue with your main function&amp;nbsp;&lt;/p&gt;&lt;p&gt;}&amp;nbsp;&lt;/p&gt;&lt;p&gt;But then I was interested in how things work here.&lt;/p&gt;&lt;p&gt;Q . How does Debugger.Launch() know which debugger to start and where is it listed? &lt;br&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.msdn.com/jmstall/archive/2006/07/24/caveats_about_jit_debugging.aspx" mce_href="http://blogs.msdn.com/jmstall/archive/2006/07/24/caveats_about_jit_debugging.aspx"&gt;Ans. &lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8416103" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author><category term="Debuggers" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/Debuggers/default.aspx" /></entry><entry><title>Some good books .....</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2008/01/02/some-good-books.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2008/01/02/some-good-books.aspx</id><published>2008-01-02T22:04:00Z</published><updated>2008-01-02T22:04:00Z</updated><content type="html">&lt;P&gt;If you dont know about the &lt;EM&gt;aha!&lt;/EM&gt; factor then&amp;nbsp;read the book - &amp;nbsp;Programming Pearls by Jon Bentley. The problems and the solutions will definitely make you say &lt;EM&gt;aha! &lt;/EM&gt;:).&lt;/P&gt;
&lt;P&gt;The next one on my reading list is The Medical Detectives by Berton Roueche&lt;/P&gt;
&lt;P&gt;PS: I&amp;nbsp;will update this blog entry whenever I happen to find such great books.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=6958002" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author></entry><entry><title>How do we talk with COM the language of events and delegates </title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2007/09/18/how-do-we-talk-with-com-the-language-of-events-and-delegates.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2007/09/18/how-do-we-talk-with-com-the-language-of-events-and-delegates.aspx</id><published>2007-09-19T03:38:00Z</published><updated>2007-09-19T03:38:00Z</updated><content type="html">&lt;div&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;I wrote this blog entry from a real world&amp;nbsp;customer issue and noticed that how little&amp;nbsp;documentation exists&amp;nbsp;on this topic. &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;I assume that you already know what is a source interface in COM and&amp;nbsp;what are&amp;nbsp;IConnectionPoint and IConnectionPointContainer interfaces.&amp;nbsp;Please pick up any COM book to learn that (I would reccommend Essential COM by Don Box). Also, a familiarity with the events and delegates would help.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;The example code in this article are picked up from a real world scenario given by a customer.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Lets assume that we have a COM server which has a source interface as defined in the following IDL.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;Note: The best way to learn from this&amp;nbsp;article would be to &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;1) create a typelibrary from the IDL given above&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;2) create the interop dll using tlbimp.exe &lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;3) Use ildasm to read what is written inside the interop dll.&lt;/span&gt;&lt;/p&gt;
&lt;span style="font-size: 10pt; color: blue; font-family: 'Courier New';"&gt;&lt;font color="#0000ff" size="2"&gt;
&lt;/font&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;//Start of the idl&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;import&lt;/font&gt;&lt;font color="#000000" size="2"&gt; &lt;/font&gt;&lt;font color="#800000" size="2"&gt;"oaidl.idl"&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt;
&lt;/font&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;import&lt;/font&gt;&lt;font color="#000000" size="2"&gt; &lt;/font&gt;&lt;font color="#800000" size="2"&gt;"ocidl.idl"&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt;;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;object&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;uuid&lt;/font&gt;&lt;font size="2"&gt;(E3AA8979-3038-4CCD-BA37-13F29F1E61F1),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;dual&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;nonextensible&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;helpstring&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"ILegacyComObject Interface"&lt;/font&gt;&lt;font size="2"&gt;),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;pointer_default&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;unique&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;]&lt;/font&gt;&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt;
&lt;/font&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; ILegacyComObject : IDispatch{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;id&lt;/font&gt;&lt;font size="2"&gt;(1), &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;helpstring&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"method DoSomething"&lt;/font&gt;&lt;font size="2"&gt;)] HRESULT DoSomething(&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;uuid&lt;/font&gt;&lt;font size="2"&gt;(CD839D63-B5CB-4236-825F-9EF2C943261B),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;version&lt;/font&gt;&lt;font size="2"&gt;(1.0),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;helpstring&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"AtlComClient 1.0 Type Library"&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;]&lt;/font&gt;&lt;/p&gt;
&lt;font color="#0000ff" size="2"&gt;
&lt;/font&gt;
&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;library&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#000000"&gt; AtlComClientLib&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;importlib&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"stdole2.tlb"&lt;/font&gt;&lt;font size="2"&gt;);&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;uuid&lt;/font&gt;&lt;font size="2"&gt;(C23B1EFE-1A27-4200-B14C-5F2019E024C5),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;nonextensible&lt;/font&gt;&lt;font size="2"&gt;,&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;helpstring&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"_ILegacyComObjectEvents Interface"&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;]&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;dispinterface&lt;/font&gt;&lt;font size="2"&gt; _ILegacyComObjectEvents&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;properties&lt;/font&gt;&lt;font size="2"&gt;:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;methods&lt;/font&gt;&lt;font size="2"&gt;:&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;id&lt;/font&gt;&lt;font size="2"&gt;(1) ] VARIANT_BOOL CanDoSomething();&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;id&lt;/font&gt;&lt;font size="2"&gt;(2) ] &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;void&lt;/font&gt;&lt;font size="2"&gt; DoneSomething();&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;uuid&lt;/font&gt;&lt;font size="2"&gt;(A2272EDE-8103-43A7-A819-286EAE2C2A0A),&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;helpstring&lt;/font&gt;&lt;font size="2"&gt;(&lt;/font&gt;&lt;font color="#800000" size="2"&gt;"LegacyComObject Class"&lt;/font&gt;&lt;font size="2"&gt;)&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;]&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font color="#0000ff" size="2"&gt;coclass&lt;/font&gt;&lt;font size="2"&gt; LegacyComObject&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;default&lt;/font&gt;&lt;font size="2"&gt;] &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;interface&lt;/font&gt;&lt;font size="2"&gt; ILegacyComObject;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;[&lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;default&lt;/font&gt;&lt;font size="2"&gt;, &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;source&lt;/font&gt;&lt;font size="2"&gt;] &lt;/font&gt;&lt;font color="#0000ff" size="2"&gt;dispinterface&lt;/font&gt;&lt;font size="2"&gt; _ILegacyComObjectEvents;&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/p&gt;

&lt;p&gt;&lt;font size="2"&gt;};&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;//End of the idl&lt;/font&gt;&lt;/p&gt;
&lt;/span&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;In common terms we also say that the com server supports two "&lt;i&gt;events&lt;/i&gt;" CanDoSomething and DoneSomething.&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;NOTE: ILegacyComObject is just some implemented interface by the com server. &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;When we&amp;nbsp;create an inteop dll using tlbimp.exe it will contain the following classes and interfaces. &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;1) We need two delegates for the two events defined. Our naming convention is &amp;lt;interfacename&amp;gt;_&amp;lt;event name&amp;gt;EventHandler. Also note that since delegates are types so we will have two classes defined in the interop dll by the name:&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;_ILegacyComObjectEvents_CanDoSomethingEventHandler&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;_ILegacyComObjectEvents_DoneSomethingEventHandler&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;2) We have an interface defined as _ILegacyComObjectEvents with the correct ComVisible and GUID attributes.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;font face="Times New Roman" size="3"&gt;3) Tlbimp.exe also creates a second event interface, designated by the "_Event" suffix added to the name of the original interface. This second event interface has DoneSomething and &lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;CanDoSomething&lt;/span&gt;&lt;/tt&gt; events as members. It also has &lt;font size="4"&gt;&lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;add&lt;/span&gt;&lt;/tt&gt; &lt;font size="3"&gt;and &lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;remove&lt;/span&gt;&lt;/tt&gt; methods for the event delegates. In this example, the interface is called &lt;/font&gt;&lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;_ILegacyComObjectEvents_Event&lt;/span&gt;&lt;/tt&gt;. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal"&gt;&amp;nbsp;&lt;font size="3"&gt;&lt;font face="Times New Roman"&gt;4) The coclass generated would implement ILegacyComObject and &lt;/font&gt;&lt;/font&gt;&lt;tt&gt;&lt;span style="font-size: 11pt; font-family: 'Times New Roman';"&gt;_ILegacyComObjectEvents_Event
(Note) and be named as LegacyComObjectClass. For points 3 and 4 also msdn has
some good&amp;nbsp;article &lt;a href="http://msdn2.microsoft.com/en-us/library/k639e386.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/k639e386.aspx"&gt;http://msdn2.microsoft.com/en-us/library/k639e386.aspx&lt;/a&gt;&lt;/span&gt;&lt;/tt&gt;&lt;span style="font-size: 13pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;


&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/tt&gt; &lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;5) We generate a class &amp;lt;source interface name&amp;gt;_SinkHelper which implements the source interface methods (or in other words it implements _ILegacyComObject interface). Thus we would pass an instance of this class everytime IConnectionPoint::Advise is called. This class also stores the cookie returned from Advise.&lt;/font&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/span&gt;&lt;/tt&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="line-height: 140%; font-family: 'Times New Roman';"&gt;&lt;font size="3"&gt;Here is the pseudo code of the class&lt;/font&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;class _ILegacyComObjectEvents_SinkHelper : &lt;/span&gt;&lt;/tt&gt;&lt;font face="Times New Roman"&gt;_ILegacyComObjectEvents&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; line-height: 140%; font-family: 'Times New Roman';"&gt;{&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;font size="2"&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;//store the cookie returned &lt;/span&gt;&lt;/tt&gt;&lt;span class="sourcecodeChar"&gt;&lt;span style="font-family: 'Times New Roman';"&gt;from the IConnectionPoint::Advise call&lt;/span&gt;&lt;/span&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; line-height: 140%; font-family: 'Times New Roman';"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;public Int m_dwCookie; &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;// store the delegates from the user &lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;public&lt;/span&gt;&lt;/tt&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt; _ILegacyComObjectEvents_CanDoSomethingEventHandler m_CanDoSomethingDelegate;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;public&lt;/span&gt;&lt;/tt&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt; _ILegacyComObjectEvents_DoneSomethingEventHandler m_DoneSomethingDelegate;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;ILegacyComObject_SinkHelper () &lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;{&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_dwCookie = NULL;&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;m_CanDoSomethingDelegate= NULL;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;m_DoneSomethingDelegate = NULL;&lt;tt&gt;&lt;b&gt;&lt;span style="font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/b&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;&lt;/span&gt;&lt;/tt&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;bool CanDoSomething()&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (m_CanDoSomethingDelegate ! = NULL)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;return m_CanDoSomethingDelegate.Invoke(); //Invoke the delegate&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return 0;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// notice the default value &lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;// See the Notes below for the return type&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;void DoneSomething()&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if (m_DoSomethingDelegate ! = NULL)&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;return m_DoSomethingDelegate.Invoke(); //Invoke the delegate&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;return;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt;"&gt;&lt;font face="Times New Roman"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt; vertical-align: top; line-height: 140%;"&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; line-height: 140%; font-family: 'Times New Roman';"&gt;}&lt;/span&gt;&lt;/tt&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;6) We generate an EventProvider with name &amp;lt;source interface name&amp;gt;_EventProvider&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;This is the main class which provides the inter-operation between the COM server and the client. Note that it also implements the IDisposable interface.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;
&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 11pt;"&gt;Here is the pseudoCode.&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span style="font-size: 11pt;"&gt;&lt;/span&gt;class _ILegacyComObjectEvents_EventProvider: IDisposable, _ILegacyComObjectEvents_Event&lt;/p&gt;
&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;
&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// store the IConnectionPoint object from the COM server here&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;IConnectionPoint m_ConnectionPoint;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// runtime will provide the implementation of this &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;IConnectionPointContainer m_ConnectionPointContainer;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;//arraylist of object of type SinkHelpers&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;ArrayList m_aEventSinkHelpers; &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;public _ILegacyComObject_EventProvider(Object A1)&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;m_ConnectionPointContainer = (IConnectionPointContainer)A1;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;void Dispose()&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;_ILegacyComObjectEvents_EventProvider::Finalize();&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;GC.SuppressFinalize();&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;void Finalize()&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// save yourself from the threading issues&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;System.Threading.Monitor::Enter(this);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;try &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;for (each x in m_aEventSinkHelpers)&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;// call unadivse on each connection made&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;m_ConnectionPoint.UnAdvise(((&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;_ILegacyComObject&lt;/span&gt;&lt;/tt&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;Events_SinkHelper&lt;/span&gt;&lt;/tt&gt;)x).m_dwCookie);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;System.Runtime.InteropServices.Marshal::ReleaseComObject(m_ConnectionPoint);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}//end try&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;catch (Exception)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}//end catch&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;finally&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;System.Threading.Monitor::Exit(this);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;}//end finally&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}//end of Finalize&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// This function gets the IConnectionPoint implementation from the server for the given &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// interface. Also intializes the arraylist of EventSinkHelpers.&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;void Init ()&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;m_ConnectionPointContainer.FindConnectionPoint(guid of _ILegacyComObject, &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&amp;amp;m_ConnectionPoint);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Initialize the arraylist m_aEventSinkHelpers;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}//end of Init&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;public void add_CanDoSomething(_ILegacyComObjectEvents_CanDoSomethingEventHandler A_1)&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;//declare some temporary variables.&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;_ILegacyComObjectEvents_SinkHelper V_0;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;// Save yourserlf from the threading issues.&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;System.Threading.Monitor::Enter(this);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;try &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;// first check whether we have IConnectionPoint with us&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if (m_ConnectionPoint==NULL)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 4.5pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;Init();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;V_0 = new _ILegacyComObjectEvents_SinkHelper();&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;//call the advise method&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;m_ConnectionPoint.Advise(V_0, &amp;amp;V_1);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;// store the delegate and the cookie&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;V_0.m_dwCookie = V_1;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;tt&gt;&lt;span style="font-family: 'Times New Roman';"&gt;V_0.m_Ca&lt;/span&gt;&lt;/tt&gt;&lt;span&gt;&lt;font face="Times New Roman"&gt;nDoSomethingDelegate = A_1;&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;span&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;//add the EventSinkHelper to the arraylist&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;m_aEventSinkHelpers.Add((object) V_0);&lt;span&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;} //end try&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;finally&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Threading.Monitor::Exit(this);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;}//end finally&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}// end add_CanDoSomething&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// We have a similar implementation for add_DoneSomething&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;public void remove_CanDoSomething (_ILegacyComObjectEvents_CanDoSomethingEventHandler A_1)&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;//declare some temporary variables&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;_ILegacyComObjectEvents_SinkHelper V_2;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;System.Threading.Monitor::Enter(this);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;try &lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;for (each x in m_aEventSinkHelpers)&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;if ((_ILegacyComObjectEvents_SinkHelper) x.m_CanDoSomethingDelegate == A_1)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_aEventSinkHelpers.Remove(x); &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;V_2 = (_ILegacyComObjectEvents_SinkHelper)x;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;m_ConnectionPoint.UnAdvise(V_2.m_dwCookie);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;}&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;if (m_aEventSinkHelpers is empty)&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font size="2"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;System.Runtime.InteropServices.Marshal::ReleaseComObject(m_ConnectionPoint);&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;}//end of try&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;finally&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;{&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt 0.5in; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;System.Threading.Monitor::Exit(this);&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt; text-indent: 0.5in;"&gt;&lt;font face="Times New Roman" size="2"&gt;}&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;}//end of remove_CanDoSomething&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;// We have a similar implementation for remove_DoneSomething&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;} //end of class _ILegacyComObject_EventProvider&lt;/font&gt;&lt;/p&gt;

&lt;p class="sourcecode" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;EventProvider does the main work for us.&amp;nbsp;In general&amp;nbsp;every t&lt;/font&gt;&lt;font face="Times New Roman" size="3"&gt;ime a user adds a delegate &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&lt;span&gt;&lt;font size="3"&gt;1)&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;Get the IConnectionPointer if not available from the COM server and store it in the EvenProvider. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&lt;span&gt;&lt;font size="3"&gt;2)&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;Create a new instance of EvenSinkHelper.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt 0.5in; text-indent: -0.25in;"&gt;&lt;font face="Times New Roman"&gt;&lt;span&gt;&lt;span&gt;&lt;font size="3"&gt;3)&lt;/font&gt;&lt;span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;font size="3"&gt;Call Advise and give the EventSinkHelper implementation to the server.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Here is something unexpected which the users will notice. &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;In COM, a user may create and give one implementation of _ILegacyComObject to the server. When the event occurs the server will call both _ILegacyComObject::CanDoSomething and _ILegacyComObject::DoneSomething. Client calls only one IConnectionPoint::Advise.&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;However in the managed code the user would need to do something like&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; color: blue; font-family: 'Courier New';"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; color: blue; font-family: 'Courier New';"&gt;private&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt; &lt;span style="color: teal;"&gt;LegacyComObject&lt;/span&gt; m_legacyComObject;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;m_legacyComObject = &lt;span style="color: blue;"&gt;new&lt;/span&gt; &lt;span style="color: teal;"&gt;LegacyComObject&lt;/span&gt;();&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;//add the delegate for CanDoSomething&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;m_legacyComObject.CanDoSomething += m_legacyComObject_CanDoSomething;&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;//add the delegate for DoneSomething&lt;/span&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;span style="font-size: 10pt; font-family: 'Courier New';"&gt;m_legacyComObject.DoneSomething += m_legacyComObject_DoneSomething;&lt;/span&gt;&lt;font face="Times New Roman" size="3"&gt; &lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&amp;nbsp;&lt;br&gt;&lt;font face="Times New Roman" size="3"&gt;//&amp;nbsp;&lt;font face="Courier New" size="2"&gt;m_legacyComObject_CanDoSomething and m_legacyComObject_DoneSomething are two functions implemented in the user class.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Courier New" size="2"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;

&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman" size="3"&gt;Because we treat the two methods as two separate events&amp;nbsp;we need to&amp;nbsp;make two calls to _ILegacyComObjectEvents_EventProvider::add_CanDoSomething and _ILegacyComObjectEvents_EventProvider::add_DoneSomething&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;
&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;font size="3"&gt;Looking at the pseudo code above this would lead to two
separate connections or two separate Advise calls and which is inefficient.&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="margin: 0in 0in 0pt;"&gt;&lt;font face="Times New Roman"&gt;&lt;font face="Times New Roman"&gt;&lt;font size="3"&gt;In this case, for example, in the first call we create &lt;/font&gt;&lt;tt&gt;&lt;span style="font-size: 10pt; font-family: 'Times New Roman';"&gt;_ILegacyComObjectEvents_SinkHelper &lt;/span&gt;&lt;/tt&gt;&lt;font size="3"&gt;instance and call IConnectionPoint::Advise on it. Also notice that _ILegacyComObjectEvents_SinkHelper::m_DoneSomethingDelegate will remain NULL. If unmanaged COM server invokes this DoneSomething event then we&amp;nbsp;would simply return a default value. The delegates are allowed to return only the primitive types or the value types.&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;

&lt;p mce_keep="true"&gt;&lt;font face="Times New Roman"&gt;&amp;nbsp;&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=4989743" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author><category term="Com Interop assembly Eventing" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/Com+Interop+assembly+Eventing/default.aspx" /></entry><entry><title>Bitness of the loaded typelibrary</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2007/04/17/bitness-of-the-loaded-typelibrary.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2007/04/17/bitness-of-the-loaded-typelibrary.aspx</id><published>2007-04-17T21:32:00Z</published><updated>2007-04-17T21:32:00Z</updated><content type="html">&lt;P&gt;If you use LoadTypeLib or LoadTypeLibEx then Ole Automation always convert the typelibrary according to the process bitness. So if we load a 32 bit typelibrary using LoadTypeLib/LoadTypeLibEx in a 64 bit process then it will be automagically converted to a 64 bit typelib in memory and vice versa. &lt;/P&gt;
&lt;P&gt;As you may see that this is a one time perf hit but also enables users who for some reasons (best known to them)&amp;nbsp;are unable to obtain a 64 bit or 32 bit typelibrary. Also, note that by definition&amp;nbsp;ITyepLib::GetLibAttr would always show the persisted bitness of the typelibrary (i.e. the one present on the disk).&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2165271" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author><category term="LoadTypeLib/LoadTypeLibEx" scheme="http://blogs.msdn.com/varunsekhri/archive/tags/LoadTypeLib_2F00_LoadTypeLibEx/default.aspx" /></entry><entry><title>Marshaling BSTRs in COM/Interop or P/Invoke</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/varunsekhri/archive/2007/02/28/marshaling-bstrs-in-com-interop-or-p-invoke.aspx" /><id>http://blogs.msdn.com/varunsekhri/archive/2007/02/28/marshaling-bstrs-in-com-interop-or-p-invoke.aspx</id><published>2007-02-28T22:56:00Z</published><updated>2007-02-28T22:56:00Z</updated><content type="html">&lt;P&gt;I saw people making mistakes with BSTR marshaling in the COM/Interop space. Unfortunately msdn does not have many good examples on this subject. I will share some specific code examples which may help. The examples are only for reference&amp;nbsp;which may be made more robust&amp;nbsp;as needed.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;What is so special about BSTR?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;As &lt;A href="http://msdn2.microsoft.com/en-us/library/ms221105.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms221105.aspx"&gt;http://msdn2.microsoft.com/en-us/library/ms221105.aspx&lt;/A&gt;&amp;nbsp;states BSTRs are special strings&amp;nbsp;defined by&amp;nbsp;Ole Automation for which&amp;nbsp;memory is allocated by the system when users call SysAllocString/SysAllocStringLen.&amp;nbsp;Memory allocated&amp;nbsp;needs to be freed by a corresponding call of SysFreeString.&amp;nbsp;Size of the BSTR is stored at 4 bytes before the actual BSTR pointer returned by SysAllocString/SysAllocStringLen on both 32bit&amp;nbsp;and 64 bit platform.&lt;/P&gt;
&lt;P&gt;How to marshal a BSTR in COM/Interop or P/Invoke calls?&lt;/P&gt;
&lt;P&gt;Marshal a BSTR following the recommendation given at &lt;A href="http://msdn2.microsoft.com/en-us/library/s9ts558h.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/s9ts558h.aspx"&gt;http://msdn2.microsoft.com/en-us/library/s9ts558h.aspx&lt;/A&gt;&amp;nbsp;i.e. by using MarshalAsAttribute. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;How to pass BSTR&amp;nbsp;as an In/Out parameter?&lt;/STRONG&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://msdn2.microsoft.com/en-us/library/x3txb6xc.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/x3txb6xc.aspx"&gt;http://msdn2.microsoft.com/en-us/library/x3txb6xc.aspx&lt;/A&gt;&amp;nbsp;targets only simple strings (LPTSTR) where the buffer is passed to the P/Invoke call using StringBuilder. BSTR's are special in the sense that the buffer for the BSTR used will be provided by system. &lt;/P&gt;
&lt;P&gt;So lets say if the hypothetical unmanaged P/Invoke call is &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;//A very&amp;nbsp;good usage scenario is using IErrorInfo::GetDescription to get a BSTR &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;// and sending it back to the managed code&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;__declspec&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;dllexport&lt;/SPAN&gt;&lt;/FONT&gt;)&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=blue size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; bstrtest(BSTR *x)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *x = SysAllocString(L&lt;FONT color=maroon&gt;&lt;SPAN style="COLOR: maroon"&gt;"Something"&lt;/SPAN&gt;&lt;/FONT&gt;);&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;Then corresponding managed call should be &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;[&lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;DllImport&lt;/SPAN&gt;&lt;/FONT&gt;(&lt;FONT color=maroon&gt;&lt;SPAN style="COLOR: maroon"&gt;"emptydll.dll"&lt;/SPAN&gt;&lt;/FONT&gt;)]&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;extern&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt;&lt;/FONT&gt; bstrtest(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;ref&lt;/SPAN&gt;&lt;/FONT&gt; &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;IntPtr&lt;/SPAN&gt;&lt;/FONT&gt; dummy);&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;static&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT color=#000000 size=2&gt; Main(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;[] args)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IntPtr&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; dummy = &lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;&lt;FONT color=#008080 size=2&gt;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;.Zero;&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bstrtest(&lt;FONT color=blue&gt;&lt;SPAN style="COLOR: blue"&gt;ref&lt;/SPAN&gt;&lt;/FONT&gt; dummy); //get the bstr&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; String&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt; something = &lt;FONT color=teal&gt;&lt;SPAN style="COLOR: teal"&gt;Marshal&lt;/SPAN&gt;&lt;/FONT&gt;.PtrToStringBSTR(dummy); //convert it to the managed string&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;.WriteLine(something); //test we have got it&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // now free the unmanaged BSTR.&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&lt;FONT color=#000000&gt;Do not forget this or there will&amp;nbsp;be leaks.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" color=teal size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: teal; FONT-FAMILY: 'Courier New'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;.FreeBSTR(dummy); &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face="Courier New" size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'"&gt;}&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;STRONG&gt;How to marshal a structure&amp;nbsp;(with reference-type fields) by reference?&lt;/STRONG&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/FONT&gt;Consider the following&amp;nbsp;code &lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT size=2&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;[&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;StructLayout&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;LayoutKind&lt;/FONT&gt;&lt;FONT size=2&gt;.Sequential)]&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;struct&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;TestStruct&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MarshalAs&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;UnmanagedType&lt;/FONT&gt;&lt;FONT size=2&gt;.I4)]&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;int&lt;/FONT&gt;&lt;FONT size=2&gt; dumyInt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;MarshalAs&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;UnmanagedType&lt;/FONT&gt;&lt;FONT size=2&gt;.BStr)]&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; dummyString;&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; Main()&lt;/P&gt;
&lt;P&gt;{&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TestStruct&lt;/FONT&gt;&lt;FONT size=2&gt; dummyTestStruct = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;TestStruct&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dummyTestStruct.dumyInt = 10;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dummyTestStruct.dummyString = &lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;"stringTestStruct"&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//get the size of the structure&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&lt;/FONT&gt;&lt;FONT size=2&gt; testStructSize = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.SizeOf(dummyTestStruct);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //to pass the TestStruct as a reference we need IntPtr&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IntPtr&lt;/FONT&gt;&lt;FONT size=2&gt; testStructRef = &lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.AllocCoTaskMem(testStructSize);&lt;/P&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //finally marshal the structure&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.StructureToPtr(dummyTestStruct, testStructRef, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;false&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // now use TestStuctRef for an unmanaged function call&lt;/P&gt;&lt;/FONT&gt;
&lt;P mce_keep="true"&gt;&lt;FONT color=#008000 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// free the allocated Memory&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&lt;FONT color=#008080 size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.FreeCoTaskMem(testStructRef);&lt;/P&gt;
&lt;P&gt;}&lt;/P&gt;
&lt;P&gt;We just leaked the memory for the BSTR inside TestStruct. Remember the BSTR field inside the structure is a reference type.&lt;/P&gt;
&lt;P&gt;When marshaling dummyTestStruct&amp;nbsp;using&amp;nbsp;&lt;FONT color=#008080&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.StructureToPtr&amp;nbsp;&lt;/FONT&gt;the Runtime called SysAllocString to allocate the memory for BSTR and the reference TestStruct.dummyString points to that BSTR. In the above code Marshal.DestroyStructure should have been called which will appropriately call SysFreeString. So following is the correct code (snippet)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008080 size=2&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.StructureToPtr(dummyTestStruct, testStructRef, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;false&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;
&lt;P&gt;&lt;FONT color=#008000 size=2&gt;// now use TestStuctRef for an unmanaged function call&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;// free the allocated Memory&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#008080 size=2&gt;
&lt;P&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.DestroyStructure(testStructRef, dummyTestStruct.GetType());&lt;/FONT&gt;&lt;/P&gt;&lt;FONT color=#008080 size=2&gt;
&lt;P&gt;Marshal&lt;/FONT&gt;&lt;FONT size=2&gt;.FreeCoTaskMem(testStructRef);&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;
&lt;P&gt;&lt;STRONG&gt;Key take away points:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;1)&amp;nbsp;The Marshal class has many useful functions for manipulating BSTR's &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesMarshalClassTopic.asp"&gt;http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemRuntimeInteropServicesMarshalClassTopic.asp&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;2) It is very important to mark BSTR with MarshalAsAttribute so that Runtime specifically knows how&amp;nbsp;the application wants this string to be marshaled.&amp;nbsp;Forgetting this&amp;nbsp;will result in&amp;nbsp;heap corruption with&amp;nbsp;similar call stack as shown below.&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;00 0811e7f4 7c85079b ntdll!DbgBreakPoint &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;01 0811e804 7c8720c6 ntdll!RtlpPageHeapStop+0x72 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;02 0811e880 7c873305 ntdll!RtlpDphReportCorruptedBlock+0x199 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;03 0811e8b0 7c8734c3 ntdll!RtlpDphNormalHeapFree+0x32 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;04 0811e908 7c8766b9 ntdll!RtlpDebugPageHeapFree+0x146 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;05 0811e970 7c860386 ntdll!RtlDebugFreeHeap+0x1ed &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;06 0811ea48 7c81d77d ntdll!RtlFreeHeapSlowly+0x37 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;07 0811eb2c 776b83a6 ntdll!RtlFreeHeap+0x11a &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;08 0811eb40 776b84c4 ole32!CRetailMalloc_Free+0x1c &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;09 0811eb50 7a0afc1a ole32!CoTaskMemFree+0x13 &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;0a 0811eb5c 79f281ff mscorwks!DefaultMarshalOverrides&amp;lt;WSTRMarshalerBase&amp;gt;::UnmarshalCLRToNativeByrefInOut+0x2a &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial color=navy size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;2) Be careful when passing BSTR as In/Out parameter.&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; COLOR: navy; FONT-FAMILY: Arial"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class=MsoNormal&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"&gt;3) Avoid memory leaks by&amp;nbsp;freeing the memory&amp;nbsp;for the reference type fields in a structure. &lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1775742" width="1" height="1"&gt;</content><author><name>Varun Sekhri</name><uri>http://blogs.msdn.com/members/Varun+Sekhri.aspx</uri></author></entry></feed>