Подскажите, есть к примеру callback`и - OnQuote, OnAllTrade - которые вызываются самим Квиком.
Я пытаюсь их объявить Lua C api:
Код
static int global_callback__OnQuote(lua_State* L)
{
std::cout << "global_callback__OnQuote" << std::endl;
return 0;
}
int main()
{
lua_pushcfunction(L, global_callback__OnQuote); //Помещаю Си-шную функцию в стек.
lua_setglobal(L, "OnQuote"); //Присваиваю ей глобальное имя.
}
Вроде бы должно работать, но функция не вызывается. Получение стаканов предварительно естественно заказана, да и в самом квике открыты, да и обычный Lua-скрипт с OnQuote - тоже работает. Но из dll-ки не хочет почему то.
Пользователь
Сообщений: Регистрация: 29.11.2021
28.11.2022 14:17:06
Вот пример рабочей "регистрации" для Quik 9.7.1.10 и lua 5.4.2 - год назад+ написано до сих пор работатет...
Код
static int OnParam_from_lua(lua_State* L) {
lua_settop(L, 0);
}
//=== Регистрация названия библиотеки, видимого в скрипте Lua ==================================================//
extern "C" LUALIB_API int luaopen_for_quik_lua542(lua_State * L) {
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_pushvalue(L, -1); // не понятно нужна или нет это строка - работает без нее
lua_setglobal(L, "dll");
lua_register(L, "main", main_from_lua);
lua_register(L, "OnStop", OnStop_from_lua);
lua_register(L, "OnClose", OnClose_from_lua);
lua_register(L, "OnConnected", OnConnected_from_lua);
lua_register(L, "OnDisconnected", OnDisconnected_from_lua);
lua_register(L, "OnParam", OnParam_from_lua);
return 0;
};
Пользователь
Сообщений: Регистрация: 13.05.2022
28.11.2022 16:09:51
Хммммм, у меня не работает.
Ошибок не вызывает, но callback квиком не вызывается.
Пользователь
Сообщений: Регистрация: 13.05.2022
28.11.2022 16:25:44
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
Спасибо за помощь!
Пользователь
Сообщений: Регистрация: 29.11.2021
30.11.2022 15:48:40
Цитата
Quikos написал: Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
написал: Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
Не нужно. В скрипте только подключение dll.
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
Чтобы было проще программировать колбеки, Вы можете эти функции написать на луа, а внутри их вызвать ваши функции на СИ. ------------------- например так function OnQuote() --------------- вызываете что хотите писанное на СИ ..... -------------- end ================= На самом деле Вы так сейчас и делаете, так как QLUA - библиотека функций, писанных на СИ. Вы хотите написать еще и свою хотелку на CИ.
Пользователь
Сообщений: Регистрация: 29.11.2021
30.11.2022 18:53:20
Цитата
Quikos написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote". Не вызывается. Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote". Не вызывается. Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll. Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке Когда Вы присвоите функции вашу функцию тогда и вызывается.
Пользователь
Сообщений: Регистрация: 30.01.2015
30.11.2022 23:28:06
т е в вашем варианте, Вы описанием делаете указатель в глобальном стеке на вашу функцию из таблицы dll, потому и вызывается.
написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote". Не вызывается. Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll. Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке Когда Вы присвоите функции вашу функцию тогда и вызывается.
написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote". Не вызывается. Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll. Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке Когда Вы присвоите функции вашу функцию тогда и вызывается.
написал: Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote". Не вызывается. Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll. Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке Когда Вы присвоите функции вашу функцию тогда и вызывается.
Просто вы же сами написали, что я неправильно описываю ее в dll, да и , что вроде бы может работать без указания этих двух строчек в скрипте.
Собсвенно работает и хорошо, но теперь мне все таки интересно - может ли это работать без указания OnQuote в скрипте или нет.
Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем. -------------------------- Вы dll сделали правильно (если выкинуть лишнее, из того что Вам написали) Но Вы не объявили Вашу функцию колбеком. -----------------------
Как вариант,вы можете вызвать вашу функцию внутри например так:
Код
--здесь загрузите вашу dll
function OnQuote (class, sec)
---- здесь вызов вашей функции из вашей dll
end
Пользователь
Сообщений: Регистрация: 13.05.2022
01.12.2022 19:18:19
Цитата
nikolz написал: Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем. -------------------------- Вы dll сделали правильно (если выкинуть лишнее, из того что Вам написали) Но Вы не объявили Вашу функцию колбеком. -----------------------
Как вариант,вы можете вызвать вашу функцию внутри например так:
Код
--здесь загрузите вашу dll
function OnQuote (class, sec)
---- здесь вызов вашей функции из вашей dll
end
Не понимаю, что значит я просто обьявил функцию, но не сделал ее колбеком ? Я обявил Сишную функцию и связал ее с именем реальной глобальной квиковской функции - OnQuote.
Что значит не сделал ее колбеком ? И что такое " ---- здесь вызов вашей функции из вашей dll". Функция OnQuote вызывается не мной - а самим Квиком.
написал: Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем. -------------------------- Вы dll сделали правильно (если выкинуть лишнее, из того что Вам написали) Но Вы не объявили Вашу функцию колбеком. -----------------------
Как вариант,вы можете вызвать вашу функцию внутри например так:
Код
--здесь загрузите вашу dll
function OnQuote (class, sec)
---- здесь вызов вашей функции из вашей dll
end
Не понимаю, что значит я просто обьявил функцию, но не сделал ее колбеком ? Я обявил Сишную функцию и связал ее с именем реальной глобальной квиковской функции - OnQuote.
Что значит не сделал ее колбеком ? И что такое " ---- здесь вызов вашей функции из вашей dll". Функция OnQuote вызывается не мной - а самим Квиком.
покажите где КВИК в скрипте, который написали Вы, загрузил вашу dll
Пользователь
Сообщений: Регистрация: 13.05.2022
02.12.2022 10:54:29
Цитата
nikolz написал: покажите где КВИК в скрипте, который написали Вы, загрузил вашу dll
Вот полный скрипт в Квике:
Код
function OnQuote(class, sec)
end
function main()
Quik_Lua_connector = require("Quik_Lua_connector ")
-------------------------
while not stopped do
sleep(1)
end
-------------------------
end -- end main()