<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Weblog of Gopalakrishna Palem : Marshalling</title><link>http://blogs.msdn.com/gpalem/archive/tags/Marshalling/default.aspx</link><description>Tags: Marshalling</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>How to check if my code is executing inside a Managed App or Native App?</title><link>http://blogs.msdn.com/gpalem/archive/2008/02/29/how-to-check-if-i-am-with-in-a-managed-app-or-native-app.aspx</link><pubDate>Fri, 29 Feb 2008 21:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7956997</guid><dc:creator>P.Gopalakrishna</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/gpalem/comments/7956997.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gpalem/commentrss.aspx?PostID=7956997</wfw:commentRss><wfw:comment>http://blogs.msdn.com/gpalem/rsscomments.aspx?PostID=7956997</wfw:comment><description>If you check the CRT source code (inside VC\crt\src\crt0.c ) you can find an interesting function check_managed_app() that returns 1 if managed app, 0 if not based on the COM Runtime Descriptor in the Image Data Directory of the PE or PE+ header. You...(&lt;a href="http://blogs.msdn.com/gpalem/archive/2008/02/29/how-to-check-if-i-am-with-in-a-managed-app-or-native-app.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7956997" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gpalem/archive/tags/C_2B002B00_+Design/default.aspx">C++ Design</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Operating+System+Internals/default.aspx">Operating System Internals</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Debugging/default.aspx">Debugging</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Marshalling/default.aspx">Marshalling</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Interoperability/default.aspx">Interoperability</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/MFC+Libraries/default.aspx">MFC Libraries</category></item><item><title>How to return String-Arrays from C++ COM component to C#?</title><link>http://blogs.msdn.com/gpalem/archive/2007/04/27/how-to-return-string-arrays-from-c-com-component-to-c.aspx</link><pubDate>Fri, 27 Apr 2007 19:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2300960</guid><dc:creator>P.Gopalakrishna</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/gpalem/comments/2300960.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gpalem/commentrss.aspx?PostID=2300960</wfw:commentRss><wfw:comment>http://blogs.msdn.com/gpalem/rsscomments.aspx?PostID=2300960</wfw:comment><description>
&lt;p&gt;Want to return an array of strings from native COM component to managed code? &lt;/p&gt;

&lt;p&gt;You need to declare the string array as &lt;span style="font-size: 10pt; font-family: Courier New;"&gt;SAFEARRAY(VARIANT)&lt;/span&gt; in the COM code. &lt;/p&gt;

&lt;p&gt;IDL for the function that returns the array of strings for the COM component would look like, &lt;/p&gt;

&lt;p&gt;&lt;span style="font-size: 9pt; font-family: Courier New;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: blue;"&gt;id&lt;/span&gt;(1)] HRESULT GetStringArray([&lt;span style="color: blue;"&gt;out&lt;/span&gt;] SAFEARRAY(VARIANT)* StrArray);&lt;/span&gt; &lt;/p&gt;

&lt;p&gt;The C++ implementation of the function should create a Safe Array of variants and initialize each variant with a BSTR as shown below: &lt;/p&gt;
&lt;div style="background-color: LightGrey; font-size: 9pt; font-family: Courier New;"&gt;&lt;br&gt;STDMETHODIMP CNativeCOMComponent::GetStringArray(SAFEARRAY** pStrArray) &lt;br&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;    SAFEARRAYBOUND bounds[] = {{2, 0}};  &lt;span style="color: rgb(51, 153, 51);"&gt;//Array Contains 2 Elements starting from Index '0' &lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;    SAFEARRAY* pSA = SafeArrayCreate(VT_VARIANT,1,bounds); &lt;span style="color: rgb(51, 153, 51);"&gt;//Create a one-dimensional SafeArray of variants&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;    &lt;span style="color: rgb(32, 128, 255);"&gt;long&lt;/span&gt; lIndex[1]; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;    VARIANT var; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          lIndex[0] = 0; &lt;span style="color: rgb(51, 153, 51);"&gt;// index of the element being inserted in the array &lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          var.vt = VT_BSTR; &lt;span style="color: rgb(51, 153, 51);"&gt;// type of the element being inserted &lt;br&gt;          &lt;/span&gt;&lt;br&gt; &amp;nbsp;&amp;nbsp;         var.bstrVal = ::SysAllocStringLen( L"&lt;span style="color: rgb(102, 51, 102);"&gt;The First String&lt;/span&gt;", 16 ); &lt;span style="color: rgb(51, 153, 51);"&gt;// the value of the element being inserted &lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          HRESULT hr= SafeArrayPutElement(pSA, lIndex, &amp;amp;var); &lt;span style="color: rgb(51, 153, 51);"&gt;// insert the element &lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          &lt;span style="color: rgb(51, 153, 51);"&gt;// repeat the insertion for one more element (at index 1) &lt;br&gt;&lt;/span&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          lIndex[0] = 1; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          var.vt = VT_BSTR; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          var.bstrVal = ::SysAllocStringLen( L"&lt;span style="color: rgb(102, 51, 102);"&gt;The Second String&lt;/span&gt;", 17 ); &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;          hr = SafeArrayPutElement(pSA, lIndex, &amp;amp;var); &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;    *pStrArray = pSA; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;    &lt;span style="color: rgb(32, 128, 255);"&gt;return&lt;/span&gt; S_OK; &lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/div&gt;
&lt;p&gt;In the above sample we are inserting two BSTR variants into the created Safe Array. Once the Array is filled with the variants (of type VT_BSTR), it can be retrieved from the C# managed code as shown below: &lt;/p&gt;

&lt;div style="background-color: LightGrey; font-size: 9pt; font-family: Courier New;"&gt;{ &lt;br&gt;&amp;nbsp;&amp;nbsp;   CNativeCOMComponent ComObj = &lt;span style="color: rgb(51, 102, 204);"&gt;new&lt;/span&gt; CNativeCOMComponent(); &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;   Array arr; &lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;   ComObj.GetStringArray(out arr); &lt;span style="color: rgb(51, 153, 51);"&gt;//arr would now hold the two strings we have sent from the COM code&lt;/span&gt; &lt;br&gt;}&lt;br&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2300960" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gpalem/archive/tags/Marshalling/default.aspx">Marshalling</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Interoperability/default.aspx">Interoperability</category></item><item><title>How to Modify Managed Strings in Native Code?</title><link>http://blogs.msdn.com/gpalem/archive/2007/03/01/how-to-modify-managed-string-in-native-code.aspx</link><pubDate>Thu, 01 Mar 2007 20:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1780526</guid><dc:creator>P.Gopalakrishna</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/gpalem/comments/1780526.aspx</comments><wfw:commentRss>http://blogs.msdn.com/gpalem/commentrss.aspx?PostID=1780526</wfw:commentRss><wfw:comment>http://blogs.msdn.com/gpalem/rsscomments.aspx?PostID=1780526</wfw:comment><description>&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;Want to modify a managed string passed to a native function? I collected two ways of doing it. Either you can use &lt;EM&gt;System::Text::StringBuilder&lt;/EM&gt; mechanism or you can use the array method mentioned at &lt;A href="http://msdn2.microsoft.com/en-us/library/s04yfy1s(VS.80).aspx" mce_href="http://msdn2.microsoft.com/en-us/library/s04yfy1s(VS.80).aspx"&gt;http://msdn2.microsoft.com/en-us/library/s04yfy1s(VS.80).aspx&lt;/A&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;You can pass the string that you want to modify as a one-element string array to the native code and modify the array, or you can pass a &lt;EM&gt;StringBuilder&lt;/EM&gt; variable and modify it. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;In the array mechanism, construct a native function that looks like below: &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; NativeFunction(PWSTR lpszString[]) &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; lpszString[0] = L&lt;SPAN style="COLOR: maroon"&gt;"Hello World";&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: #00b050"&gt;// Modifies the string&lt;/SPAN&gt;&lt;/SPAN&gt; &lt;BR&gt;} &lt;/SPAN&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;The managed code to P/Invoke this should be as below: &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: blue"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;Program &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/SPAN&gt;&lt;BR&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;SPAN style="COLOR: teal"&gt;DllImport&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"NativeDll.dll"&lt;/SPAN&gt;)] &lt;/SPAN&gt;&lt;BR&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;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;extern&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;int&lt;/SPAN&gt; NativeFunction([&lt;SPAN style="COLOR: teal"&gt;In&lt;/SPAN&gt;][&lt;SPAN style="COLOR: teal"&gt;Out&lt;/SPAN&gt;][&lt;SPAN style="COLOR: teal"&gt;MarshalAs&lt;/SPAN&gt;(&lt;SPAN style="COLOR: teal"&gt;UnmanagedType&lt;/SPAN&gt;.LPArray,ArraySubType=&lt;SPAN style="COLOR: teal"&gt;UnmanagedType&lt;/SPAN&gt;.LPWStr, SizeConst=1)] &lt;SPAN style="COLOR: teal"&gt;String&lt;/SPAN&gt;[] str);&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;[] args) &lt;/SPAN&gt;&lt;BR&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;/SPAN&gt;&lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: teal"&gt;String&lt;/SPAN&gt;[] myArr = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;String&lt;/SPAN&gt;[] { &lt;SPAN style="COLOR: maroon"&gt;"One"&lt;/SPAN&gt; };&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NativeFunction(myArr);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Call the Native Method &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.&lt;SPAN style="COLOR: teal"&gt;Console&lt;/SPAN&gt;.WriteLine(myArr[0].ToString());&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Should Print "HelloWorld" &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR&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;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;In the above, we are DllImporting the native function by marshalling the parameter as an &lt;EM&gt;in,out,LPWStr array of size 1. &lt;/EM&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;Note that this requires declaring the native function parameter as an array of strings (instead of single string). This should be fine as long as we have the flexibility to change the native function prototype. If the native function is an API Callback (e.g. GetWindowText) then we cannot use this method. &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;In such cases using &lt;EM&gt;StringBuilder&lt;/EM&gt; is the recommended approach. If we have a native method declaration as below, &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; GetComputerName (PWSTR lpszString, int nBufLen) &lt;BR&gt;{ &lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;wcsncpy(lpszString, L&lt;SPAN style="COLOR: maroon"&gt;"Home-PC"&lt;/SPAN&gt;, nBufLen);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;SPAN style="COLOR: #00b050"&gt;// Modifies the string &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="FONT-SIZE: 10pt; FONT-FAMILY: Courier New"&gt;}&lt;/SPAN&gt;&lt;SPAN style="COLOR: #1f497d"&gt; &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;In the managed code, use the following DllImport options: &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;SPAN style="COLOR: teal"&gt;DllImport&lt;/SPAN&gt;(&lt;SPAN style="COLOR: maroon"&gt;"NativeDll.dll"&lt;/SPAN&gt;)] &lt;/SPAN&gt;&lt;BR&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;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;extern&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; GetComputerName ([&lt;SPAN style="COLOR: teal"&gt;In&lt;/SPAN&gt;][&lt;SPAN style="COLOR: teal"&gt;Out&lt;/SPAN&gt;][&lt;SPAN style="COLOR: teal"&gt;MarshalAs&lt;/SPAN&gt;(&lt;SPAN style="COLOR: teal"&gt;UnmanagedType&lt;/SPAN&gt;.LPWStr)] &lt;SPAN style="COLOR: teal"&gt;StringBuilder&lt;/SPAN&gt; str, [&lt;SPAN style="COLOR: teal"&gt;In&lt;/SPAN&gt;] &lt;SPAN style="COLOR: #00b050"&gt;int&lt;/SPAN&gt; nBufLen); &lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;SPAN style="COLOR: blue"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: blue"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN style="COLOR: blue"&gt;string&lt;/SPAN&gt;[] args) &lt;/SPAN&gt;&lt;BR&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;/SPAN&gt;&lt;BR&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: teal"&gt;StringBuilder&lt;/SPAN&gt; ComputerName = &lt;SPAN style="COLOR: blue"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: teal"&gt;StringBuilder&lt;/SPAN&gt;();&lt;/SPAN&gt; &lt;/P&gt;
&lt;P&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ComputerName.EnsureCapacity(1024);&lt;SPAN style="COLOR: #00b050"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fnWin32DLL(ComputerName, 1024);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: green"&gt;// Call the Native Method&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.&lt;SPAN style="COLOR: teal"&gt;Console&lt;/SPAN&gt;.WriteLine(ComputerName.ToString());&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #00b050"&gt;// Should Print "Home-PC" &lt;/SPAN&gt;&lt;/SPAN&gt;&lt;BR&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;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #1f497d"&gt;In the managed code, declare the string parameter as an &lt;EM&gt;In,Out, StringBuilder&lt;/EM&gt; and pass a &lt;EM&gt;StringBuilder&lt;/EM&gt; variable (after ensuring a minimum buffer size with &lt;EM&gt;EnsureCapacity()&lt;/EM&gt; function to avoid buffer access problems in the native code). &lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1780526" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/gpalem/archive/tags/Marshalling/default.aspx">Marshalling</category><category domain="http://blogs.msdn.com/gpalem/archive/tags/Interoperability/default.aspx">Interoperability</category></item></channel></rss>