C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Помогите разобраться с OLE сервером.
МММ
Отправлено: 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. Спасибо за ответ.

Вернуться в Вопросы программирования в C++Builder