Re: Проблема с получением SAFEARRAY в Delphi
От: Алекс Россия http://wise-orm.com
Дата: 14.10.02 10:33
Оценка: 8 (1)
Здравствуйте DenisM, Вы писали:

хъ

DM>

DM>В Delphi же после импорта dll получаем, что функция возвращает переменную типа OleVariant

DM>проблема в том, что я не могу получить из этой переменной значения в массиве


Для начала нужно вызвать VarIsArray(). Затем VarArrayLock() для получения указателя на данные. Работаешь на здоровье, а потом вызываешь VarArrayUnlock()
Проблема с получением SAFEARRAY в Delphi
От: DenisM  
Дата: 14.10.02 10:21
Оценка:
Есть 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

проблема в том, что я не могу получить из этой переменной значения в массиве
Re[2]: Проблема с получением SAFEARRAY в Delphi
От: DenisM  
Дата: 15.10.02 02:18
Оценка:
Здравствуйте Алекс, Вы писали:

А>Для начала нужно вызвать 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 в описании структуры стоит первым, если поменять порядок полей, то вообще ни одно поле не инициализируется
Re[3]: Проблема с получением SAFEARRAY в Delphi
От: Алекс Россия http://wise-orm.com
Дата: 15.10.02 04:19
Оценка:
Здравствуйте 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 и не мучься!
Re[4]: Проблема с получением SAFEARRAY в Delphi
От: DenisM  
Дата: 15.10.02 05:04
Оценка:
Здравствуйте Алекс, Вы писали:


А>А если под 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 не работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.