lua封装mci库

scorlw 发布于

lua封装mci库

之前的方法都是针对于本身就有lua接口的库来说的,对于一般的库,可以通过在lua源代码中增加接口的方式实现封装。

构建libluawithmci.a

  1. 在lua源代码的src文件夹中添加lmci.c文件如下:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/*
** $Id: lbitlib.c,v 1.30.1.1 2017/04/19 17:20:42 roberto Exp $
** Standard library for bitwise operations
** See Copyright Notice in lua.h
*/

#define lmcilib_c
#define LUA_LIB

#include "lprefix.h"
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

#include "mci.h"

#define pushunsigned(L,n) lua_pushinteger(L, (lua_Integer)(n))
#define checkunsigned(L,i) ((lua_Unsigned)luaL_checkinteger(L,i))

static struct NcInterface *_pMci=NULL;

static int mc_moveref(lua_State *L)
{
printf("moveref\n");
return 1;
}

static int mc_connect(lua_State *L)
{
if( _pMci )
{
if( _pMci->nci_init(_pMci) == -1)
{
printf("erro\n");
_pMci->nci_destroy(_pMci);
_pMci = NULL;
}
else
{
printf(" nci_init ok!\n");
}
}
return 1;
}

static int mc_set_mode_auto( lua_State *L )
{
if( _pMci) _pMci->nci_ch_set_mode(_pMci,0,eCH_MODE_AUTO);
else printf("_pMci is NULL\n");
return 1;
}

static const luaL_Reg mcilib[] = {
{"mc_connect", mc_connect},
{"mc_moveref", mc_moveref},
{"mc_set_mode_auto",mc_set_mode_auto},
{NULL, NULL}
};

LUAMOD_API int luaopen_mci (lua_State *L)
{
luaL_newlib(L, mcilib);
_pMci = nci_create(0,"127.0.0.1","c:\\nc_cfg.nml",NULL);
if( !_pMci ) printf(" nci_create failure!\n");
return 1;
}
  1. 新建luawithmci的lib工程,移除源文件,将src文件夹中的文件添加到工程中。
  2. 工程包含mci.lib,并把包含mci.h的文件路径添加到搜索路径中。
  3. 编译,生成libluawithmci.a。

测试工程

  1. 新建testmci工程,包含libluawithmci.a和mci.lib,并把包含mci.h的文件路径添加到搜索路径中。

  2. main.cpp如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <iostream>
    #include <windows.h>

    using namespace std;

    extern "C" {
    #include "lua.h"
    #include "lualib.h"
    #include "lauxlib.h"
    #include "luaconf.h"
    }

    int main()
    {
    cout << "Hello world!" << endl;
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_dofile(L, "D:\\CodeBlocks\\workspace\\0610test\\testmci\\bin\\Debug\\tst.lua");
    lua_close(L);
    return 0;
    }

    其中,tst.lua如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    function show()
    local b = {}
    local index

    for index = 1,10,1 do
    print(index)
    end
    end
    print("test0")
    show()
    print("test1")
    require("mci")
    print("test2")
    mci.mc_connect()
    print("test3")
    mci.mc_set_mode_auto()
    print("test4")
    mci.mc_moveref()
    print("test5")

    结果为:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Hello world!
    test0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    test1
    test2
    nci_init ok!
    test3
    test4
    moveref
    test5