Доброго времени суток.
После перехода на 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
}