Click here to Skip to main content
15,867,453 members
Articles / Desktop Programming / ATL

Passing an array from VC++ DLL to VB

Rate me:
Please Sign up or sign in to vote.
4.23/5 (18 votes)
24 Apr 2002CPOL1 min read 155.4K   1.8K   31   15
This article shows how to pass an array from a VC++ DLL to VB

Introduction

This article shows how to pass an array from a VC++ DLL to a VB application

The steps

  • Create an ATL project named ArrayTry; Select DLL; Click Finish.
  • Use ATL Object Wizard to add a simple object.
  • Give the short name as myarray, click OK.
  • The next step is to add a method which takes an array as well as returns it after filling it. You can always add a method using the wizard but VC6 throws an error in this case as we are using SAFEARRAY. So we will do it manually which I think is more logical.
  • So go to your .idl file and add the following below the UUID declaration of your interface
  • interface Imyarray : IDispatch
    {
        [id(1), helpstring("method LongArray")] 
            HRESULT LongArray([in,out] SAFEARRAY(long)* pLarr);
    };
  • Go to your class's .h file and add the following at the very end,
  • // Imyarray
    public:
        STDMETHOD(LongArray)(/*[in,out]*/ SAFEARRAY** pLarr);
  • Go to your class' .cpp file and add the following
  • STDMETHODIMP Cmyarray::LongArray(SAFEARRAY** pLarr)
    {
        
        long lElements; // number of elements in the array
        long iCount;
        HRESULT lResult; // return code for OLE functions
    
        // pointer to the elements of the array
        long *pArrayElements; 
    
        long Larray[3] = {4,2,3};//existing array
    
        //checking if it is an one-dimensional array
        if ( (*pLarr)->cDims != 1 ) return(1);
    
        // checking if it is an array of longs
        if ( (*pLarr)->cbElements != 4 ) return(2);
    
    
        //Getting the number of elements of the array
        lElements = (*pLarr)->rgsabound[0].cElements;
    
        // locking the array before using its elements
        lResult=SafeArrayLock(*pLarr);
        if(lResult)return(lResult);
    
        // using the array
        pArrayElements=(long*) (*pLarr)->pvData;
        for (iCount=0; iCount<lElements; iCount++)
            pArrayElements[iCount] = Larray[iCount];
    
        // releasing the array
        lResult=SafeArrayUnlock(*pLarr);
        if (lResult) return(lResult);
    
    
        return S_OK;
    }
  • In the above function we take an array , which will be passed ( by a VB application ) & fill it with the values from an existing array.
  • Press F7 to build the DLL , go to Tools and register your DLL. Your DLL is now ready for use.
  • Now Create a VB application as an EXE; Add a command button, double click to add the following code
  • VB
    Private Sub Command1_Click()
    Dim x As New TRYARRLib.larray
    
        Dim ArrayOfLongs(3) As Long 'Declare the array
          
        x.LongArray ArrayOfLongs  'Get the array
          
        For Counter = 0 To 2
            'print the array contents
            Debug.Print ArrayOfLongs(Counter) 
        Next
          
    End Sub
  • Don't forget to add a reference to your DLL ( Go to projects/references and point to your .tlb file )

That's It

Watch the results in the immediate window. Please write to me for any explanations/doubts , better way to do the same thing.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



Comments and Discussions

 
QuestionPassing an array from VC++ DLL to VB using Windows 7 and Visual Studio 2008 Pin
John Huseby 224-Sep-10 6:28
John Huseby 224-Sep-10 6:28 
Questionwhat can be the reasion? Pin
JigarThakkar21-Dec-03 23:59
JigarThakkar21-Dec-03 23:59 
GeneralPassing an array from VC++ DLL to VB Pin
coolkoo13-Nov-03 22:58
coolkoo13-Nov-03 22:58 
GeneralProblems with vb Pin
nastanet15-Sep-03 5:29
nastanet15-Sep-03 5:29 
GeneralKEyboard Hook dll Pin
percyvimal4-Sep-03 23:05
percyvimal4-Sep-03 23:05 
GeneralAbsolutely perfect! Pin
HongKongPhooey30-Jan-03 16:55
HongKongPhooey30-Jan-03 16:55 
GeneralI want a simple method to realize the string safearray passed from vb to vc(or from vc to vb) Pin
Anonymous12-Nov-02 4:26
Anonymous12-Nov-02 4:26 
GeneralRe: I want a simple method to realize the string safearray passed from vb to vc(or from vc to vb) Pin
Bard4-Aug-03 0:06
Bard4-Aug-03 0:06 
QuestionIs this applicable to ".NET" Framework? Pin
26-Jul-02 7:54
suss26-Jul-02 7:54 
GeneralIs this applicable to ".NET" Pin
Anonymous25-Jul-02 12:35
Anonymous25-Jul-02 12:35 
QuestionByte Array? Pin
27-Apr-02 10:42
suss27-Apr-02 10:42 
GeneralAnother good sample Pin
Rashid Thadha25-Apr-02 0:02
Rashid Thadha25-Apr-02 0:02 
GeneralSafeArrayAccessData vs. SafeArrayLock Pin
Maximilian Hänel24-Apr-02 1:22
Maximilian Hänel24-Apr-02 1:22 
GeneralRe: SafeArrayAccessData vs. SafeArrayLock Pin
User 2898324-Apr-02 2:06
User 2898324-Apr-02 2:06 
GeneralRe: SafeArrayAccessData vs. SafeArrayLock Pin
Maximilian Hänel24-Apr-02 9:15
Maximilian Hänel24-Apr-02 9:15 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.