Коннектор DLL QUIK - QLua(Lua) - C++

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 7, среднее: 5,00 из 5)
Загрузка...

Qlua-csharp-connector-dll
Для Quik 8 x64 (Lua 5.1) скачать готовое решение VS 2019 Community можно по этой ссылке 
Для Quik 8 x64 (Lua 5.3.5) скачать готовое решение VS 2019 Community можно по этой ссылке

Для того, чтобы обмениваться данными между скриптом Qlua и приложением на C# требуется библиотека DLL, написанная на языке C/C++. Для этого в Visual Studio нужно "Создать проект", выбрав язык C++ и тип проекта "Пустой проект". Создайте новую папку для проекта, если необходимо.

В Visual Studio Community 2013 это выглядит следующим образом:
В результате, Visual Studio создаст решение и один проект в нем:
Сейчас можно добавить в проект файл исходного кода
Следующим шагом необходимо добавить в проект заголовочные файлы и библиотеку Lua
Далее, нужно настроить свойства проекта:
Добавление базового кода
Сейчас можно 'Собрать' проект
Использование библиотеки DLL в скрипте QLua(Lua)
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

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

Коннектор DLL QUIK - QLua(Lua) - C++: 87 комментариев

    1. Для сборки ddl под quik 8.5 и lua 5.3 нужно полностью заменить последний блок кода (регистрация названия библиотеки), например на:

      1
      2
      3
      4
      5
      6
      7
      
      extern "C" LUALIB_API int luaopen_QluaCSharpConnector(lua_State *L) {
      	lua_newtable(L);
      	luaL_setfuncs(L, ls_lib, 0);
      	lua_pushvalue(L, -1);
      	lua_setglobal(L, "QluaCSharpConnector");
              return 0;
      }

      хидеры и либу брать с https://sourceforge.net/projects/luabinaries/files/5.3.5/Windows%20Libraries/Static/
      для VS2013(на ней проверял): lua-5.3.5_Win64_vc12_lib.zip
      и не забыть поставить в свойствах проекта платформу x64

      1. Это частично помогло, но всё-равно не собирается.
        Хотя в компоновщике во Вводе я вместо прежней "Дополнительной зависимости" lua5.1.lib ввел новую lua53.lib

        Ошибки:
        Ошибка 1 error C2079: "ls_lib" использует неопределенный struct "ls_lib"
        Ошибка 2 error C2078: слишком много инициализаторов
        Ошибка 3 error C3861: luaL_openlib: идентификатор не найден

        В итоге скачал lua-5.1.5_Win64_vc15_lib
        Вернул доп.зависимость на lua5.1.lib
        Вместо вашей версии extern "c" указал прежнюю.
        И собралось без ошибок, но с warning:
        ===
        1> Создается библиотека C:\SBERBANK\QUIK_x64_RSA\connector.lib и объект C:\SBERBANK\QUIK_x64_RSA\connector.exp
        1>LINK : warning LNK4098: библиотека по умолчанию "LIBCMT" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library
        ===

        Мне кажется вместе с extern "c" нужно как то поменять эту строку: static struct luaL_reg ls_lib[] = {

        Вы не знаете что с ней не так? Я поискал в интернете - не нашёл(
        Хочется таки синхронно на квиковской 5.3 работать.

        1. У меня vs19, quik 8.7. Скачал lua-5.3.5_Win64_vc16_lib.zip, перекопировал заголовки и lib, в компоновщике прописал lua53.lib. сборка x64
          Конец у кода такой:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          
          static const luaL_Reg ls_lib[] = {
              { "TestFunc", forLua_TestFunc }, 
             { NULL, NULL }
          };
           
          extern "C" LUALIB_API int luaopen_QluaCSharpConnector_x64(lua_State * L) {
              lua_newtable(L);
              luaL_setfuncs(L, ls_lib, 0);
              lua_pushvalue(L, -1);
              lua_setglobal(L, "QluaCSharpConnector_x64");
              return 0;
          }

          Собирается, работает, надеюсь как-то поможет. (варнинг LINK : warning LNK4098 такой же при сборке)

  1. с 8 июня 2020 потребуется обновление терминала QUIK до версии 8.5. В связи с необходимостью поддержки 19-значных номеров, в терминале версии 8.5 выполнено изменение версии LUA c 5.1 до 5.3.
    Ссылки: https://forum.quik.ru/forum10/topic5119/, ftp://ftp.quik.ru/public/updates/8.5/quik_8.5.1_upd.zip
    Может кто-нибудь поможет готовым решением (такого же VS-проекта) под LUA c 5.3. и QUIK 8.5.

    1. Опишу всю процедуру для QUIK 8.8.4.3 (lua5.3) и MS VS 2019 Community (бесплатная)

      1. Создаем новый пустой C++-проект с именем "lua_dll_x64_name" (одно имя для проекта и решения)
      2. Добавляем пустой cpp-файл в раздел "Исходные файлы" с тем же именем - "lua_dll_x64_name.cpp" (в Обозревателе решений щелкаем правой клавишей мыши на "Исходные файлы" и выбираем Добавить/Создать элемент/Класс C++)
      3. MS VS 2019 должен был создать для этого проекта папку lua_dll_x64_name в которой теперь пора создать папку Lua
      3. Скачиваем с https://sourceforge.net/projects/luabin … es/Static/ архив "lua-5.3.5_Win64_vc16_lib.zip" и распаковываем в lua_dll_x64_name/Lua
      4. В Обозревателе решений щелкаем правой клавишей мыши на "Заголовочные файлы" и выбираем Добавить/Существующий элемент... и указать из папки lua_dll_x64_name/Lua все .h- и .hpp-файлы.
      7. Открыть Диспетчер конфигураций и установить x64 для Debug и Release (можно ч/з соответствующие окошки в панели инструментов)
      8. Настраиваем свойства проекта (для Release и Debug устанавливаются отдельно!!!). Окно свойств вызывается в Обозревателе решений щелчком правой клавишей мыши на имени проекта "lua_dll_x64_name"
      - Общие/Тип конфигурации: "Динамическая библиотека (.dll)"
      - Дополнительно/Набор символов: "Использовать набор символов Юникода"
      - Дополнительно/Поддержка общеязыковой среды выполнения (CLR): "Без поддержки CLR-среды"
      - Компоновщик/Ввод/Дополнительные зависимости/: вписать Lua\lua53.lib
      - C/C++/Создание кода/Библиотека времени выполнения: Release/Debug - "Многопоточная (/MT)"/"Многопоточная отладка (/MTd)"
      8. Добавьте в пока пустой файл исходного кода (lua_dll_x64_name.cpp) следующие строки:

      #include

      //=== Необходимые для Lua константы ============================================================================//
      #define LUA_LIB
      #define LUA_BUILD_AS_DLL

      //=== Заголовочные файлы LUA ===================================================================================//
      extern "C" {
      #include "Lua\lauxlib.h"
      #include "Lua\lua.h"
      }

      //=== Стандартная точка входа для DLL ==========================================================================//
      BOOL APIENTRY DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved) {
      return TRUE;
      }

      //=== Реализация функций, вызываемых из LUA ====================================================================//
      static int forLua_TestFunc(lua_State* L){
      lua_pushstring(L, "Привет из C/C++");
      return(1);
      }

      //=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================//
      static struct luaL_Reg ls_lib[] = {
      {"TestFunc", forLua_TestFunc},
      {NULL, NULL}
      };

      //=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
      extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) {
      lua_newtable(L);
      luaL_setfuncs(L, ls_lib, 0);
      lua_pushvalue(L, -1);
      lua_setglobal(L, "lua_dll_x64_name");
      return 0;
      }

      9. В lua-скрипте пишем следующее:
      path = getScriptPath() .. "\\lua_dll_x64_name.dll"
      package.loadlib(path, "luaopen_lua_dll_x64_name")()

      function main()
      message(lua_dll_x64_name.TestFunc())
      end

  2. Здравствуйте Дмитрий и другие авторы комментариев. Вот и я перешел на Квик вер.8.0. Перестали работать 32х разрядные ДЛЛ. Решил пересобрать ДЛЛ на 64 бита.
    Сделал все как написал уважаемый ПавелИ (спасибо за подробное описание). Единственная разница - у меня Visual Studio 2015.
    Так вот, у меня без ошибок собирается программа из примера только если я закомментирую одну строку:

    1
    
    //luaL_openlib(L, "QluaCSharpConnector", ls_lib, 0);

    Если я ее раскомментирую, то появляются ошибки:
    LNK2019 ссылка на неразрешенный внешний символ __iob_func в функции luaL_loadfile \lua5.1.lib(lauxlib.obj) 1
    LNK2019 ссылка на неразрешенный внешний символ fprintf в функции panic \lua5.1.lib(lauxlib.obj) 1
    LNK2019 ссылка на неразрешенный внешний символ sprintf в функции luaO_pushvfstring \lua5.1.lib(lobject.obj) 1
    В то же время функция

    1
    
     lua_pushstring(L, "Привет из C/C++");

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

  3. Все сделал по указанным в статье примерам. Скрипт писался в нотепаде++ методом копипаста. Длл QluaCSharpConnector в директории Квика есть + еще 3 файла типа .pdb/.lk. Однако при запуске скрипта в квике выходит соббщение, что ДЛЛ с таким именем не найдена. В какую сторону копать, чтобы пример ваш заработал, так как у самого мысли кончились.

  4. Дмитрий,здравствуйте. Пытаюсь пересобрать Вашу библиотеку SenderEmail.dll для Квика вер.8.0. Что-то не выходит. Сделал всё по инструкции, что написал человек в комментариях. Выдает такую ошибку в нескольких строках :
    'strcat': This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. Project1 c:\users\sega\source\repos\project1\project1\project1.cpp 194
    Заранее извиняюсь за наглость, но может Вы могли бы обновить архив EmailSender.zip с перекомпилированной библиотекой под х64?

    1. Я не Дмитрий, но отвечу, надеюсь не обидитесь.
      Если только эта ошибка, то используйте функцию strcat_s вместо strcat . Собственно это и предлагается сделать в описании ошибки. Функция по моему аналогична, только еще нужно передать размер. Опять таки, по моему эта ошибка не связана с разрядностью.

    2. Поправил ошибки, сейчас осталось две :
      1)аргумент типа "WCHAR *" несовместим с параметром типа "const char *" Project1 C:\Users\Sega\source\repos\Project1\Project1\Project1.cpp стр.48
      2)"int strcmp(const char *,const char *)": невозможно преобразовать аргумент 1 из "WCHAR [260]" в "const char *" Project1 c:\users\sega\source\repos\project1\project1\project1.cpp стр. 48
      Всё в одной строке, причем если менять конфигурацию вновь на х32, то ошибка пропадает.

  5. Здравствуйте.
    Квик обновился до 8 версии, теперь он x64

    Помогите создать в visual studio 2013 библиотеку dll

    Просто сменил Release Win32 на Release x64 - не помогло.
    Выдает ошибки
    Ошибка 1 error LNK2001: неразрешенный внешний символ "luaL_openlib"
    Ошибка 2 error LNK2001: неразрешенный внешний символ "lua_pushstring"

    Либо нужны другие файлы lauxlib.h, lua.h, luaconf.h и lua5.1.lib

    Либо нужно как то настроить Visual Studio 2013, но я не знаю как.

    Помогите.

    1. Разобрался. Что и как делал:
      У меня Visual Studio 2013, на других версиях думаю так же, но не пробовал.
      1. Создал проект и настроил его по инструкции как на текущей странице (только файлы брал другие см.п.2, а так же см п.3)
      2. На сайте http://luabinaries.sourceforge.net/ выбрал "Lua 5.1.4 - Release 2 (sources and Visual C++ 8/9 binaries only)" Далее "Windows Libraries" и скачал "lua-5.1.4_Win64_vc12_lib.zip". Скаченные файлы разместил как в в описании.
      3. В Visual Studio 2013, при настройке проекта, я изменил: Конфигурация Активная (Release) Платформа x64 (Создал через диспетчер конфигураций)
      4. Код СИ скопировал для примера.
      5. Проект успешно собрал, dll библиотека появилась.
      6. Создал скрипт Lua, подключил через require. Запустил в QUIK 8.0.1.1 и все заработало.

      1. Подскажите, возникает ошибка
        LNK1561 точка входа должна быть определена!?
        в чем может быть причина..все по инструкции сделал, код из примера взял

      2. Сделал также, но вместо 2-х ошибок LNK2001 появилось 4:
        Error LNK2001 unresolved external symbol __iob_func Clipboard C:\WORK\CPP\Clipboard\Clipboard\Lua5.1.lib(lauxlib.obj) 1
        Error LNK2001 unresolved external symbol fprintf Clipboard C:\WORK\CPP\Clipboard\Clipboard\Lua5.1.lib(lauxlib.obj) 1
        Error LNK2001 unresolved external symbol sprintf Clipboard C:\WORK\CPP\Clipboard\Clipboard\Lua5.1.lib(lobject.obj) 1
        Error LNK2001 unresolved external symbol sprintf Clipboard C:\WORK\CPP\Clipboard\Clipboard\Lua5.1.lib(lvm.obj) 1