Ошибка при передачи массива используя Com
массив уникальными id и передать их в VARIANT'е.
Код функции ниже(см. комментарии).
VARIANT CParamCmd::getInventoryList()
{
long* idList;
VARIANT vaResult;
SAFEARRAYBOUND bound;
int i=0;
VariantInit(&vaResult);
//Работа с базой
XInventorySet inv_set(&theDatabase);
inv_set.Open();
inv_set.MoveFirst();
int nCount=inv_set.GetRecordCount();
if ( nCount> 0)
{
idList = new long[nCount];
bound.cElements=nCount;
bound.lLbound = 0;
//Заполняем масиив idList
while (!inv_set.IsEOF() )
{
idList=inv_set.m_ID;
inv_set.MoveNext();
i++;
}
//Создаю массив в VARIANTE'Е
vaResult.vt=VT_I4 | VT_ARRAY;
vaResult.parray=SafeArrayCreate(VT_I4,1,&bound);
void* pDest;
SafeArrayAccessData (vaResult.parray, &pDest);
memcpy(pDest,idList,sizeof(idList));
SafeArrayUnaccessData(vaResult.parray);
//И вот тут при выполнении выскакивает ошибка
delete [] idList;
}
return vaResult;
}
Где я ошибаюсь? почему при удалении динамического массива он выдает мне сообщение
Debug error? и нужно ли здесь вызывать SafeArrayDestroy? Если да то каким макаром мне передать массив в VARIANT'e.
Цитата:
Originally posted by avgousto
Проблема в следующем: необходимо заполнить
массив уникальными id и передать их в VARIANT'е.
Код функции ниже(см. комментарии).
VARIANT CParamCmd::getInventoryList()
{
long* idList;
VARIANT vaResult;
SAFEARRAYBOUND bound;
int i=0;
VariantInit(&vaResult);
//Работа с базой
XInventorySet inv_set(&theDatabase);
inv_set.Open();
inv_set.MoveFirst();
int nCount=inv_set.GetRecordCount();
if ( nCount> 0)
{
idList = new long[nCount];
bound.cElements=nCount;
bound.lLbound = 0;
//Заполняем масиив idList
while (!inv_set.IsEOF() )
{
idList=inv_set.m_ID;
inv_set.MoveNext();
i++;
}
//Создаю массив в VARIANTE'Е
vaResult.vt=VT_I4 | VT_ARRAY;
vaResult.parray=SafeArrayCreate(VT_I4,1,&bound);
void* pDest;
SafeArrayAccessData (vaResult.parray, &pDest);
memcpy(pDest,idList,sizeof(idList));
SafeArrayUnaccessData(vaResult.parray);
//И вот тут при выполнении выскакивает ошибка
delete [] idList;
}
return vaResult;
}
Где я ошибаюсь? почему при удалении динамического массива он выдает мне сообщение
Debug error? и нужно ли здесь вызывать SafeArrayDestroy? Если да то каким макаром мне передать массив в VARIANT'e.
Проблема в следующем: необходимо заполнить
массив уникальными id и передать их в VARIANT'е.
Код функции ниже(см. комментарии).
VARIANT CParamCmd::getInventoryList()
{
long* idList;
VARIANT vaResult;
SAFEARRAYBOUND bound;
int i=0;
VariantInit(&vaResult);
//Работа с базой
XInventorySet inv_set(&theDatabase);
inv_set.Open();
inv_set.MoveFirst();
int nCount=inv_set.GetRecordCount();
if ( nCount> 0)
{
idList = new long[nCount];
bound.cElements=nCount;
bound.lLbound = 0;
//Заполняем масиив idList
while (!inv_set.IsEOF() )
{
idList=inv_set.m_ID;
inv_set.MoveNext();
i++;
}
//Создаю массив в VARIANTE'Е
vaResult.vt=VT_I4 | VT_ARRAY;
vaResult.parray=SafeArrayCreate(VT_I4,1,&bound);
void* pDest;
SafeArrayAccessData (vaResult.parray, &pDest);
memcpy(pDest,idList,sizeof(idList));
SafeArrayUnaccessData(vaResult.parray);
//И вот тут при выполнении выскакивает ошибка
delete [] idList;
}
return vaResult;
}
Где я ошибаюсь? почему при удалении динамического массива он выдает мне сообщение
Debug error? и нужно ли здесь вызывать SafeArrayDestroy? Если да то каким макаром мне передать массив в VARIANT'e.
Особенно в код не вдавался, но советую использовать все-таки обертки COleSafeArray и _variant_t...
Цитата:
Originally posted by RelB
Особенно в код не вдавался, но советую использовать все-таки обертки COleSafeArray и _variant_t...
Особенно в код не вдавался, но советую использовать все-таки обертки COleSafeArray и _variant_t...
Спасибо за совет. Действительно помогло. Но остается один неясный вопрос... Нужно ли уничтожать в теле функции этот SafeArray (или он уничтожиться автоматически при выходе из функции, ведь он объявлен только в теле функции)
Заранее извеняюся за тупость если такова имеется- с этими VARIANT'ами работаю второй день.
Цитата:
Originally posted by avgousto
Спасибо за совет. Действительно помогло. Но остается один неясный вопрос... Нужно ли уничтожать в теле функции этот SafeArray (или он уничтожиться автоматически при выходе из функции, ведь он объявлен только в теле функции)
Заранее извеняюся за тупость если такова имеется- с этими VARIANT'ами работаю второй день.
Спасибо за совет. Действительно помогло. Но остается один неясный вопрос... Нужно ли уничтожать в теле функции этот SafeArray (или он уничтожиться автоматически при выходе из функции, ведь он объявлен только в теле функции)
Заранее извеняюся за тупость если такова имеется- с этими VARIANT'ами работаю второй день.
Я сам помню съел не мало когда возился с этими SafeArray-ами... По идее, если пользуешься обертками, то должно само все уничтожаться..