Мне нужно вернуть массив структур (классов) из библиотеки C # в неуправляемый клиент C ++. Это функция из библиотеки C #:
[ComVisible(true)]
[Serializable]
public sealed class RetrieverProxy : IRetrieverProxy
{
public IMyRecord[] RetrieveMyRecords(long[] ids)
{
IList<IMyRecord> result = new List<IMyRecord>();
for (int i = 0; i < ids.Count(); i++)
{
result.Add(new MyRecord()
{
// some test data
});
}
return result.ToArray();
}
}
MyRecord
сам содержит массив структур, которые также являются видимыми COM и содержат поле типа double и DateTime.
Я получаю следующую обертку от регазма:
inline SAFEARRAY * IRetrieverProxy::RetrieveMyRecords (SAFEARRAY * ids) {
SAFEARRAY * _result = 0;
HRESULT _hr = raw_RetrieveMyRecords(ids, &_result);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _result;
}
Из кода клиента я вызываю библиотеку следующим образом:
SAFEARRAY *pMyRecordsSA;
SAFEARRAY *pIds;
// omitting pIds initialization, because from the library I can see
// that they are ok
pMyRecordsSA = pIRetrieverProxy->RetrieveMyRecords(pIds);
У меня проблема в том, как получить результаты, которые теперь хранятся в pMyRecordsSA
. Я пробовал следующее, но я не работаю:
IMyRecordPtr pIMyRecords(__uuidof(MyRecord));
HRESULT hr = SafeArrayAccessData(pMyRecordsSA, (void**)&pIMyRecords);
но затем попытка использовать указатель pIMyRecords
приводит к нарушению доступа (hr
равно 0 КБ).
Есть идеи? Я действительно застрял на этом.