Я пытаюсь маршалировать надежный массив BSTR из COM-объекта обратно в клиентское приложение C ++.
Мое определение IDL задействованной функции:
[id(5), helpstring("method GetStreams")]
HRESULT GetStreams( [out,retval] VARIANT* pvarStreamNames );
Вот моя реализация функции GetStreams ():
STDMETHODIMP CArchiveManager::GetStreams(VARIANT* pvarStreamNames)
{
CComSafeArray<BSTR, VT_BSTR> saStreamNames;
CComVariant varOutNames;
Stream* pNext = NULL;
int nNumStreams = m_Streams.NumStreams();
if( nNumStreams == 0 )
return S_OK;
for(int x = 0; x < nNumStreams; x++)
{
pNext = m_Streams.GetAt(x);
if( pNext )
saStreamNames.Add( pNext->StreamName() );
}
if( saStreamNames.GetCount() > 0 )
{
varOutNames.vt = VT_ARRAY;
varOutNames.parray = saStreamNames.m_psa;
varOutNames.Detach(pvarStreamNames);
}
return S_OK;
}
Вот как клиентская программа C ++ вызывает функцию GetStreams ():
VARIANT varStreamNames;
hr = spArchiveMgr->GetStreams( &varStreamNames );
Я прослеживаю программу, используя интерактивный отладчик, и кажется, что все работает правильно (safearray заполняется правильно и т. Д.), Пока не вернется функция GetStreams (). В этот момент я получаю сообщение «Место чтения необработанного исключения».
совет как отладить / решить эту проблему?