AnS1 написал(а):
Egal написал:
AnS1 написал(а):
массивы в COM не передаются. .
ну положим СОМ тут совсем непричем

в общем случае - например написав СОМ-объект на С++ - ничто не помешает тебе передать Array СОМ-объекту(SafeArray). Другое дело что АВАР "не понимает" этого.

Те же уши, вид сбоку. С точки зрения программиста SAFEARRAY - всего лишь еще одна структура со своим набором функций, принципиально не отличающаяся от рекордсета или своего объекта. В любом случае hResult=SafeArrayGetElement(my_array, index, &my_var) не настолько изящно как my_var=my_array[index]. Т.о., постулат остается прежним - в COM массивов нет.
Ну, это совсем не верно...
Цитата:
С точки зрения программиста SAFEARRAY - всего лишь еще одна структура
со своим набором данных, в т.ч. с указателем на массив. Этот указатель можно получить и работать с ним как с обычным массивом. Пример из МСДН:
Code:
Example
The following example sorts a safearray of one dimension that contains BSTRs by accessing the array elements directly. This approach is faster than using SafeArrayGetElement and SafeArrayPutElement.
long i, j, min;
BSTR bstrTemp;
BSTR HUGEP *pbstr;
HRESULT hr;
// Get a pointer to the elements of the array.
hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
if (FAILED(hr))
goto error;
// Selection sort.
for (i = 0; i < psa->rgsabound.cElements-1; i++)
{
min = i;
for (j = i+1; j < psa->rgsabound.cElements; j++)
{
if (wcscmp(pbstr[j], pbstr[min]) < 0)
min = j;
}
// Swap array[min] and array[i].
bstrTemp = pbstr[min];
pbstr[min] = pbstr[i];
pbstr[i] = bstrTemp;
}
SafeArrayUnaccessData(psa);
А предлагаемые системой функции просто позволяют контролировать данные, например, границы массива.
Так что всё-таки имеем проблемы САПа, а не COMа
