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