Коллеги, добрый день!
Есть приложение(опрос приёмо-передающих модулей), есть исходники, есть dll с функциями. Всё это сделано на C++. Возникла необходимость перетащить это всё в LabVIEW.
Вижу 2 пути:
1. Использовать вызвов dll-функций
2. Сделать из приложения ActiveX-объект и встроить его в LabVIEW.
Первый пункт хотелось бы избежать...всё очень сложно и муторно с функциями. Классы-абибасы...множественные наследования и т.д. Параметры функций - функции из другой библиотеки. Короче Это всё переделывать я рехнусь просто.
Задумался на счет второго варианта. Может есть у кого опыт или советы на этот счет? Чет я в растерянности... Спасибо!
Создание ActiveX-объекта для вызова в LabVIEW
-
Vitekkz88
- expert
- Сообщения: 1100
- Зарегистрирован: 21 янв 2014, 15:45
- Награды: 3
- Версия LabVIEW: 12,13,14
- Откуда: Томск
- Контактная информация:
Создание ActiveX-объекта для вызова в LabVIEW
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
-А. И. Солженицын
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Создание ActiveX-объекта для вызова в LabVIEW
Наверное, поздновато отвечаю и проект давно уж сделан По идее, ActiveX объект (*.ocx) — та же динамическая библиотека, только структура у неё чуть отлична от стандартных DLL. Обычно в большинстве IDE создаётся через мастер (менеджер) проекта. Например, вот статья, как сделать простейшую библиотеку в Visual C++: Создание собственных ActiveX элементов. Подобных мануалов в сети полным-полно. Однако я, честно говоря, для вашего случая не вижу большого смысла оформлять сторонние библиотеки как ActiveX, т.к. создаваемые объекты не взаимодействуют с GUI и не требуют интерактивного вмешательства. OLE удобен тем, что позволяет внедрять в приложения и Web-страницы элементы управления. У вас же опрос приёмо-передающих модулей, где вряд ли будут какие-то контролы для работы. Потому всё-таки предложил бы использовать вариант 1, но немного в другом ключе. Не переделывать оригинальные библиотеки от производителя, а сделать враппер с C++ на C, как обычно делается в таких случаях. Враппер будет неявно обращаться к методам и свойствам классов, для конечного юзера это будет не видно. Например, создаём во враппере экспортируемую функцию "NewEthernetDetector", в которой выделяем память под объект "EthernetDetector", вызываем конструктор объекта и назначаем пустому указателю этот созданный объект. Наружу возвращается сам указатель, т.е. адрес объекта в памяти. В , естественно, вызывается функция "NewEthernetDetector", возвращающая число U32/U64. То же самое делаем для деструктора объекта. Потом переходим к свойствам и методам. Можно завернуть не все, а только некоторые методы/свойства. Ну, и такой финт проделываем с каждым классом. Не забываем, что как правило вызовы свойств и методов C++ классов требуют первым параметром объект класса, это следует учитывать при написании враппера. В общем, получается не так затратно, как если бы пришлось переписывать чужую библиотеку с плюсов.
Кстати, если собираетесь использовать те библиотеки в 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).
Кстати, если собираетесь использовать те библиотеки в 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).
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 3 Ответы
- 807 Просмотры
-
Последнее сообщение Select
-
- 9 Ответы
- 814 Просмотры
-
Последнее сообщение ujin1
-
- 10 Ответы
- 2373 Просмотры
-
Последнее сообщение PAG
-
- 3 Ответы
- 2074 Просмотры
-
Последнее сообщение PozhiloyGoblin
-
- 0 Ответы
- 344 Просмотры
-
Последнее сообщение maxim_MA