Обмен данными между DLL (C/C++) и приложением QT Creator (C++)

Автор записи: NewDracon
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 2, среднее: 4,50 из 5)
Загрузка...

Для начала объясню, почему я выбрал для связки с QUIK'ом именно QT и зачем нужен этот "велосипед". Дело в том, что захотелось побольше графических возможностей, а если использовать Visual Studio С++ (а не C#), то готовых компонентов для "рисования" графиков практически нет. А C# или java в сравнению с QT С++ будут уступать в скорости, которая  необходима для тестирования стратегий. (Последнее спорно, но, по моему мнению, все же C++ "ближе" к процессорному языку, и код тестов QT в будущем можно будет перенести на unix)

И тут начались грабли... Если заходил со стороны прямой компиляции LUA для QT, не хотел подключаться QUIK (написанный на MVSC). Затем я попробовал создать DLL на MVSC и подключиться динамически к ней из QT, но export'ы DLL просто не виделась в QT. И тут я наткнулся на замечательную статью Обмен данными между DLL (C/C++) и приложением C# посредством Memory Mapped File (MMF). Ниже привожу мою адаптацию данной статьи на QT Ctreator. При этом использовалась среда Visual Studio 2017 С++ для написания DLL и среда QT Creator 5.3 с компилятором MinGW 4.8.

LUA и DLL пишутся так же:

QLua(Lua)

  • Подключает библиотеку DLL
  • Запускает функцию отправки сообщений в QT
  • Останавливает функцию отправки сообщений в QT
Код LUA

DLL C/C++, написанная на Visual Studio

  • Библиотека DLL создает/подключается к именованной памяти.
  • Отправляет (записывает в память) текстовое сообщение: "Привет из C/C++".
  • Читает память с периодичностью в 1 секунду, если память стала чиста, сообщение отправляется вновь.
Код DLL

 

QT Creator

  • Приложение на C++ создает/подключается к именованной памяти.
  • Читает память с периодичностью в 1 секунду, если в памяти появилось текстовое сообщение: "hello from DLL C/C++", выводит его в текстовое поле и очищает память, сообщая тем самым DLL что сообщение получено.
Создание приложения на QT

Стоит отметить, что были использованы стандартные средства WINAPI, а не инструментарий QT для MMF, поскольку в QT именование MMF идет по-другому.

Если все правильно сделано, то в запущенном приложении QT будут появляться строки hello from DLL C/C++, если при этом будет запущен скрипт LUA:

Надеюсь, моя "балалайка" кому-нибудь пригодиться. Если я в чем-то ошибся и можно проще, прошу поделиться своими наработками.

Добавить комментарий