How to Pass User-Defined Structure Containing Strings to DLL

ID: Q107750


The information in this article applies to:


SUMMARY

This articles shows by example how to pass a user-defined structure that contains strings to a DLL. The example enables a DLL to read and write the strings in a user-defined structure.


MORE INFORMATION

The following step-by-step example passes a user-defined structure that contains strings to a DLL to manipulate.

  1. Start a new project in Visual Basic.


  2. From the File menu, choose New Module (ALT F M). MODULE1.BAS will be created by default. Add the following code to the .BAS module:
    
       ' Fixed-length string elements of a structure are packed in memory
       ' as are other values in Visual Basic. The following structure takes up
       ' 16 bytes of memory:
       '
       Type MYSTRINGSTRUCT
          str1 As String * 8
          str2 As String * 8
       End Type
       ' Enter the following Declare statement as one, single line
    
       Declare Sub MyStructProc Lib "Name of DLL your create"
          (lpStringStruct As MYSTRINGSTRUCT)
     


  3. Add a command button (Command1) to Form1.


  4. Add the following code to the Command1_Click event of Form1:
    
       Sub Command1_Click ()
       Dim StringStruct As MYSTRINGSTRUCT
          StringStruct.str1 = "str1"
          StringStruct.str2 = "str2"
          MyStructProc StringStruct
          TEXT1.Text = StringStruct.str1
          TEXT2.Text = StringStruct.str2
       End Sub
     


  5. Add two text controls (Text1 and Text2) to Form1.


  6. Create the C code needed to make the DLL. In the .h file of the DLL a user-defined type will create a mirror image of the type you defined in the Visual Basic .BAS file. Char str[8] is equivalent to Visual Basic declaration of str1 as String * 8. This structure definition takes up 16 bytes in memory as does the Visual Basic structure definition.
    
       typedef struct STRINGSTRUCT{
    
       char str1[8] ;
       char str2[8] ;
       } FAR * LPSTRINGSTRUCT ;
    
       /* Declaration of the function */ 
       void FAR PASCAL MyStructProc(LPSTRINGSTRUCT) ;
     


  7. Add the following code to your .c file:
    
       #include "The .h file where you added the code above"
    
       void FAR PASCAL MyStructProc(LPSTRINGSTRUCT lpStringStruct)
       {
       /* You need to use lstrcpyn because the structure from Visual
       Basic is packed, and the strings are not Null terminated. The way
       structures are passed from Visual Basic to a DLL is fully described
       beginning on page 566 in the Visual Basic version 3.0 for Windows
       "Programmers Guide," Chapter 24, "Calling Procedures in DLLs," in
       "User-Defined Types" under "Calling DLL Procedures with Specific Data
       Types." */ 
    
          lstrcpyn(lpStringStruct->str1, "change11", 8) ;
          lstrcpyn(lpStringStruct->str2, "change22", 8) ;
       } 


Additional query words: 3.00


Keywords          : 
Version           : 
Platform          : 
Issue type        : 

Last Reviewed: June 16, 1999