Создание ActiveX-объекта для вызова в LabVIEW

Создание приложений, библиотек, инсталляторов
Ответить
Аватара пользователя
Vitekkz88

Activity Silver Автор
expert
expert
Сообщения: 1100
Зарегистрирован: 21 янв 2014, 15:45
Награды: 3
Версия LabVIEW: 12,13,14
Откуда: Томск
Контактная информация:

Создание ActiveX-объекта для вызова в LabVIEW

Сообщение Vitekkz88 »

Коллеги, добрый день!
Есть приложение(опрос приёмо-передающих модулей), есть исходники, есть dll с функциями. Всё это сделано на C++. Возникла необходимость перетащить это всё в LabVIEW.
Вижу 2 пути:
1. Использовать вызвов dll-функций
2. Сделать из приложения ActiveX-объект и встроить его в LabVIEW.
Первый пункт хотелось бы избежать...всё очень сложно и муторно с функциями. Классы-абибасы...множественные наследования и т.д. Параметры функций - функции из другой библиотеки. Короче :suicide: Это всё переделывать я рехнусь просто.
Задумался на счет второго варианта. Может есть у кого опыт или советы на этот счет? Чет я в растерянности... Спасибо!
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Создание ActiveX-объекта для вызова в LabVIEW

Сообщение dadreamer »

Наверное, поздновато отвечаю и проект давно уж сделан :D По идее, ActiveX объект (*.ocx) — та же динамическая библиотека, только структура у неё чуть отлична от стандартных DLL. Обычно в большинстве IDE создаётся через мастер (менеджер) проекта. Например, вот статья, как сделать простейшую библиотеку в Visual C++: Создание собственных ActiveX элементов. Подобных мануалов в сети полным-полно. Однако я, честно говоря, для вашего случая не вижу большого смысла оформлять сторонние библиотеки как ActiveX, т.к. создаваемые объекты не взаимодействуют с GUI и не требуют интерактивного вмешательства. OLE удобен тем, что позволяет внедрять в приложения и Web-страницы элементы управления. У вас же опрос приёмо-передающих модулей, где вряд ли будут какие-то контролы для работы. Потому всё-таки предложил бы использовать вариант 1, но немного в другом ключе. Не переделывать оригинальные библиотеки от производителя, а сделать враппер с C++ на C, как обычно делается в таких случаях. Враппер будет неявно обращаться к методам и свойствам классов, для конечного юзера это будет не видно. Например, создаём во враппере экспортируемую функцию "NewEthernetDetector", в которой выделяем память под объект "EthernetDetector", вызываем конструктор объекта и назначаем пустому указателю этот созданный объект. Наружу возвращается сам указатель, т.е. адрес объекта в памяти. В :labview: , естественно, вызывается функция "NewEthernetDetector", возвращающая число U32/U64. То же самое делаем для деструктора объекта. Потом переходим к свойствам и методам. Можно завернуть не все, а только некоторые методы/свойства. Ну, и такой финт проделываем с каждым классом. Не забываем, что как правило вызовы свойств и методов C++ классов требуют первым параметром объект класса, это следует учитывать при написании враппера. В общем, получается не так затратно, как если бы пришлось переписывать чужую библиотеку с плюсов.

Кстати, если собираетесь использовать те библиотеки в :labview: x64, то можно вообще не писать никакой обёртки, а вызывать функции из C++ DLL как есть! На мой взгляд, у 64-битных IDE появился огромный плюс в этом плане: вместо кучи разных соглашений о вызове (stdcall, thiscall, cdecl, fastcall) используется всего одно, утверждённое Microsoft. Потому, среде, вызывающей 64-битную DLL, абсолютно без разницы, какое соглашение использовалось при компиляции. Коли так, можем взять имя функции - скорее всего, оно будет в декорированном виде - и вставить в CLFN, выставив, например, stdcall в настройках. Если функция декорирована (mangled), её не будет в выпадающем списке функций в CLFN. Получить список всех функций в DLL можно хоть в Dependency Walker, хоть в Lister'е (плагин Total Commander), хоть в CFF Explorer. Сначала вызываем конструктор класса, и т.о. получаем указатель на объект класса. Далее применяем необходимые методы и свойства класса. Для всех функций, являющихся свойствами/методами класса, передаём первым параметром указатель на объект этого класса (автоматом пишется в регистр RCX), а дальше остальные параметры согласно мануалу на API. Ну, и в конце работы программы вызываем деструктор, передавая ему тот же указатель на объект класса. В общем-то, всё довольно просто и, главное, работает (сам проверял на 64-битном LabVIEW и соответствующих DLL).
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Создание приложений»