Передача массива как параметра в OLE2

oradev1
Дата: 29.05.2006 06:40:38
При работе с пакетом OLE2 нужно передать массив в качестве параметра. Так как напрямую через OLE2 это не проходит, пользуюсь ActuveX build-in. Однако все останавливается уже на CREATE_VAR. Внимательное прочтение хелпа ситуацию не прояснило. Не поделится ли кто работающим куском кода?
Кудрявцев Леонид
Дата: 29.05.2006 10:17:31
Массивы простых типов можно создавать через TO_VARIANT build-ins. К примеру:

  PROCEDURE PrintDataLine_Fast( nExcelRow pls_integer, nExcelColumn pls_integer, strs TStrs ) IS
    var OLEVAR;
    id pls_integer;
  BEGIN
    /* Set the cell values for range */
    SetMyRange2 ( 
    	nExcelRow, nExcelColumn, 
    	nExcelRow, nExcelColumn+strs.count-1
    	);
    var:=TO_VARIANT( strs );
    id:=GET_OLE_MEMBERID( myRange, 'Value' );
    SET_OLE( myRange, id, var );
    DESTROY_VARIANT( var );
  END PrintDataLine_Fast;
oradev1
Дата: 30.05.2006 11:02:31
Спасибо, но это не совсем то, что я хотел :(. Немного перефразирую вопрос.

a olevar;
bs OLE_SAFEARRAYBOUNDS;
...
bs(1).count:=2;
bs(1).lbound:=1;
a:=create_var(bs, VT_VARIANT);

И в этот момент create_var дает ошибку. Что не так?
Кудрявцев Леонид
Дата: 01.06.2006 20:35:37
Лично я вообще не уверен, что эти функции работаю :=)

К примеру:

DECLARE
TYPE TStrs is table of varchar2(10) index by binary_integer;
strs TStrs;
b olevar;
bs OLE_SAFEARRAYBOUNDS;
BEGIN
strs(0):='Test0';
strs(1):='Test1';
b := TO_VARIANT( strs );
Message( 'GET_VAR_DIMS='||GET_VAR_DIMS(b) );
GET_VAR_BOUNDS( b, bs );
Message( 'bs(1)='||bs(1).count||' bs(1)='||bs(1).lbound );
END;

Последняя строчка выдает какие-то совершенно левые числа. Т.ч. кроме как пользоваться TO_VARIANT, посоветовать нечего. Для TO_VARIANT так же можно задавать OLE тип с каким создавать элементы массива (очень полезно в ряде случаев).