Проблема с передачей массива структур из COM в C#.
От: Klisang  
Дата: 29.06.10 11:04
Оценка:
Доброго времени суток.
После перехода на x64 возникла проблема с передачей параметров из COM в C#. На Win x86 все работало отлично, на Win x64 перестало. Тестили конкретно на Win 7 x64.
При получении данных из COM'a в C# приходит мусор.

Ниже небольшой тестовый пример.

// Описание функции в idl
[id(515), helpstring("method AnalyzeControllerApplicationFile")] HRESULT AnalyzeControllerApplicationFile([in, out] struct MFStruct* info);



//Описание структуры в которой хранятся передаваемые данные
[uuid(6D87AFA3-0255-47d6-A7FA-B4611D06C468)]
struct Attribute
{
    BSTR key;                // attribute's key (name)
    BSTR value;                // key data
};




//Структура с массивом структур
[uuid(6D87AFA3-0255-47e6-A7FA-B4611D06C257)]
struct MFStruct
{
    SAFEARRAY(struct Attribute) attributes;        // attributes array
};



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

    USES_CONVERSION;
    
    HRESULT hr = S_OK;

    //struct filling
    MFStruct* fileInfo = info;

    Attribute *pAttributesStruct = NULL;
    //create SAFEARRAY
    CComPtr<IRecordInfo> spRecAttr;
    
    hr = GetRecordInfoFromGuids(LIBID_SPIIPLUSCOM521Lib, 1, 0, 0, __uuidof(Attribute), &spRecAttr);
    
    fileInfo->attributes = SafeArrayCreateVectorEx(VT_RECORD, 0, 2, spRecAttr);
    
    hr = SafeArrayAccessData(fileInfo->attributes, (void**)&pAttributesStruct);

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

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

    return S_OK;
}



//С# функция
void GetFunction()
{
            MFStruct ff = new MFStruct();
            Ch.AnalyzeControllerApplicationFile(ref ff); // После вызова функции, структура ff содержит мусор в масисе attributes

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.