Praveen Katiyar' Blog

Learning along the way . . . .

Fetching an array of strings from a Win32 DLL

Define  a function in native dll (let say it “Win32Native.dll”)  as shown below.

extern "C" __declspec(dllexport) void FetchStringArray( int nCount, char* ppStrArray[])
{
    int result = 0;
    STRSAFE_LPSTR temp;
    size_t cchDest = 40;

    const size_t alloc_size = sizeof(char) * 40;

    for ( int nI = 0; nI < nCount; nI++ )
    {
       char *pszFormat = "from DLL >> [returned String %d]";
       STRSAFE_LPSTR temp = (STRSAFE_LPSTR)CoTaskMemAlloc( alloc_size );
       StringCchPrintfA(temp, cchDest, pszFormat, nI);

       CoTaskMemFree( ppStrArray[nI] );
       ppStrArray[nI] = (char *) temp;
    }
}

Point of Interest

  • CoTaskMemAlloc is used to allocated the memory required.
  • CoTaskMemFree is used to free any previously allocated buffer, if null is passed then, CoTaskMemFree is not called.

If you want to use a heap that is shared between native and managed, it is more common to use the COM heap.

Writing the client code (the managed part)

one can simply create a console based application

using System;
using System.Runtime.InteropServices;
using System.Text;

namespace MarshallingTest
{
   class Program
   {
       [DllImport("Win32Native.dll")]
       public static extern void FetchStringArray(int nCount, [In, Out] String[] arrStr);

       static void Main(string[] args)
       {
            int nSize = 10;
            String[] arrStr = new String[nSize];
            FetchStringArray(nSize, arrStr);
            Console.WriteLine("Returned String Array");
            for (int nI = 0; nI < nSize; nI++)
            {
                 Console.WriteLine(arrStr[nI]);
            }
       }

   }

}

Point of Interest

  • namespace System.Runtime.InteropServices;  defines the declarations necessary for Interop operations, like DllImport,
  • DllImport defines the DLL entry point.

compile and execute you will get following output.

image

Advertisements

August 4, 2013 - Posted by | .NET, CodeProject, Interoperability, Win32 | , , ,

No comments yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: