Re: Проблема с передачей массива структур из COM в C#.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 29.06.10 13:31
Оценка: 3 (1)
Здравствуйте, Klisang, Вы писали:

Внутри.

K>// COM Функция генерящаяя данные для C#
K>STDMETHODIMP CChannel::AnalyzeControllerApplicationFile(MFStruct* info)
K>{    

K>    USES_CONVERSION;
    
K>    HRESULT hr = S_OK;

K>    //struct filling
K>    MFStruct* fileInfo = info;

K>    Attribute *pAttributesStruct = NULL;
K>    //create SAFEARRAY
K>    CComPtr<IRecordInfo> spRecAttr;
    
K>    hr = GetRecordInfoFromGuids(LIBID_SPIIPLUSCOM521Lib, 1, 0, 0, __uuidof(Attribute), &spRecAttr);
    
Vi2 - прежде чем писать в fileInfo, нужно сначала освободить предыдущее значение в этой структуре,
Vi2 - поскольку параметр является входным и может иметь реальные значение в полях структуры, отличные от тривиальных.

K>    fileInfo->attributes = SafeArrayCreateVectorEx(VT_RECORD, 0, 2, spRecAttr);
    
K>    hr = SafeArrayAccessData(fileInfo->attributes, (void**)&pAttributesStruct);

K>        //set elements values
K>    for(UINT i = 0; i <  2; i++)
K>    {
//        pAttributesStruct[i].key =     CComBSTR("attrib k");
//        pAttributesStruct[i].value =    CComBSTR("attrib v");

Vi2 - поскольку CComBSTR разрушает свой адрес после деструктора, то нужно делать копию (.Copy()) или забирать собственность (.Detach()):

        pAttributesStruct[i].key =     CComBSTR("attrib k").Detach();
        pAttributesStruct[i].value =    CComBSTR("attrib v").Detach();
K>    }

K>    //free access to SAFEARRAY
K>    hr = SafeArrayUnaccessData(fileInfo->attributes);

K>    return S_OK;
K>}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.