How to Pass User-Defined Structure Containing Strings to DLL

Last reviewed: June 21, 1995
Article ID: Q107750
The information in this article applies to:

- Microsoft Visual Basic for Windows, version 3.0

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 reference words: 3.00
KBCategory: kbprg kbcode
KBSubcategory: APrgOther


THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Last reviewed: June 21, 1995
© 1998 Microsoft Corporation. All rights reserved. Terms of Use.