Обработка SAFEARRAY, возвращенного с сервера C # - PullRequest
1 голос
/ 09 октября 2009

Мне нужно вернуть массив структур (классов) из библиотеки 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 КБ).

Есть идеи? Я действительно застрял на этом.

Ответы [ 2 ]

2 голосов
/ 12 октября 2009

Оказалось, что мне просто нужен "другой уровень косвенности". То есть указатель на указатель против простого указателя.

IMyRecords** pIMyRecords; 
HRESULT hr = SafeArrayAccessData(pMyRecordsSA, (void**)&pIMyRecords);

Это добилось цели.

0 голосов
/ 09 октября 2009

Взгляните на CComSafeArray , это может сэкономить вам время.

...