Solved

Converting VB6 to C#

Posted on 2014-12-09
3
187 Views
Last Modified: 2014-12-10
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

0
Comment
Question by:slavs
3 Comments
 
LVL 20

Assisted Solution

by:Daniel Van Der Werken
Daniel Van Der Werken earned 250 total points
ID: 40488783
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
 
LVL 33

Accepted Solution

by:
it_saige earned 250 total points
ID: 40489313
0
 
LVL 2

Author Closing Comment

by:slavs
ID: 40492447
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

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When trying to find the cause of a problem in VBA or VB6 it's often valuable to know what procedures were executed prior to the error. You can use the Call Stack for that but it is often inadequate because it may show procedures you aren't intereste…
Since upgrading to Office 2013 or higher installing the Smart Indenter addin will fail. This article will explain how to install it so it will work regardless of the Office version installed.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

911 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

20 Experts available now in Live!

Get 1:1 Help Now