Создание DLL в LabVIEW

Создание приложений, библиотек, инсталляторов
Аватара пользователя
duke-kta
beginner
beginner
Сообщения: 16
Зарегистрирован: 28 июн 2017, 13:44
Версия LabVIEW: 13
Откуда: НиНо
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение duke-kta »

dadreamer, скорее всего так и придётся делать.
Странно, что при вызове через Call Library Function Node скомпилированного DLL автоматом не проставляются параметры - приходится врукопашную добавлять. Может, я где-то галочку не поставил или так и должно быть?
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

duke-kta писал(а):Странно, что при вызове через Call Library Function Node скомпилированного DLL автоматом не проставляются параметры - приходится врукопашную добавлять. Может, я где-то галочку не поставил или так и должно быть?
Должно. Откуда программе знать, какие у ваших функций параметры? Они же не экспортируются для cdecl и stdcall соглашений.

А в чём смысл вызывать из :labview: скомпилированную в нём же библиотеку? Не проще ли юзать SubVI?
Аватара пользователя
duke-kta
beginner
beginner
Сообщения: 16
Зарегистрирован: 28 июн 2017, 13:44
Версия LabVIEW: 13
Откуда: НиНо
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение duke-kta »

Откуда программе знать, какие у ваших функций параметры?
На другом, почему-то, знает, но это уже мелочи...
А в чём смысл вызывать из :labview: скомпилированную в нём же библиотеку? Не проще ли юзать SubVI?
ну, тут сложный момент... Метрология, однако )))
Если кратко, то для аттестации стенда, как измерительного прибора.
Суть, DLL-ки не меняются. В них измерительные функции и они аттестованы вместе со стендом.
Морда программы может меняться как угодно и эти изменения не касаются аттестации, если мы в ней просто вызываем эти самые аттестованные функции.

Кстати, переустановил LV13 (не удаляя, даже) - всё заработало. Причём, в LV15 компиляция тоже осталась.
Здесь http://digital.ni.com/public.nsf/allkb/ ... E800728A7B написано, что LV14 уже правит все эти беды.
Так что, если у кого-то пропадает компиляция DLL в какой-либо версии LV, надо переставить эту версию поверх старой.
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

duke-kta писал(а):На другом, почему-то, знает, но это уже мелочи...
На другом :labview: ? Единственное место, где прописаны прототипы функций - это заголовочный файл *.h, который создаётся при компиляции DLL. Чтобы :labview: создал :vi: с уже настроенным блоком CLFN, нужно запустить Мастер импорта (Tools -> Import -> Shared Library) и указать оба файла: *.dll и *.h. Уверены, что не пользовались Мастером и не прописывали ничего вручную?..
duke-kta писал(а):Суть, DLL-ки не меняются. В них измерительные функции и они аттестованы вместе со стендом.
А почему нельзя аттестовать :vi: ? У DLL есть какое-то принципиальное преимущество в этом плане?

Я в общем-то вот почему спрашиваю:
[b][color=#FF9900]dadreamer[/color][/b] писал(а):Но вообще, по идее, вызывать DLL, созданную в :labview: , из самого :labview: - это большое извращение, т.к. происходит двойная конвертация параметров при передаче на стек и отсюда возрастают накладные расходы на вызов функции. Создавать DLL в :labview: имеет смысл, только когда нужно вызывать её из другой IDE (C/C++, Delphi, VB). А в самом :labview: гораздо проще и удобнее создавать SubVI, в том числе и при необходимости подключения разных подпрограмм (плагинов).
Причём, это не мои выдумки. Специалисты на форумах ni.com давно об этом пишут.
Аватара пользователя
duke-kta
beginner
beginner
Сообщения: 16
Зарегистрирован: 28 июн 2017, 13:44
Версия LabVIEW: 13
Откуда: НиНо
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение duke-kta »

dadreamer,
не пользовались Мастером и не прописывали ничего вручную?
На другом компе - не знаю что там стояло по умолчанию, но я ничего не прописывал. Возможно, там настроено, искать в той же папке или ещё что - но это ладно, я уже нашёл как сделать и твой совет помог.
А почему нельзя аттестовать :vi:
Типа, суть в разделении измериловки и пользовательского интерфейса.
Ну, где-то я с ним согласен - VI вызывать можно только из LV, а DLL откуда угодно.
То есть, можно эти DLL-ки проверить из любой другой программы - так и аттестовать...
Ну, там мутно всё в этой метрологии.
Ну, хотят так - нате вам так!
Но вообще, по идее, вызывать DLL, созданную в :labview: , из самого :labview: - это большое извращение
Абсолютно согласен! Но!
Есть у нас "идейный генератор" один, которому не объяснишь, что разницы никакой, почти, а геморроя больше.
И он непосредственно связан с заказчиком...
Аватара пользователя
Vitekkz88

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

Re: Создание DLL в LabVIEW

Сообщение Vitekkz88 »

duke-kta, ну дк Ваш идейный генератор смотрит наперёд в плане аттестации именно .dll. Наделать и аттестовать SubVI не проблема, но! завтра LabVIEW-шинки разбегутся по другим темам и направлениям, а найти замену будет в десятки раз сложнее, нежели программиста С/С++. Через 2-3 года политика партии поменяется, захочется перейти на рельсы C#, например. Начнут запиливать новый проект и хоба, а функции то в SubVI и другой библиотеки аттестованных функций нет. Сядут в калошу и контора попадёт на бабки папки, чтоб опять же запилить уже нормальную dll-ку с необходимой функциональностью. Ну а пока есть LV со своими сильными сторонами - её и используют, но не уповают по всей видимости.
dadreamer, а почему так происходит? Двойная конвертация параметров и всё такое...я чет :dntknw: Подозреваю, что при создании dll LabVIEW как-то по хитрому данные заворачивает, да?
Вроде как в классике такого нету(вызываем C++/С# dll в VisualStudio на этих же языках)... :think:
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

Vitekkz88 писал(а):dadreamer, а почему так происходит? Двойная конвертация параметров и всё такое...я чет :dntknw:
Да тут на самом деле всё просто. Что exe, что dll, скомпиленная в :labview: , суть загрузчик + llb с ВИайками внутри. Когда вызываем какую-нибудь библиотеку из :labview: через CLFN, :labview: конвертирует типы данных в C-нотацию для передачи в универсальную обёртку, вызывающую конечную библиотеку (ExtFuncWrapper). Параметры кладутся на стек, вызывается ExtFuncWrapper, загружается библиотека, и либо линкуется к текущему процессу (если написана в той же версии :labview: ), либо подгружает свой LVRT Engine и линкуется к нему. Параметры подбираются со стека, конвертируются в :labview: -нотацию и передаются в функции (SubVI). Так что получается цепочка " :labview: -> C -> :labview: " в одну сторону, так же и обратно. Очевидно, что страдает производительность, особенно в случае использования нескольких lvrt в одном процессе, а также при первом вызове библиотеки, когда происходит lazy-загрузка в память.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение CCCP33 »

решил поиграться с dll, напишу свои вопросы в этот сабж
duke-kta писал(а): 27 ноя 2017, 11:47 dadreamer, скорее всего так и придётся делать.
Странно, что при вызове через Call Library Function Node скомпилированного DLL автоматом не проставляются параметры - приходится врукопашную добавлять. Может, я где-то галочку не поставил или так и должно быть?
1)У меня также. Стоит 2 :labview:: 2011 32bit и 2015 64bit. Когда создаю dll в :labview: 2011 - при загрузке через CLFN, подтягиваются входы-выходы. На :labview: 2015 при аналогичных действиях - не подтягиваются. Однако если использовать мастер создания обертки - все нормально. Вопрос: в чем причина? как лечить? перустанавливать на голую? (хотелось бы оставить :labview: 2011)
2) dll не совместимы друг с другом ни в какую сторону. Если неприязнь :labview: 2011 к dll, созданной в 2015, можно понять, то почему обратное также истинно?
3) Если кто-то захочет вызвать мою dll в другой среде - как ему узнать какую runtime ставить?
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

CCCP33 писал(а): 01 фев 2023, 20:491)У меня также. Стоит 2 :labview:: 2011 32bit и 2015 64bit. Когда создаю dll в :labview: 2011 - при загрузке через CLFN, подтягиваются входы-выходы. На :labview: 2015 при аналогичных действиях - не подтягиваются. Однако если использовать мастер создания обертки - все нормально. Вопрос: в чем причина? как лечить? перустанавливать на голую? (хотелось бы оставить :labview: 2011)
Вы так же, как и duke-kta, компилируете DLL в :labview: и потом из него же их вызываете?
CCCP33 писал(а): 01 фев 2023, 20:492) dll не совместимы друг с другом ни в какую сторону. Если неприязнь :labview: 2011 к dll, созданной в 2015, можно понять, то почему обратное также истинно?
Вероятнее всего, из-за разных разрядностей :labview: и DLL (32/64 бита).
dadreamer писал(а): 27 янв 2020, 21:01 Если :labview: 32 бита, то и все загружаемые в него DLL'ки должны быть 32 бита. Других вариантов не дано, так работает Windows, да и в других системах, насколько я знаю, это справедливо.
Но если вдруг нет, то ещё одна причина - не может найти lvrt подходящей версии. Чтобы библиотека удачно загрузилась в какую-то IDE, надо установить Run-Time Engine соответствующей версии. Кстати, начиная с LV 2017 в параметрах билда есть опция "Allow future versions of the LabVIEW Runtime to run this application", активирующая обратную совместимость ран-таймов версий >=2017.
CCCP33 писал(а): 01 фев 2023, 20:493) Если кто-то захочет вызвать мою dll в другой среде - как ему узнать какую runtime ставить?
Нужно ему об этом сообщить :) Либо ему придётся копаться в недрах DLL каким-то редактором ресурсов. Или же можно экспортировать функцию, возвращающую версию RTE (Application.Version).
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение CCCP33 »

dadreamer писал(а): 02 фев 2023, 08:51 Вы так же, как и duke-kta, компилируете DLL в :labview: и потом из него же их вызываете?
Верно. Да, как сказано выше, ситуация абсурдна, но все же интересно знать причину.
dadreamer писал(а): 02 фев 2023, 08:51 Вероятнее всего, из-за разных разрядностей :labview: и DLL (32/64 бита).
dadreamer писал(а): 27 янв 2020, 21:01 Если :labview: 32 бита, то и все загружаемые в него DLL'ки должны быть 32 бита. Других вариантов не дано, так работает Windows, да и в других системах, насколько я знаю, это справедливо.
Утро вечера мудренее. Остается добавить, что и для 64-бит данное утверждение справедливо. Сам :labview: выдает сообщение:
LV error.png
LV error.png (3.84 КБ) 870 просмотров
Всегда считал, что существует односторонняя совместимость 32b приложений на 64b системах. Век живи - век учись... :think:
dadreamer писал(а): 27 янв 2020, 21:01Кстати, начиная с LV 2017 в параметрах билда есть опция "Allow future versions of the LabVIEW Runtime to run this application", активирующая обратную совместимость ран-таймов версий >=2017.
т.е. для запуска dll/exe начиная с LV 2017 необязательно ставить именно ту версию рантайма, в которой он создан? Например, dll/exe, созданный в LV2017, запустится при установленном runtime 2021?
P.S. в LV2015 обратил внимание на такую опцию:
LV2015 dll build option.png
Это не оно ли?
dadreamer писал(а): 27 янв 2020, 21:01Нужно ему об этом сообщить :) Либо ему придётся копаться в недрах DLL каким-то редактором ресурсов. Или же можно экспортировать функцию, возвращающую версию RTE (Application.Version).
Пардон. В каком виде экспортировать?
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

CCCP33 писал(а): 02 фев 2023, 09:46Верно. Да, как сказано выше, ситуация абсурдна, но все же интересно знать причину.
К сожалению, не могу здесь помочь, нужны эксперименты на разных версиях :labview: . Ни разу не приходилось сталкиваться с задачей подключения подобных библиотек к :labview: . У меня на 2021 версии ничего не подхватывается. Да и не видел никогда, чтобы в CLFN параметры автоматом создавались. Если доберусь до 2011, посмотрю.
CCCP33 писал(а): 02 фев 2023, 09:46Всегда считал, что существует односторонняя совместимость 32b приложений на 64b системах.
Есть совместимость для 32-битных экзешников на 64-битной ОС. Это осуществляется через прослойку WOW64, играющую роль виртуальной машины: https://ru.wikipedia.org/wiki/WOW64 Аналогичная штука была и на 32-битных ОС для запуска 16-битных приложений. Но загрузка DLL одной разрядности в память процесса с другой разрядностью - это маленько другое. Размер указателя разный, инструкции для CPU отличаются, лимиты адресуемой памяти разные... Без какого-либо посредника наподобие COM+ или thunking dll скрестить ужа с ежом не получится. Проще перекомпилировать под другую платформу.
CCCP33 писал(а): 02 фев 2023, 09:46т.е. для запуска dll/exe начиная с LV 2017 необязательно ставить именно ту версию рантайма, в которой он создан? Например, dll/exe, созданный в LV2017, запустится при установленном runtime 2021?
Запустится, если разработчик не убрал ту галочку при сборке проекта. По умолчанию она установлена.
CCCP33 писал(а): 02 фев 2023, 09:46P.S. в LV2015 обратил внимание на такую опцию: LV2015 dll build option.png Это не оно ли?
Вот тут мне пришлось немного залезть в хэлп, ибо никогда этим не пользовался. Этот переключатель влияет на вид имён функций и параметров при сборке и на экспорт кластера error in/out: https://www.ni.com/docs/en-US/bundle/la ... _page.html
CCCP33 писал(а): 02 фев 2023, 09:46Пардон. В каком виде экспортировать?
Точно так же, как экспортируются остальные :vi: :
2023-02-02_18-18-50.jpg
Хотя, я вот сейчас подумал: это может не сработать. DLL при загрузке в память сразу запросит LVRT, не дав ничего вызвать.
CCCP33
beginner
beginner
Сообщения: 48
Зарегистрирован: 06 май 2014, 10:30
Версия LabVIEW: 2011, 2015
Откуда: Vldr
Благодарил (а): 1 раз
Контактная информация:

Re: Создание DLL в LabVIEW

Сообщение CCCP33 »

dadreamer писал(а): 02 фев 2023, 16:23 Хотя, я вот сейчас подумал: это может не сработать. DLL при загрузке в память сразу запросит LVRT, не дав ничего вызвать.
Вот и у меня этот совет вызвал когнитивный диссонанс. Это как оставить теще ключ от квартиры в этой же квартире :D
dadreamer писал(а): 02 фев 2023, 16:23 Есть совместимость для 32-битных экзешников на 64-битной ОС. Это осуществляется через прослойку WOW64, играющую роль виртуальной машины: https://ru.wikipedia.org/wiki/WOW64 Аналогичная штука была и на 32-битных ОС для запуска 16-битных приложений. Но загрузка DLL одной разрядности в память процесса с другой разрядностью - это маленько другое. Размер указателя разный, инструкции для CPU отличаются, лимиты адресуемой памяти разные... Без какого-либо посредника наподобие COM+ или thunking dll скрестить ужа с ежом не получится. Проще перекомпилировать под другую платформу.
Запустится, если разработчик не убрал ту галочку при сборке проекта. По умолчанию она установлена.
Благодарю за экскурс :super:
dadreamer писал(а): 02 фев 2023, 16:23 Если доберусь до 2011, посмотрю.
У duke-kta вроде версия даже посвежее была. Может дело в разрядности?
Аватара пользователя
dadreamer

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

Re: Создание DLL в LabVIEW

Сообщение dadreamer »

Тут ларчик просто открывается. Надо в настройках билда поставить галочку "Include a type library for TestStand or Call Library Nodes" (появилась в :labview: 2015, на скриншоте выше она есть). Тогда внутрь DLL будет помещаться так называемая библиотека типов (typelib), где и будет описан прототип функции. В хэлпе вот что сказано:
Specifies whether to embed a type library when you build shared libraries (DLLs). If you use TestStand or the LabVIEW Call Library Function Node, you must manually enable this option. The TestStand C/C++ DLL Adapter, LabWindows/CVI Adapter, and the LabVIEW Call Library Function Node use the type library to display a list of functions in the shared library, including the parameters and data types for the functions. You must install additional tools to embed a type library. Visit ni.com/info and enter the Info Code DownloadMSDTBuildTools to access the additional tools.
То есть, нужно сначала скачать и установить MSDT Build Tools, потом уже генерировать DLL, в противном случае вылезет ошибка при построении. Достаточно даже поставить MSDT_BuildTools.msi из архива, тоже будет работать.
Так выглядит typelib внутри dll:
2023-02-13_17-56-10.jpg
А это получившийся IDL файл (при желании можно перекомпилировать прототип без перестроения всего проекта):

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

// Generated .IDL file (by the OLE/COM Object Viewer)
// 
// typelib filename: SumLib.dll

[
  uuid(CDEF8B4B-B4E7-4FC5-896F-C1C018742F89),
  version(0.0),
  custom(DE77BA64-517C-11D1-A2DA-0000F8773CE9, 134218331),
  custom(DE77BA63-517C-11D1-A2DA-0000F8773CE9, 1676290929),
  custom(DE77BA65-517C-11D1-A2DA-0000F8773CE9, Created by MIDL version 8.00.0603 at Mon Feb 13 17:22:09 2023
)

]
library SumLib
{
    // TLib :     // Forward declare all types defined in this typelib

    [
      dllname("SumLib.dll")
    ]
    module Sum {
        [entry(0x60000000)]
        double _cdecl Sum(
                        [in] double C0ntr0l1, 
                        [in] double C0ntr0l2);
    };
};
Проверял на :labview: 2022 (32 и 64 бита), всё работает, естественно, разрядность нужно соблюдать.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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