Serg_ написал: Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ? Как сделать dll ?
Все есть безусловно официально. В КВИК встроена виртуальная машина луа без каких либо изменений исходников поэтому читайте API C для lua. ------------------------- Я так пишу функции для QUIK на СИ от колбек до многопоточной обработки данных в LUA. ---------------------- QLUA - это библиотека написанная на API C. -------------------- Или в чем то другом проблема?
Serg_ написал: Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ? Как сделать dll ?
Все есть безусловно официально. В КВИК встроена виртуальная машина луа без каких либо изменений исходников поэтому читайте API C для lua. ------------------------- Я так пишу функции для QUIK на СИ от колбек до многопоточной обработки данных в LUA. ---------------------- QLUA - это библиотека написанная на API C. -------------------- Или в чем то другом проблема?
Не могу понять, как через dll - все это делать. Откроено говоря - это неМного геморрой. Продукту 20 лет, а нормального API почему то нет.
Извините, не могу зарегистрироваться на том форуме, не приходит письмо активации.
Если есть возможность, то могли бы Вы подсказать ? Сделал, как в Вашем примере на 3 стр, Visual Studio создала dll ---> "lua_dll_x64_name.dll" - компилировал, как debug x64. Скопировал "lua_dll_x64_name.dll" в папку с quik, где находится файл Info.exe и запустил скрипт:
Код
path = getScriptPath() .. "\\lua_dll_x64_name.dll"
package.loadlib(path, "luaopen_lua_dll_x64_name")()
function main()
message(lua_dll_x64_name.TestFunc())
end
Однако quik выдает ошибку:
Код
Lua_script.lua.txt:3: attempt to index a boolean value (global 'lua_dll_x64_name')
Serg_ написал: Подскажите, есть ли какие ни будь условно официальные примеры, как связать С++ с Quik ? Как сделать dll ?
Все есть безусловно официально. В КВИК встроена виртуальная машина луа без каких либо изменений исходников поэтому читайте API C для lua. ------------------------- Я так пишу функции для QUIK на СИ от колбек до многопоточной обработки данных в LUA. ---------------------- QLUA - это библиотека написанная на API C. -------------------- Или в чем то другом проблема?
Не могу понять, как через dll - все это делать. Откроено говоря - это неМного геморрой. Продукту 20 лет, а нормального API почему то нет.
Вообще-то есть даже учебники о том как использовать API C ------------ как писать dll поясняю ------------------- берете любой компилятор СИ --------------- Я например последнее время для dll луа использую Pelles C Очень хороший пакет именно для СИ -------------- иногда использую MVC. ================ Далее в любимом IDE выбираете создать DLL и пишите программу на CB Функции СИ пишите как обычно для СИ А для вызова их из луа делаете обертку -------------- типа такой: -------------------- static int stop(lua_State *L) { //здесь вставляете преобразование данных луа в данные СИ QueryPerformanceCounter(&count1);
lua_pushinteger(L,(count1.QuadPart-count.QuadPart)); //это преобразование целого в формат луа и запись в стек return 1; -- это число возвращаемых параметров } Все функции API C здесь http://antirek.github.io/luabook/api.htm если любите C++ то читайте это: https://habr.com/ru/post/237503/ -------
у вас ошибка в ---------------------- 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; }
-- для LUA5.3 надо так:
//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================// luaL_Reg ls_lib[] = { {"TestFunc", forLua_TestFunc}, {NULL, NULL} };
//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================// extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) { luaL_newlib(L,ls_lib); lua_setglobal(L, "lua_dll_x64_name"); return 1; }
я использую 5.3 так как это работает для всех версий КВИК а 5.4 лишь начиная с 9.X но пока там много ошибок и там можно включить 5.3 для 5.4 не помню, возможно и так как у вас.
Создает новую таблицу с размером, оптимизированным для хранения всех записей в массиве l(но фактически не сохраняет их). Оно предназначено для использования в сочетании с luaL_setfuncs(см. luaL_newlib).
Он реализован в виде макроса. Массив lдолжен быть фактическим массивом, а не указателем на него.
nikolz написал: у вас ошибка в ---------------------- 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; }
-- для LUA5.3 надо так:
//=== Регистрация реализованных в dll функций, чтобы они стали "видимы" для Lua ================================// luaL_Reg ls_lib[] = { {"TestFunc", forLua_TestFunc}, {NULL, NULL} };
//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================// extern "C" LUALIB_API int luaopen_lua_dll_x64_name(lua_State * L) { luaL_newlib(L,ls_lib); lua_setglobal(L, "lua_dll_x64_name"); return 1; }
Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос -------------- (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) и нужно ли удалять значение из стека lua_pushvalue(L, -1); -------------------- у меня один оператор, а умник наплодил три.
Вы напишите, как я написал или разбирайтесь как правильно раскрыть макрос -------------- (luaL_newlibtable(L,l), luaL_setfuncs(L,l,0)) и нужно ли удалять значение из стека lua_pushvalue(L, -1); -------------------- у меня один оператор, а умник наплодил три.