Assume this as your VB6 declaration:-
vb Code:
  1. Private Declare Sub ReadVB6StringArray Lib "PInvokeTestingGround.dll" (strn() As String)

And this as its usage:-
vb Code:
  1. '
  2.     Dim s(4) As String
  3.    
  4.     s(0) = "Pippo"
  5.     s(1) = "Pluto"
  6.     s(2) = "Paperino"
  7.     s(3) = "Minnie"
  8.  
  9.     ReadVB6StringArray s

This is what you C++ function should look like:-
c++ Code:
  1. //
  2. void _stdcall ReadVB6StringArray(SAFEARRAY **strings)
  3. {
  4.    
  5.     SAFEARRAY* vbarray =(*strings);
  6.  
  7.     ULONG numElements = vbarray->rgsabound[0].cElements;
  8.     int lbound = vbarray->rgsabound[0].lLbound;
  9.  
  10.     BSTR* vbStrings=(BSTR*) vbarray->pvData;
  11.  
  12.     // Loops through the strings
  13.     for(int i=lbound; (i < lbound+numElements);i++)
  14.     {
  15.         //Gets the current string
  16.         BSTR current = vbStrings[i];
  17.        
  18.     }
  19.    
  20.  
  21. }

Now, I'm not 100% sure that C++ function works since its really a royal pain in my ass to find a way to convert VB's BSTR string into a C string to test reading the strings. But I'm reasonably certain its reading the SAFEARRAY correctly. I'll leave finding a way to convert from a BSTR up to you.