Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка при передачи массива используя Com

15K
11 апреля 2006 года
avgousto
7 / / 11.04.2006
Проблема в следующем: необходимо заполнить
массив уникальными 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.
395
11 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
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.


Особенно в код не вдавался, но советую использовать все-таки обертки COleSafeArray и _variant_t...

15K
12 апреля 2006 года
avgousto
7 / / 11.04.2006
Цитата:
Originally posted by RelB
Особенно в код не вдавался, но советую использовать все-таки обертки COleSafeArray и _variant_t...



Спасибо за совет. Действительно помогло. Но остается один неясный вопрос... Нужно ли уничтожать в теле функции этот SafeArray (или он уничтожиться автоматически при выходе из функции, ведь он объявлен только в теле функции)

Заранее извеняюся за тупость если такова имеется- с этими VARIANT'ами работаю второй день.

395
12 апреля 2006 года
RelB
367 / / 09.11.2002
Цитата:
Originally posted by avgousto
Спасибо за совет. Действительно помогло. Но остается один неясный вопрос... Нужно ли уничтожать в теле функции этот SafeArray (или он уничтожиться автоматически при выходе из функции, ведь он объявлен только в теле функции)

Заранее извеняюся за тупость если такова имеется- с этими VARIANT'ами работаю второй день.

Я сам помню съел не мало когда возился с этими SafeArray-ами... По идее, если пользуешься обертками, то должно само все уничтожаться..

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог