Работаю с 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 указывает на забитый мусором участок памяти). Как правильно сделать?
Здравствуйте, 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);
Здравствуйте, hanu, Вы писали:
H>Работаю с ADO, получаю записи из рекодсета. Несколько записей представлено в бинарном виде (массив байтов). И никак не получается этот массив получить в С++. Сначала проверял работу в Excel VBA
H>Dim abArray() As Byte
H>abArray = rec.fields("Info.Prod.Code").value;
H>и этот код работает. Пытаюсь сделать аналог в С++:
А почему, скажем, parray, а не pparray? Или pvarVal->parray?
H>не работает (собственно value.parray указывает на забитый мусором участок памяти). Как правильно сделать?