Здравствуйте, Plutonia Experiment, Вы писали:
PE>Здравствуйте, amOK, Вы писали:
OK>>Дык собственно в С++ это будет в виде SAFEARRAY ** pArray. В том то и весь затык тут, что не понятно, как его правильно сделать, чтобы и С++ и С# поняли!
PE>Сам сейфаррей не знаешь, чем заполнить ?
Тип того. Короче такой код:
CComObject<CTTHelperClientItem> *pClient1 = NULL;
hr = CComObject<CTTHelperClientItem>::CreateInstance(&pClient1);
if (FAILED(hr))
return hr;
CComObject<CTTHelperClientItem> *pClient2 = NULL;
hr = CComObject<CTTHelperClientItem>::CreateInstance(&pClient2);
if (FAILED(hr))
return hr;
SAFEARRAY * sa;
sa = SafeArrayCreateVectorEx(VT_DISPATCH, 1, 2, (void**)&__uuidof(ICTTHelperItem));
long index = 1;
VARIANT var;
V_VT(&var) = VT_DISPATCH;
pClient1->QueryInterface(IID_ICTTHelperItem, (void **)&V_DISPATCH(&var));
SafeArrayPutElement(sa, &index, &var);
index ++;
pClient2->QueryInterface(IID_ICTTHelperItem, (void **)&V_DISPATCH(&var));
SafeArrayPutElement(sa, &index, &var);
ICTTHelperClientItem наследуется от ICTTHelperItem.
Вот на первом вызове SafeArrayPutElement летит исключение. Если поставить в SafeArrayCreateVectorEx VT_VARIANT, то тут всё нормально, но в С# не хочет приводится к нужному интерфейсу.