If you declare and dimension an array:
Dim x(5) as String
The pointer you receive in your C function points to a static array (the fFeatures element of the SAFEARRAY structure has the FADF_STATIC flag set). You can read the array, but you cannot redimension the array or modify the pointer, and you cannot copy over the array. If you need to modify the array in the DLL (to create a new one, for example), you must not dimension it in Visual Basic or pass a variant containing a SAFEARRAY. In the latter case, you can then free the SAFEARRAY and redirect the variant to a new SAFEARRAY created by your DLL.