Как добавить простой API в мое приложение C ++ для доступа через LabView? - PullRequest
6 голосов
/ 13 ноября 2008

У меня есть программа сбора данных, написанная на C ++ (Visual Studio 6.0). Некоторые клиенты хотели бы управлять программным обеспечением из своего собственного программного обеспечения или LabView. Я хотел бы придумать простой API с DLL, который я могу им распространять, и хотел бы получить несколько советов о том, как начать. Это будет ОЧЕНЬ просто, возможно, 4 или 5 команд. Моя DAQ-программа по-прежнему будет работать в своем собственном окне на той же машине, я просто хотел бы настроить ее на управление из другой программы.

Ответы [ 6 ]

6 голосов
/ 13 ноября 2008

Вы на правильном пути с DLL. Похоже, реальный трюк - решить, какой тип межпроцессного взаимодействия (IPC) вы хотите использовать. Опции: сокеты, каналы, общая память, объекты синхронизации (события и т. Д.), Файлы, реестр и т. Д.

Как только вы решите это, затем внедрите слушатель в свой исполняемый файл, чтобы ждать входящих сообщений IPC от любого программного обеспечения, использующего вашу DLL.

Что касается API, вы можете сделать его простым, как вы и хотели. Пусть DLL предоставит вам 4 или 5 функций (убедитесь, что вы используете только собственные типы данных, такие как char * и long, чтобы избежать проблем с границами модулей), а затем они будут использовать ваш механизм IPC для связи с исполняемым приложением.

2 голосов
/ 13 ноября 2008

Вы можете использовать DLL. Я бы обдумал это. Но я бы также подумал о создании простого API на основе http, предпочтительно RESTful.

Преимущества: легко переносить. Можно написать клиентское приложение с любого языка тривиально. Может работать через сеть. Тестирование становится проще (используйте язык сценариев или браузер).

Недостатки: производительность будет ниже. Значительно больше возможностей для настройки в C ++. Я не уверен, что LabView может делать http-вызовы.

Что-то вроде:

http://xxx/data [ПОЛУЧИТЬ, может быть, POST для тестирования]

http://xxx/data/start [POST]

http://xxx/data/stop [POST]

http://xxx/data/parameters [POST]

Учитывая ваши требования, это может быть немного излишним, но тогда, возможно, нет. Многие приложения, над которыми я работал, пришлось портировать и их было бы быстрее расширять, если бы мы могли использовать более быстрый язык разработки для тестирования и расширения.

2 голосов
/ 13 ноября 2008

Большим преимуществом COM является то, что вам не нужна DLL! Вы говорите, что ваше приложение всегда будет запущено. Это означает, что он может выступать в роли создателя COM-объекта («локальный сервер»).

Если кто-то захочет использовать DLL-библиотеку "stdcall", вы можете предоставить им библиотеку DLL, которая внутренне просто перенаправляет все вызовы в интерфейс COM. Написание было бы довольно тривиально. У вас есть только 5 функций, говорите вы. Это говорит о том, что у вас есть один интерфейс COM с этими 5 методами. Когда DLL-библиотека оболочки загружается, она просит ваш EXE-файл создать свой COM-объект. DLL, в свою очередь, предоставляет 5 методов stdcall, каждый из которых вызывает один метод для COM-объекта.

2 голосов
/ 13 ноября 2008

Вещи, которые начинаются просто, как это, имеют привычку расти со временем, поэтому вам, возможно, будет лучше проделать немного больше работы заранее и использовать технику, которая будет расти вместе с вами.

Внедрение интерфейса COM в вашу программу даст клиентам большую свободу в том, как интерфейс с ним, и вам не придется беспокоиться о механизме IPC и т. Д., Так как COM разработан, чтобы скрыть все это от вас .

В будущем COM уже имеет хорошо определенные идиомы для таких вещей, как события, которые хорошо поддерживаются языками сценариев и т. Д., Если они вам нужны.

Обновление : существует множество способов реализации COM. Вы можете создать его из первых принципов, руководствуясь хорошей книгой COM, или использовать фреймворк, такой как ATL, чтобы сэкономить часть котла. Есть много хороших образцов, например, см. MSDN .

1 голос
/ 06 января 2011

LabVIEW поддерживает выполнение вызовов DLL, но это одно из слабых мест в разработке LabVIEW. Сделано неправильно, это может привести к сбою приложения. Как разработчику LabVIEW, мне нравится предложение MattyT создать HTTP-сервис. Каждый язык на каждой платформе, который может сделать порт TCP / IP, может получить к нему доступ. Я думаю, что вы могли бы использовать свой собственный протокол TCP / IP вместо полноценного HTTP, но в любом случае проблема совместимости решена.

Если вы используете DLL, вот несколько советов. Не используйте структуры или указатели на структуры в списке аргументов вызова функции. Не выделяйте память в DLL для передачи обратно в LabVIEW. LabVIEW имеет встроенную систему управления памятью и не будет хорошо играть с другими. Это может относиться к другим языкам с управлением памятью, таким как Java. LabVIEW будет работать лучше, если он выделяет память и передает указатель на DLL. Избегайте указателей, массивов и строк, где это возможно. LabVIEW может передавать их в DLL, но это сложная тема, которая лучше всего работает, когда разработчик LabVIEW также знает C, что не всегда так.

0 голосов
/ 13 ноября 2008

Здесь есть связанный вопрос . Я не хочу заканчивать тем, что является специфичным для LabView, и кажется, что LabView может обращаться к dll, если они используют stdcall . Такая dll может быть вызвана из VB или другого программного обеспечения Windows, для чего я и стреляю.

Я не уверен насчет возможности доступа к интерфейсу COM, но был бы признателен за более подробную информацию о том, как это будет выглядеть для моего приложения.

...