Those links are actually helpful, because they give you C++ wrappers for SAFEARRAYs that will simplify the job of converting the SAFEARRAY to some other array of strings.
CComSafeArray<BSTR> safearrayOfBstr(((VARIANT)data).parray);
will wrap the SAFEARRAY contained in the VARIANT. You can then use the CComSafeArray methods to access the SAFEARRAY data. This article[^] is very useful, because it gives easier access to 2D SAFEARRAYs, which is what you've got here. Thing is, it's up to you to do that final step of converting to your CStringArray - but all you need to do is iterate through the relevant elements of the SAFEARRAY, extract the BSTR, convert it to a CString and store that in your CStringArray - not tricky, really!
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p