51 (2016-09-29 11:42:02 отредактировано sam063rus)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

-

52 (2016-11-28 01:31:43 отредактировано slavon)

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Привет всем!

Я тут немного покопался в документации и разобрался как посылать таблицы в dll и возвращать их обратно в lua. Может кому-нибудь пригодится:

Вызов из луа:

  tab = { {x = 2.79, k = 13, s = 'xxxx', fl = true}, {x = 1.79, k = 23, s = 'yyyy', fl = false} }
  tab1, tab2 = MyLib.testFunc( 2.79, 13, tab, 'asdf', true )
  for index, struct in pairs(tab1) do
    print( index )
    for key, val in pairs(struct) do
      print( key, '=', val )
    end
  end
  for index, struct in pairs(tab2) do
    print( index )
    for key, val in pairs(struct) do
      print( key, '=', val )
    end
  end

вывод скрипта:

3
s    =    asdf
x    =    2.79
k    =    13
fl    =    true
5
k    =    13
x    =    2.79
s    =    asdf
fl    =    true
1
str    =    xxxx
num    =    16.79
2
str    =    yyyy
num    =    24.79


Код функции в dll:

struct someDataFromLua
{
    double x;
    int k;
    const char* s;
    bool fl;
};

// Args: double x, int k, /*table book, */string s, bool fl
static int testFunc( lua_State* L )
{
    double x = lua_tonumber( L, 1 );
    int k = lua_tointeger( L, 2 );
    const char* s = lua_tostring( L, 4 );
    int fl = lua_toboolean( L, 5 );

    lua_createtable( L, 2, 0 );

    lua_pushstring( L, "3" );

    lua_createtable( L, 4, 0 );
    lua_pushstring( L, "x" );
    lua_pushnumber( L, x );
    lua_settable( L, -3 );
    lua_pushstring( L, "k" );
    lua_pushinteger( L, k );
    lua_settable( L, -3 );
    lua_pushstring( L, "s" );
    lua_pushstring( L, s );
    lua_settable( L, -3 );
    lua_pushstring( L, "fl" );
    lua_pushboolean( L, fl );
    lua_settable( L, -3 );
    lua_settable( L, -3 );

    lua_pushstring( L, "5" );
    lua_createtable( L, 4, 0 );

    lua_pushstring( L, "fl" );
    lua_pushboolean( L, fl );
    lua_settable( L, -3 );
    lua_pushstring( L, "s" );
    lua_pushstring( L, s );
    lua_settable( L, -3 );
    lua_pushstring( L, "k" );
    lua_pushinteger( L, k );
    lua_settable( L, -3 );
    lua_pushstring( L, "x" );
    lua_pushnumber( L, x );
    lua_settable( L, -3 );
    
    lua_settable( L, -3 );

    unsigned tabLen = lua_objlen( L, 3 );

    someDataFromLua* pData = new someDataFromLua[tabLen];

    lua_pushnil( L );
    unsigned i = 0;
    while( lua_next( L, 3 ) != 0 && i < tabLen ) // ...and pushes nothing
    {
        lua_getfield( L, -1, "x" );
        pData[i].x = lua_tonumber( L, -1 );
        lua_getfield( L, -2, "k" ); 
        pData[i].k = lua_tointeger( L, -1 );
        lua_getfield( L, -3, "s" ); 
        pData[i].s = lua_tostring( L, -1 );
        lua_getfield( L, -4, "fl" ); 
        pData[i].fl = lua_toboolean( L, -1 ) != 0;
        lua_pop( L, 5 );
        ++i;
    }

    lua_createtable( L, tabLen, 0 );
    for( i = 0; i < tabLen; i++ )
    {
        lua_pushinteger( L, int(i) + 1 );

        lua_createtable( L, 2, 0 );
        lua_pushstring( L, "str" );
        lua_pushstring( L, pData[i].s );
        lua_settable( L, -3 );
        lua_pushstring( L, "num" );
        lua_pushnumber( L, pData[i].x + double( pData[i].k ) + double( pData[i].fl ) ); // считаем сумму x + k + fl чтобы вывод занимал меньше места
        lua_settable( L, -3 );

        lua_settable( L, -3 );
    }

    return 2;
}

53

Re: Создание собственной DLL на C++ для LUA (в QUIK)

Полностью скопировал ваш код.
Делаю Build Solution
Посыпались такие ошибки. Подскажите что делать.
http://dl4.joxi.net/drive/2018/08/16/0011/1313/742689/89/4a734dd8f7.png

54

Re: Создание собственной DLL на C++ для LUA (в QUIK)

astro-12 пишет:

Полностью скопировал ваш код.
Делаю Build Solution
Посыпались такие ошибки.

Подозреваю, что пропущен вот этот шаг:
https://quik2dde.ru/static-img/cpp_lua-2-01.png

И ещё: файл lua5.1.dll не надо добавлять в solution, уберите его.