I do something similar (return binary data in a safe array) in my COM Mailslots article. The code in question is:
STDMETHODIMP CMailslotData::Read(VARIANT *ppResults)
{
if (!ppResults)
{
return E_POINTER;
}
return CreateSafeArray(m_pData, m_length, ppResults);
}
where m_pData points to the bytes of data and m_length is the number of bytes we have.
HRESULT CreateSafeArray(
BYTE *pData,
DWORD dataLength,
VARIANT *ppResults)
{
SAFEARRAYBOUND sab;
sab.cElements = dataLength;
sab.lLbound = 0;
SAFEARRAY *pSa = SafeArrayCreateEx(VT_UI1, 1, &sab, 0);
PVOID pvData;
HRESULT hr = SafeArrayAccessData(pSa, &pvData);
if (SUCCEEDED(hr))
{
::CopyMemory(pvData, pData, dataLength);
hr = ::SafeArrayUnaccessData(pSa);
}
if (SUCCEEDED(hr))
{
::VariantInit(ppResults);
(\*ppResults).parray = pSa;
(\*ppResults).vt = VT\_ARRAY | VT\_UI1;
}
return hr;
}
Hope this helps. Len Holgate www.jetbyte.com The right code, right now.