Связывание глобальной callback функции

Страницы: 1
RSS
Связывание глобальной callback функции
 
Подскажите, есть к примеру 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-ки не хочет почему то.
 
Вот пример рабочей "регистрации" для 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;
};



 
Хммммм, у меня не работает.

Ошибок не вызывает, но callback квиком не вызывается.
 
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.

Спасибо за помощь!
 
Цитата
Quikos написал:
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
Не нужно. В скрипте только подключение dll.
 
Цитата
BVladimir написал:
Цитата
Quikos написал:
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
Не нужно. В скрипте только подключение dll.
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
 
Цитата
Quikos написал:
Цитата
BVladimir написал:
 
Цитата
Quikos  написал:
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
 Не нужно. В скрипте только подключение dll.
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
  Чтобы было проще программировать колбеки,
Вы можете эти функции написать на луа,
а внутри их вызвать ваши функции на СИ.
-------------------
например так
function OnQuote()
---------------  вызываете что хотите писанное на  СИ
.....  
--------------
end
=================  
На самом деле Вы так сейчас и делаете, так как QLUA - библиотека функций, писанных на СИ.
Вы хотите написать  еще и свою хотелку на CИ.
 
Цитата
Quikos написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
 
Цитата
nikolz написал:
Цитата
Quikos написал:
 
Цитата
BVladimir  написал:
 
Цитата
 Quikos   написал:
Оказывается в самом Lua-Скрипте нужно еще прописать вызов OnQuote.
  Не нужно. В скрипте только подключение dll.
 Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.

Вы хотите написать  еще и свою хотелку на CИ.
Да я собственно 99% уже написал, что хотел :)
 
Цитата
BVladimir написал:
Цитата
Quikos написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote".  Не вызывается.
Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
 
Цитата
Quikos написал:
Цитата
BVladimir написал:
 
Цитата
Quikos  написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
 надо с самой dll разбираться...
Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote".  Не вызывается.
Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll.
Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке
Когда Вы присвоите функции вашу функцию тогда и вызывается.  
 
т е в вашем варианте, Вы описанием делаете указатель в глобальном стеке на вашу функцию из таблицы dll, потому и вызывается.
 
Цитата
nikolz написал:
Цитата
Quikos написал:
 
Цитата
BVladimir  написал:
 
Цитата
 Quikos   написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
  надо с самой dll разбираться...
 Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote".  Не вызывается.
Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
Проблема в том что Вы неправильно ее описываете в dll.
Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке
Когда Вы присвоите функции вашу функцию тогда и вызывается.  

Я делаю так:

Код
static int global_callback__OnQuote(lua_State* L)
{
    std::cout << "global_callback__OnQuote" << std::endl;

    return 0;
}



extern "C" LUALIB_API int luaopen_DLL(lua_State * L)     
{
    
    luaL_newlib(L, ls_lib);

    lua_pushcfunction(L, global_callback__OnQuote);
    lua_setglobal(L, "OnQuote");

}

Каким образом дополнительно нужно присвоить "функцию моей функции" ?
 
Цитата
Quikos написал:
Цитата
nikolz написал:
 
Цитата
Quikos  написал:
 
Цитата
 BVladimir   написал:
   
Цитата
  Quikos    написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
   надо с самой dll разбираться...
  Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote".  Не вызывается.
Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
 Проблема в том что Вы неправильно ее описываете в dll.
Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке
Когда Вы присвоите функции вашу функцию тогда и вызывается.  

Я делаю так:

Код
  static int global_callback__OnQuote(lua_State *  L)
{
    std::cout  <  <   "global_callback__OnQuote"   <  <  std::endl;

     return   0 ;
}



extern  "C"  LUALIB_API int luaopen_DLL(lua_State  *  L)     
{
    
    luaL_newlib(L, ls_lib);

    lua_pushcfunction(L, global_callback__OnQuote);
    lua_setglobal(L,  "OnQuote" );

}  

Каким образом дополнительно нужно присвоить "функцию моей функции" ?
Ну Вы же сами написали, что это сделали?
Покажите как Вы это сделали в скрипте.
 
Цитата
nikolz написал:
Цитата
Quikos написал:
 
Цитата
nikolz  написал:
 
Цитата
 Quikos   написал:
   
Цитата
  BVladimir    написал:
   
Цитата
   Quikos     написал:
Хмммм, в моем случае - начинает работать когда я объявляю callback-функцию в самом скрипте, без этого в dll - не вызывается.
    надо с самой dll разбираться...
   Я даже не знаю, что там еще можно разобрать. В Luaopen - я добавил функцию на стек, определил ее, как глобальную "OnQuote".  Не вызывается.
Как только добавляю в Lua скрипт эти две строчки - то начинает вызываться. Ну и хорошо, что мне еще нужно :)
  Проблема в том что Вы неправильно ее описываете в dll.
Ваша DLL - это таблица которая размещается в глобальном стеке, а колбек - это функция которая размещается в глобальном стеке
Когда Вы присвоите функции вашу функцию тогда и вызывается.  
 
Я делаю так:

 
Код
    static int global_callback__OnQuote(lua_State  *   L)
{
    std::cout   <    <     "global_callback__OnQuote"     <    <   std::endl;

      return     0  ;
}



extern  "C"  LUALIB_API int luaopen_DLL(lua_State   *   L)     
{
    
    luaL_newlib(L, ls_lib);

    lua_pushcfunction(L, global_callback__OnQuote);
    lua_setglobal(L,  "OnQuote" );

}    
 
Каким образом дополнительно нужно присвоить "функцию моей функции" ?
Ну Вы же сами написали, что это сделали?
Покажите как Вы это сделали в скрипте.
В скрипте я дополнил ровно вот эти две строчки:
Код
function OnQuote(class, sec)
end
Просто вы же сами написали, что я неправильно описываю ее в dll, да и BVladimir, что вроде бы может работать без указания этих двух строчек в скрипте.

Собсвенно работает и хорошо, но теперь мне все таки интересно - может ли это работать без указания OnQuote в скрипте или нет.
 
Цитата
Quikos написал:
Цитата
В скрипте я дополнил ровно вот эти две строчки:
Код
   function   OnQuote (class, sec)
 end   
Просто вы же сами написали, что я неправильно описываю ее в dll, да и  BVladimir , что вроде бы может работать без указания этих двух строчек в скрипте.

Собсвенно работает и хорошо, но теперь мне все таки интересно - может ли это работать без указания OnQuote в скрипте или нет.
Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем.
--------------------------
Вы  dll  сделали правильно (если выкинуть лишнее, из того что Вам написали)
Но Вы не объявили Вашу функцию колбеком.
-----------------------

Как вариант,вы можете вызвать вашу функцию внутри
например так:
Код
--здесь загрузите вашу dll
function OnQuote (class, sec)
----  здесь вызов вашей функции из вашей dll
end
 
Цитата
nikolz написал:
 Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем.
--------------------------
Вы  dll  сделали правильно (если выкинуть лишнее, из того что Вам написали)
Но Вы не объявили Вашу функцию колбеком.
-----------------------

Как вариант,вы можете вызвать вашу функцию внутри
например так:
Код
   --здесь загрузите вашу dll 
 function  OnQuote (class, sec)
 ----  здесь вызов вашей функции из вашей dll 
 end 
  
Не понимаю, что значит я просто обьявил функцию, но не сделал ее колбеком ?
Я обявил Сишную функцию и связал ее с именем реальной глобальной квиковской функции - OnQuote.

Что значит не сделал ее колбеком ? И что такое " ----  здесь вызов вашей функции из вашей dll".
Функция OnQuote вызывается не мной - а самим Квиком.
 
Цитата
Quikos написал:
Цитата
nikolz написал:
 Так Вы просто сделали функцию OnQuote но ваша dll вообще здесь не причем.
--------------------------
Вы  dll  сделали правильно (если выкинуть лишнее, из того что Вам написали)
Но Вы не объявили Вашу функцию колбеком.
-----------------------

Как вариант,вы можете вызвать вашу функцию внутри
например так:  
Код
      --здесь загрузите вашу dll  
  function   OnQuote (class, sec)
  ----  здесь вызов вашей функции из вашей dll  
  end  
    
 
Не понимаю, что значит я просто обьявил функцию, но не сделал ее колбеком ?
Я обявил Сишную функцию и связал ее с именем реальной глобальной квиковской функции - OnQuote.

Что значит не сделал ее колбеком ? И что такое " ----  здесь вызов вашей функции из вашей dll".
Функция OnQuote вызывается не мной - а самим Квиком.
покажите где КВИК  в скрипте, который написали Вы,  загрузил вашу  dll
 
Цитата
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()
 
Цитата
Quikos написал:
function main()

Quik_Lua_connector = require("Quik_Lua_connector ")  
Блин, так вот он и секрет.
Не надо require внутрь main() размещать. Должно быть расположено вне любых функций.
 
Цитата
swerg написал:
Цитата
Quikos написал:
function main()

Quik_Lua_connector = require("Quik_Lua_connector ")  
Блин, так вот он и секрет.
Не надо require внутрь main() размещать. Должно быть расположено вне любых функций.
Работает!!!
Большое Спасибо!
Страницы: 1
Читают тему
Наверх