МММ |
Отправлено: 09.01.2004, 07:55 |
|
Не зарегистрирован
|
Драйвер для связи с промышленным контроллером написан с применением технологии OLE Automation. 1999г.Производитель поставлял в комплекте .tlb файл и краткий help с примерами для VB. Свое приложение пишу на C++Builder. Установил этот .tlb, появился компонент, заголовочные файлы подключаются. Простые функции работают. Проблема возникла с функциями где используется класс TVariant. Проблема в следующем, что-бы добраться до данных контроллера нужно как-бы подняться по дереву.Chanel-Device- DateBlock. Первая функция работы с Chanel возвращает Handle на Device в виде класса TVariant. Он должен быть входным параметром у следующей функции но типа long int. Я преобразую путем Handle.lVal
Все компилиться, но при выполнении выдает ошибку Параметр задан не верно. В чем может быть проблема? |
|
** pasha |
Отправлено: 09.01.2004, 09:30 |
|
Не зарегистрирован
|
Покажите этот участок кода.
Вообще добираются до нужных свойств/методов у дерева
OLE с помощью OlePropertyGet()
типа:
Variant result,cur;
cur = Sh.OlePropertyGet("Cells",Row,Column);
result = cur.OlePropertyGet("Formula");
(см. пример http://www.cbuilder.ru/WinLesson/bles1_2.htm ) |
|
МММ |
Отправлено: 09.01.2004, 12:05 |
|
Не зарегистрирован
|
При установке .tlb уменя появился компонент EMCServer, перетащил на форму, подключились файлы с описанием интерфейса. Вот как там описаны эти функции:
long __fastcall GetChannels(TVariant* pvChannelHandles/*[in,out]*/,
TVariant* pvChannelNames/*[in,out]*/)
{
long plNumChannels;
OLECHECK(this->GetChannels(pvChannelHandles, pvChannelNames, (long*)&plNumChannels));
return plNumChannels;
}
long __fastcall GetDevices(long lChannelHandle/*[in]*/, TVariant* pvDeviceHandles/*[in,out]*/,
TVariant* pvDeviceNames/*[in,out]*/)
{
long plNumDevices;
OLECHECK(this->GetDevices(lChannelHandle, pvDeviceHandles, pvDeviceNames, (long*)&plNumDevices));
//Вот эта операция и вызывает ошибку
return plNumDevices;
}
Я пишу так:
TVariant ChannelHandles, ChannelNames, DeviceHandles, DeviceNames;
long NumChannels, NumDevices; //число каналов и девайсов
NumChannels = EMCServer1->GetChannels(&ChannelHandles, &ChannelNames);
//Тут все нормально, параметры все выходные. Каналов м.б. много, все их дескрипторы залетают в ChannelHandles.
NumDevices = EMCServer1->GetDevices(ChannelHandles.lVal, &DeviceHandles, &DeviceNames);
В моей реальной конфигурации драйвера канал всего один. Пробовал использовать массивы, тоже самое. Как я понимаю нужно из ChannelHandles корректно вытащить этот Handle. Спасибо за ответ.
|
|
|