【发布时间】:2011-05-11 09:48:17
【问题描述】:
我正在尝试将来自 COM 对象的 BSTR 安全数组封送回 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 );
我使用交互式调试器跟踪程序,一切似乎都正常工作(安全数组正确填充等),直到 GetStreams() 函数返回。此时,我收到“未处理的异常读取位置”消息。
关于如何调试/解决此问题的建议?
【问题讨论】:
标签: c++ com marshalling atl