Solved

Converting VB6 to C#

Posted on 2014-12-09
3
186 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 19

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 32

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

Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

Join & Write a Comment

Real-time is more about the business, not the technology. In day-to-day life, to make real-time decisions like buying or investing, business needs the latest information(e.g. Gold Rate/Stock Rate). Unlike traditional days, you need not wait for a fe…
Performance in games development is paramount: every microsecond counts to be able to do everything in less than 33ms (aiming at 16ms). C# foreach statement is one of the worst performance killers, and here I explain why.
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.
This lesson covers basic error handling code in Microsoft Excel using VBA. This is the first lesson in a 3-part series that uses code to loop through an Excel spreadsheet in VBA and then fix errors, taking advantage of error handling code. This l…

705 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

19 Experts available now in Live!

Get 1:1 Help Now