Проблема в классе работы с OPC сервером

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
Ильдар
Сообщения: 65
Зарегистрирован: 27 дек 2007, 12:38
Откуда: Ташкент, sigma avtomatika

Сообщение Ильдар » 12 май 2012, 10:49

Написал маленький класс для работы с виндеконтом без использования DEP_components
(вытащил из их большого примера деповцев).
Работает. Но есть проблема.
При тестировании обнаружилось, что при считывании данных через некоторое время (около получаса) приложение
вылетает в ошибку Access violation (считываю 1000 аналогов раз в секунду)

Я так понимаю, что переполняется какой то буфер, потому как время "вылетания программы"
меняется в зависимости от колличества считываемых в цикле элементов

Помогите пожалуйста разобраться в чем дело.
очень бы хотелось использовать этот класс.



// метод считывания элемента в моем классе

Код: Выделить всё

bool _fastcall humanOPC::ReadItem(String& NameItem, Variant& Value, WORD& Quality)
{
	// .....................		  

  __finally
  {
	delete[] pszItemID;
	delete[] pdwMaxAge;

	VariantClear(&ppvValues[0]); // ругается на эту строку !!!!!!!


	CoTaskMemFree(ppvValues);
	CoTaskMemFree(ppwQualities);
	CoTaskMemFree(ppftTimeStamps);
	CoTaskMemFree(ppErrors);

  }
  return res;
}


Вот ссылка на полный проект http://turbobit.net/7episi9hddzn.html
C уважением Ильдар Амирханов

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 16 май 2012, 12:45

Попробовал ваш проект - час работал без ошибок. Перезапустил контроллер - возникла ошибка как вы и говорите. Вам нужно учесть, что может быть ситуация, когда размер массива ppvValues равен нулю, то есть чтение opc элемента не удалось. Тогда вызывать VariantClear(&ppvValues[0]) нельзя.

Равиль
Сообщения: 58
Зарегистрирован: 08 фев 2005, 14:48

Сообщение Равиль » 16 май 2012, 12:49

Кроме VariantClear еще при отрицательном HRESULT метода Read не нужно вызывать функции CoTaskMemFree(ppvValues) и тд.

Ильдар
Сообщения: 65
Зарегистрирован: 27 дек 2007, 12:38
Откуда: Ташкент, sigma avtomatika

Сообщение Ильдар » 16 май 2012, 13:42

Спасибо. Действительно не учел. Сейчас все работает
C уважением Ильдар Амирханов