Здравствуйте, 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>}