хъ
DM> DM>В Delphi же после импорта dll получаем, что функция возвращает переменную типа OleVariant
DM>проблема в том, что я не могу получить из этой переменной значения в массиве
Для начала нужно вызвать VarIsArray(). Затем VarArrayLock() для получения указателя на данные. Работаешь на здоровье, а потом вызываешь VarArrayUnlock()
Есть COM-объект, метод которого возвращает массив структур.
Возвращает его как переменную типа VARIANT
в VC поступаем следующим образом:
VARIANT * propList;
hr = myCOMObj->GetPropList( &propList );
MY_STRUCTURE *pMetaKeys;
SafeArrayAccessData( propList.parray, reinterpret_cast<void**>(&pMetaKeys) );
for ( int i = 0; i < propList.parray->rgsabound->cElements; i++ ) {
//здесь обращаемсяк элементам массива и все хорошо
a = pMetaKeys[ i ].pfName; //и т.д.
}
SafeArrayUnaccessData( propList.parray );
В Delphi же после импорта dll получаем, что функция возвращает переменную типа OleVariant
проблема в том, что я не могу получить из этой переменной значения в массиве
Здравствуйте Алекс, Вы писали:
А>Для начала нужно вызвать VarIsArray(). Затем VarArrayLock() для получения указателя на данные. Работаешь на здоровье, а потом вызываешь VarArrayUnlock()
Я пробовал так, еще пробовал вот так:
if VarIsArray( props ) then begin
va := TVariantArg(props);
count := va.parray.rgsabound[ 0 ].cElements;
PropsGrid.RowCount := count + 1;
for i := 0 to count - 1 do begin
j := i;
SafeArrayGetElement( va.parray, j, temp );
PropsGrid.Cells[ 0 , i + 1 ] := temp.pfName;
case temp.pfType of
2: PropsGrid.Cells[ 1 , i + 1 ] := 'Число';
3: PropsGrid.Cells[ 1 , i + 1 ] := 'Дата';
else
PropsGrid.Cells[ 1 , i + 1 ] := 'Строка';
end;
end;
моя структура состоит из 3 полей: pfName, pfValue, pfType
так вот значение возвращается только в поле pfName, остальные пустые
причем, pfName в описании структуры стоит первым, если поменять порядок полей, то вообще ни одно поле не инициализируется
Здравствуйте DenisM, Вы писали:
DM>Здравствуйте Алекс, Вы писали:
А>>Для начала нужно вызвать VarIsArray(). Затем VarArrayLock() для получения указателя на данные. Работаешь на здоровье, а потом вызываешь VarArrayUnlock()
DM>Я пробовал так, еще пробовал вот так:
DM>
DM> if VarIsArray( props ) then begin
DM> va := TVariantArg(props);
DM> count := va.parray.rgsabound[ 0 ].cElements;
DM> PropsGrid.RowCount := count + 1;
DM> for i := 0 to count - 1 do begin
DM> j := i;
DM> SafeArrayGetElement( va.parray, j, temp );
DM> PropsGrid.Cells[ 0 , i + 1 ] := temp.pfName;
DM> case temp.pfType of
DM> 2: PropsGrid.Cells[ 1 , i + 1 ] := 'Число';
DM> 3: PropsGrid.Cells[ 1 , i + 1 ] := 'Дата';
DM> else
DM> PropsGrid.Cells[ 1 , i + 1 ] := 'Строка';
DM> end;
DM> end;
DM>
DM>моя структура состоит из 3 полей: pfName, pfValue, pfType DM>так вот значение возвращается только в поле pfName, остальные пустые
DM>причем, pfName в описании структуры стоит первым, если поменять порядок полей, то вообще ни одно поле не инициализируется
А если под Inspact'ом все посмотреть?
Приведи код как ты его заполняешь.
Че такое TVariantArg() — у меня 5-ый дельфа.
Вместо
count := va.parray.rgsabound[ 0 ].cElements;
лучше пользоваться SafeArrayGetUBound(),SafeArrayGetLBound
И вообще я подумал, что раз уж у тебя в одной структуре умещаются и дата, и строки, число — возьми стандартный VARIANT и не мучься!
А>А если под Inspact'ом все посмотреть? А>Приведи код как ты его заполняешь.
заполняется в COM-объекте, написанном на VC А>Че такое TVariantArg() — у меня 5-ый дельфа.
TVariantArg — это и есть стандартный VARIANT, описан в Ole2.pas А>Вместо А>
А>count := va.parray.rgsabound[ 0 ].cElements;
А>
А>лучше пользоваться SafeArrayGetUBound(),SafeArrayGetLBound
так в структуре tagVARIANT хранится информация о количестве элементов массива
А>И вообще я подумал, что раз уж у тебя в одной структуре умещаются и дата, и строки, число — возьми стандартный VARIANT и не мучься!
в структуре хранится имя (тип BSTR), тип (тип long) и значение (тип VARIANT)
Описанный способ работает в клиентах, написанных на VC 6 и BCBuilder 6, а в Delphi не работает