Converting VB6 to C#

Hi Experts,

I have a VB6 program that I am currently converting to C# and I am having issues interfacing to a particular method in an existing unmanaged dll.

All calls to the dll so far have worked perfectly, but this is the only method that passes a reference to a struct and is the only one I am having trouble with.

How would I write my dll import and call the method?


C++ dll Method declaration
int _stdcall getVBArrayStrValues(LPSTR tagName, LPSTR itemName, 
						short firstElmNo, short lastElmNo, LPSAFEARRAY FAR * ppsaStringRead)

Open in new window


VB Declaration of the dll
Public Declare Function getVBArrayStrValues Lib "FILENAME.dll" _
                                        (ByVal lpTagName As String, _
                                         ByVal lpItemName As String, _
                                         ByVal firstElmNo As Integer, _
                                         ByVal lastElmNo As Integer, _
                                         ByRef stringRead() As vbStringRead) As Integer

Open in new window


Type/Struct Definition
Type vbStringRead
    readStatus As Integer
    valueStr As String
End Type

Open in new window


VB call to the dll
ret = getVBArrayStrValues(tag, item, i1, i2, strRead())

Open in new window



My best guess for the C# Code:

ret = getVBArrayStrValues(tag, item, i1, i2, ref strRead);

Open in new window


public struct vbStringRead
        {
            public int readStatus;
            public string valueStr;
        }

Open in new window


[DllImport("FILENAME.dll")]
        public static extern int getVBArrayStrValues(string lpTagName, string lpItemName, int firstElmNo, int lastElmNo, ref vbStringRead[] stringRead);

Open in new window

LVL 2
slavsAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Daniel Van Der WerkenIndependent ConsultantCommented:
This Microsoft Article is a good reference for what you want to do. This task is more complicated than you'd think.

Since I don't have your DLL, I cant' try this, but essentially you need to use IntPtr and Marshall stuff.

Per the article:
      // array ByRef  
      int[] array2 = new int[ 10 ];
      int size = array2.Length;
      Console.WriteLine( "\n\nInteger array passed ByRef before call:" );
      for( int i = 0; i < array2.Length; i++ )
      {
         array2[ i ] = i;
         Console.Write( " " + array2[ i ] );
      }
      IntPtr buffer = Marshal.AllocCoTaskMem( Marshal.SizeOf( size ) 
         * array2.Length );
      Marshal.Copy( array2, 0, buffer, array2.Length );

Open in new window


Read the whole article and I think you'll see what you need to do.
0
it_saigeDeveloperCommented:
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
slavsAuthor Commented:
Thank-you very much to the both of you, great examples/information.
I think I have a good idea of what I have to do now.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C++

From novice to tech pro — start learning today.