Александр, спасибо, но применить не смог :(
Массив содержит что-то типа VARIANT. Требуется вывести в палитру свойств сразу все элементы этого массива.
Попробовал так:
STDMETHODIMP CDynProp::GetElementStrings(
/* [in] */ DISPID dispID,
/* [in] */ IUnknown * pUnk,
/* [out] */ OPMLPOLESTR __RPC_FAR *pCaStringsOut,
/* [out] */ OPMDWORD __RPC_FAR *pCaCookiesOut)
{
long size;
size = 2;
pCaStringsOut->pElems = (LPOLESTR *)::CoTaskMemAlloc(sizeof(LPOLESTR) * size);
pCaCookiesOut->pElems = (DWORD *)::CoTaskMemAlloc(sizeof(DWORD) * size);
for (long i=0;i<size;i++)
pCaCookiesOut->pElems[i] = i;
pCaStringsOut->cElems = size;
pCaCookiesOut->cElems = size;
pCaStringsOut->pElems[0] = ::SysAllocString(L"Наименование"); /// !!!!
pCaStringsOut->pElems[1] = ::SysAllocString(L"Диаметр емкости"); /// !!!!
return S_OK;
}
STDMETHODIMP CDynProp::GetElementValue(
/* [in] */ DISPID dispID,
/* [in] */ IUnknown * pUnk,
/* [in] */ DWORD dwCookie,
/* [out] */ VARIANT * pVarOut)
{
if (pVarOut == NULL)
return E_POINTER;
::VariantInit (pVarOut) ;
switch (dwCookie)
{
case 0:
{
V_VT(pVarOut) = VT_BSTR ;
CString v(_T("Емкость на опорах")); /// !!!!
V_BSTR(pVarOut) = v.AllocSysString();
break;
}
case 1:
V_VT(pVarOut) = VT_R8;
V_R8(pVarOut) = 800; /// !!!!
break;
}
return (S_OK);
}
но текст "Емкость на опорах" не выводится.
Как я понял, IOPMPropertyExpander хоть и позволяет в пределах одного свойства выводить несколько подсвоств, но все эти подсвоства будут double.
Как вывести произвольное количество подсвоств разного типа? Или придется писать свой ActiveX control?