Работа с массивами в Variant
От: hanu  
Дата: 15.05.08 05:57
Оценка:
Работаю с ADO, получаю записи из рекодсета. Несколько записей представлено в бинарном виде (массив байтов). И никак не получается этот массив получить в С++. Сначала проверял работу в Excel VBA

Dim abArray() As Byte
abArray = rec.fields("Info.Prod.Code").value;

и єтот код работает. Пытаюсь сделать аналог в С++:

long idx = 0;
value = rec->Fields->GetItem("Info.Prod.Code")->Value;
SAFEARRAY *res = value.parray;
hr = SafeArrayLock( res );
hr = SafeArrayGetElement( res, &idx, &q );
hr = SafeArrayUnlock( res );

не работает (собственно value.parray указывает на забитый мусором участок памяти). Как правильно сделать?
Re: Работа с массивами в Variant
От: Дед Пихто  
Дата: 15.05.08 07:57
Оценка:
Здравствуйте, hanu, Вы писали:

H>И никак не получается этот массив получить в С++.

H>long idx = 0;
H>value = rec->Fields->GetItem("Info.Prod.Code")->Value;
H>SAFEARRAY *res = value.parray;
H>hr = SafeArrayLock( res );
H>hr = SafeArrayGetElement( res, &idx, &q );
H>hr = SafeArrayUnlock( res );

H>не работает (собственно value.parray указывает на забитый мусором участок памяти). Как правильно сделать?


У меня работает примерно так (не ADO):


            // parse the parameters
            SAFEARRAY* pSA = rgvarg.parray;
            long lBound;
            long uBound;

            ::SafeArrayGetLBound(pSA, 1, &lBound);
            ::SafeArrayGetUBound(pSA, 1, &uBound);

            VARIANT theParam;
            VariantInit(&theParam);

            for (long i = 0; i <= (uBound - lBound); i++)
            {
                ::SafeArrayGetElement(pSA, &i, &theParam);

                switch(theParam.vt)
                {
                case VT_BSTR:
                    bstrData = theParam.bstrVal;
                    break;
                case VT_EMPTY:
                                        // присвой свой тип здесь
                    break;
                case VT_NULL:
                    break;
                case VT_I2:
                    break;
                case VT_I4:
                    break;
                case VT_R4:
                    break;
                case VT_R8:
                    break;
                case VT_DATE:
                    break;
                case VT_DISPATCH:
                    break;
                case VT_ERROR:
                    break;
                case VT_BOOL:
                    break;
                case VT_VARIANT:
                    break;
                case VT_UNKNOWN:
                    break;
                case VT_DECIMAL:
                    break;
                case VT_I1:
                    break;
                case VT_UI1:
                    break;
                case VT_UI2:
                    break;
                case VT_UI4:
                    break;
                case VT_I8:
                    break;
                case VT_UI8:
                    break;
                case VT_INT:
                    break;
                case VT_UINT:
                    break;
                case VT_VOID:
                    break;
                case VT_HRESULT:
                    break;
                case VT_SAFEARRAY:
                    break;
                case VT_LPSTR:
                    break;
                case VT_LPWSTR:
                    break;
                case VT_INT_PTR:
                    break;
                case VT_UINT_PTR:
                    break;
                case VT_BYREF:
                    break;
                default: 
                    break;
                }
                        }

            ::SafeArrayDestroy(pSA);
Re[2]: Работа с массивами в Variant
От: hanu  
Дата: 15.05.08 08:05
Оценка:
Здравствуйте, Дед Пихто, Вы писали:


ДП>
ДП>            // parse the parameters
ДП>            SAFEARRAY* pSA = rgvarg.parray;
ДП>            long lBound;
ДП>            long uBound;

ДП>            ::SafeArrayGetLBound(pSA, 1, &lBound);
ДП>            ::SafeArrayGetUBound(pSA, 1, &uBound);

ДП>

А rgvarg это тоже VARIANT?
Re: Работа с массивами в Variant
От: Vi2 Удмуртия http://www.adem.ru
Дата: 15.05.08 08:09
Оценка:
Здравствуйте, hanu, Вы писали:

H>Работаю с ADO, получаю записи из рекодсета. Несколько записей представлено в бинарном виде (массив байтов). И никак не получается этот массив получить в С++. Сначала проверял работу в Excel VBA

H>Dim abArray() As Byte
H>abArray = rec.fields("Info.Prod.Code").value;

H>и этот код работает. Пытаюсь сделать аналог в С++:
H>value = rec->Fields->GetItem("Info.Prod.Code")->Value;

Вот здесь в правой части получается С++-ный класс с деструктором. Вполне возможно, что он срабатывает.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Работа с массивами в Variant
От: Дед Пихто  
Дата: 15.05.08 09:45
Оценка:
Здравствуйте, hanu, Вы писали:
H>А rgvarg это тоже VARIANT?

Да.

VARIANTARG rgvarg;


где VARIANTARG


typedef VARIANT VARIANTARG;
Re: Работа с массивами в Variant
От: George Seryakov Россия  
Дата: 18.05.08 15:34
Оценка:
Здравствуйте, hanu, Вы писали:

H>long idx = 0;

H>value = rec->Fields->GetItem("Info.Prod.Code")->Value;
H>SAFEARRAY *res = value.parray;

А почему, скажем, parray, а не pparray? Или pvarVal->parray?

H>не работает (собственно value.parray указывает на забитый мусором участок памяти). Как правильно сделать?


Аккуратно проанализировать поле типа vt.
GS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.