questo funziona correttamente:

codice:

	LONG lstart, lend;
	LONG idx = -1;
	LONG nPos;
	HRESULT hr;
	BSTR* pbstr;

	hr = SafeArrayGetLBound( sa, 1, &lstart );
	
	if(FAILED(hr)) return ;
		hr = SafeArrayGetUBound( sa, 1, &lend );
	if(FAILED(hr)) return ;

	hr = SafeArrayAccessData(sa,(void HUGEP**)&pbstr);
	if(SUCCEEDED(hr))
	{
		for(idx=lstart; idx <= lend; idx++)
		{		
			CComBSTR s;
			s = pbstr[idx];
			if(!containsElement(pArray,s.Copy()) && s != "")
				pArray->Add(s.Copy());	
		
		}
		hr = SafeArrayUnaccessData(sa);	
		if(FAILED(hr)) return ;
	}	
	else
		return ;

solo che non ho capito cosa fa questa riga:
hr = SafeArrayAccessData(sa,(void HUGEP**)&pbstr);
cos è HUGEP?
Grazie.