Для 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++ и тип проекта "Пустой проект". Создайте новую папку для проекта, если необходимо.

Далее, выбираем тип файла "Файл C++" из вкладки "Visual C++":

Можно назвать его так же, как проект, чтобы не путаться. После нажатия на кнопку "Добавить" в проекте, в папке "Файлы исходного кода" появится пустой файл исходного кода C/C++.

Сейчас можно добавить их в проект, для этого нужно в "Обозревателе решений" кликнуть правой кнопкой мыши по папке "Заголовочные файлы" и далее выбрать: "Добавить" -> "Существующий элемент..."

Откройте добавленную папку "Lua", выделите, зажав кнопку "Ctrl", 3 заголовочных файла, как показано на изображении, и нажмите кнопку "Добавить".


Откроется окно свойств, в котором нужно "Тип конфигурации" установить, как "Динамическая библиотека (.dll)":

В поле "Поддержка общеязыковой среды выполнения (CLR)" должно быть значение "Без поддержки CLR-среды":
Для того, чтобы скрипт Qlua мог работать с библиотекой DLL, она должна находится в корневом каталоге терминала QUIK. По-этому, в поле "Выходной каталог" можно сразу указать папку с терминалом QUIK, тогда библиотека будет компилироваться сразу в нее и, в последствии, после внесения каких-либо изменений, не придется постоянно заменять старую DLL на новую:
Далее, нужно перейти: "Свойства конфигурации" -> "Компоновщик" -> "Ввод". В поле "Дополнительные зависимости" из выпадающего списка выбрать пункт "<Изменить...>".
В открывшемся окне в верхнее поле добавить строку "Lua\lua5.1.lib" и нажать кнопку "ОК"
Теперь осталось нажать кнопки "Применить" и "ОК".
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | #include <windows.h> //=== Необходимые для 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) { //Каждому событию соответствует свое значение аргумента fdwReason, передаваемого функции DllMain при его возникновении switch (fdwReason) { case DLL_PROCESS_ATTACH: // Подключение DLL break; case DLL_PROCESS_DETACH: // Отключение DLL break; case DLL_THREAD_ATTACH: // Создание нового потока break; case DLL_THREAD_DETACH: // Завершение потока break; } 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 }, // из скрипта Lua эту функцию можно будет вызывать так: QluaCSharpConnector.TestFunc(); здесь можно указать любое другое название { NULL, NULL } }; //=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================// extern "C" LUALIB_API int luaopen_QluaCSharpConnector(lua_State *L) { luaL_openlib(L, "QluaCSharpConnector", ls_lib, 0); return 0; } |
Для того, чтобы узнать как Lua может взаимодействовать с библиотекой DLL, написанной на C/C++, ознакомьтесь с данной статьей.

то, после компиляции, в папке с терминалом появиться новая библиотека DLL, которая будет называться так же, как проект, и еще несколько сервисных файлов Visual Studio, которые не нужны для работы библиотеки, но и мешать работе терминала не будут.
Для этого нужно в начало файла добавить следующую строку: "require("QluaCSharpConnector");". Таким образом функции библиотеки можно будет использовать в скрипте.
Пример обращения к функции, ранее созданной библиотеки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | require("QluaCSharpConnector"); IsRun = true; function main() while IsRun do sleep(1000); end; end; function OnStop() message(QluaCSharpConnector.TestFunc()); IsRun = false; end; |
Данный скрипт выведет сообщение с текстом: "Привет из C/C++".
Здравствуйте.
Помогите собрать dll библиотеку под QUIK 8.5, там Lua 5.3
Для сборки ddl под quik 8.5 и lua 5.3 нужно полностью заменить последний блок кода (регистрация названия библиотеки), например на:
хидеры и либу брать с https://sourceforge.net/projects/luabinaries/files/5.3.5/Windows%20Libraries/Static/
для VS2013(на ней проверял): lua-5.3.5_Win64_vc12_lib.zip
и не забыть поставить в свойствах проекта платформу x64
Это частично помогло, но всё-равно не собирается.
Хотя в компоновщике во Вводе я вместо прежней "Дополнительной зависимости" 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 работать.
У меня vs19, quik 8.7. Скачал lua-5.3.5_Win64_vc16_lib.zip, перекопировал заголовки и lib, в компоновщике прописал lua53.lib. сборка x64
Конец у кода такой:
Собирается, работает, надеюсь как-то поможет. (варнинг LINK : warning LNK4098 такой же при сборке)
с 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.
Опишу всю процедуру для 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
Здравствуйте Дмитрий и другие авторы комментариев. Вот и я перешел на Квик вер.8.0. Перестали работать 32х разрядные ДЛЛ. Решил пересобрать ДЛЛ на 64 бита.
Сделал все как написал уважаемый ПавелИ (спасибо за подробное описание). Единственная разница - у меня Visual Studio 2015.
Так вот, у меня без ошибок собирается программа из примера только если я закомментирую одну строку:
Если я ее раскомментирую, то появляются ошибки:
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
В то же время функция
никаких ошибок не вызывает.
Долго бился, ничего сделать не могу... Помогите пожалуйста разобраться.
Ура, заработало!!! Проблема была в том что для Visual Studio 2015 необходимо скачать lua-5.1.5_Win64_vc15_lib.zip (https://sourceforge.net/projects/luabinaries/files/5.1.5/Windows%20Libraries/Static/)
C VS 2019 тоже собралось нормально
Все сделал по указанным в статье примерам. Скрипт писался в нотепаде++ методом копипаста. Длл QluaCSharpConnector в директории Квика есть + еще 3 файла типа .pdb/.lk. Однако при запуске скрипта в квике выходит соббщение, что ДЛЛ с таким именем не найдена. В какую сторону копать, чтобы пример ваш заработал, так как у самого мысли кончились.
А Вы случайно не на 8 версии квика работаете?
Квик у меня версии 7.29.0.40 рабочий(не демка). Длл создавал для х86. Компьютер работает под 64битной виндовс 7.
Значит проблем быть не должно, скорее всего, в какой-то мелочи что-то упустили.
Дмитрий,здравствуйте. Пытаюсь пересобрать Вашу библиотеку 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?
Я не Дмитрий, но отвечу, надеюсь не обидитесь.
Если только эта ошибка, то используйте функцию strcat_s вместо strcat . Собственно это и предлагается сделать в описании ошибки. Функция по моему аналогична, только еще нужно передать размер. Опять таки, по моему эта ошибка не связана с разрядностью.
Да нет, что вы, какие обиды. Наоборот, спасибо за помощь.
Поправил ошибки, сейчас осталось две :
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, то ошибка пропадает.
Здравствуйте, не пробовал еще под x64 собирать, ничего не могу подсказать
Здравствуйте.
Квик обновился до 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, но я не знаю как.
Помогите.
Разобрался. Что и как делал:
У меня 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 и все заработало.
Отлично, спасибо за инструкцию, думаю многим будет полезна
Подскажите, возникает ошибка
LNK1561 точка входа должна быть определена!?
в чем может быть причина..все по инструкции сделал, код из примера взял
Что-то упустили в инструкции
Сделал также, но вместо 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
Админ данного сайта специально выкладаывает не рабочий код.
Статья в 2015 году была написана, если Вы не обратили внимание. Обновил ссылки на решения Visual Studio, вверху статьи красным цветом
Ух какой админ! 😉
Привет, Дима!
Привет, Саша 🙂