Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Using Lua in your application

0.00/5 (No votes)
5 May 2005 1  
Way to integrate Lua in your application.

*Lua script (below) to customize preferences and content of UI (above).

Introduction

This article shows a way to integrate Lua in your application.

What is Lua?

Lua is an extension programming language designed to support general procedural programming with data description facilities. It also offers good support for object-oriented programming, functional programming, and data-driven programming. Lua is intended to be used as a powerful, light-weight configuration language for any program that needs one. Lua is implemented as a library, written in clean C (that is, a common subset of ANSI C and C++).

Sample of Lua Syntax (FOR loop):

for i=1,10 do
    -- the first program in every language
    io.write("Hello world, from ",_VERSION,"!\n")
end
  • For full description see: About.

Background

This sample is a WTL application (simple HTML help systems), that integrates Lua scripts to customize preferences and content.

It defines the Lua function:

-- # MessageBox
--------------------------------------------------------
-- int MessageBox(
-- string msg, |= Message to display
-- string capition |= Capition of Box
-- );
-- Return Value:
-- if 1 the user click in OK or user close the box


-- # ShowContentPainel
-----------------------------------------------------------------
-- void ShowContentPainel(
-- bool bShow |= If true, the painel start opened, if false not.
-- );

-- # SetWindowStartSize
-----------------------------------------------------------------
-- void SetWindowStartSize(
-- number w, |= Start W size of window
-- number h, |= Start H size of window
-- );
-- Remarks:
-- if this function is not called, the default size is 800 x 600

-- # SetMinWindowSize
-----------------------------------------------------------------
-- void SetMinWindowSize(
-- number w, |= Minimum W size of window
-- number h, |= Minimum H size of window
-- );

-- # SetTitle
-----------------------------------------------------------------
-- void SetTitle(
-- string title |= Text that be title of window.
-- );

-- # Navigate
-----------------------------------------------------------------
-- void Navigate(
-- string url |= Url
-- );

-- # InsertItemInPainel
-----------------------------------------------------------------
-- void InsertItemInPainel(
-- string title, |= Text displayed in tree
-- string url, |= Url
-- number icon, |= Icon of item, the possible values 
                           ---are: 0 = BOOK, 1 = FILE, 2 = NETFILE
-- number id, |= Id of item, this has to be unique and start in 1
-- number idp |= Parent item, this is a ID of a item that is 
                                ---the parent or '0' for root item.
-- );
-- sample:
-- ICON BOOK / ID 1 / In ROOT
-- InsertItemInPainel("Trinity Systems", 
            "http://www.novaamerica.net/trinitysystems/", 0, 1, 0); 
-- ICON NETFILE / ID 2 / In ID1 (Trinity Systems)
-- InsertItemInPainel("Orion", 
       "http://www.novaamerica.net/trinitysystems/Orion", 2, 2, 1); 

-- # ExpandItemInPainel
------------------------------------------------------------------
-- void ExpandItemInPainel(
-- string id |= Id of item
-- );
-- Remarks:
-- This function need to be called after InsertItemInPainel's

...and now I'll show you how to create these functions in Lua/C++.

Code

  1. The first thing to do is to build the DLL that contains Lua. (download Lua DLL demo project)
  2. Link this in your project:
    //
    
    // For sample:
    
    //
    
    //---------------------------------------------
    
    // Library Linkage
    
    //---------------------------------------------
    
    //-
    
    #if defined (_DEBUG)
    #pragma comment( lib, "lua.lib" ) // Lua Support
    
    #else
    #pragma comment( lib, "lua.lib" ) // Lua Support
    
    #endif
    //-

    Remember: To change your Project Property -> linker -> general -> additional library directory: lua lib directory.

  3. Add Lua include files:
    extern "C" 
    {
    #include "lua.h"
    
    }

    Remember: To change your Project Property -> C/C++ -> general -> additional include directories: lua include directory.

    Notice that all the files in lua lib need to stay with "c" extension, because Lua was written to be ANSI C compliant.

  4. Now we need to start Lua VM as follows:
    LRESULT OnCreate(UINT 
    /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& 
    /*bHandled*/)
    {
    //...
    
    // Lua
    
    //
    
    lua_State *luaVM = lua_open(); /* 
    Open Lua */
    //
    
    luaopen_base(luaVM );     /* opens the 
    basic library */
    luaopen_table(luaVM );    /* opens the table 
    library */
    luaopen_io(luaVM );       /* opens 
    the I/O library */
    luaopen_string(luaVM );   /* opens the string 
    lib. */
    luaopen_math(luaVM );     /* opens the math lib. 
    */
    if (NULL == 
    luaVM)
    {
             
    MessageBox("Error Initializing lua\n");
    }
    //...
    
    // Do things with lua 
    
    code.
    // see below
    
    //...
    
    lua_close(luaVM); /* Close Lua */
    //
    
    // 
    
    End
    //...
    
    }
  5. Now we make a glue function of Lua and C/C++.

    The Lua API function to do this is:

    lua_register(s, n, g)

    where

    • s: is the lua_State to register the function.
    • n: is the name of the function exposed to Lua.
    • g: the C/C++ glue function.

    See the sample:

    //...
    
    // Do things with 
    
    lua code.
    lua_register( luaVM, "SetHome", l_SetHome );
    //...
    
    // 
    
    -------------------------------------------
    // 
    
    #Lua Functions
    // 
    
    ------------------------------------------
    //
    
    static 
    int l_SetTitle( lua_State* 
    luaVM)
    {
             const char* 
    title = luaL_checkstring(luaVM, 
    1);
             
    theMainFrame->SetWindowText(title);
             
    return 0;
    }
  6. Now we need the load and execute Lua scripts:
    //...
    
    // Do things with lua 
    
    code.
    lua_register( luaVM, "SetHome", l_SetHome );
    //more glue 
    
    functions
    lua_dofile(luaVM, "hrconf.lua");
    //...

    The Lua API function to do this is:

    lua_dofile(s, p)

    where

    • s: is the lua_State to register the function.
    • p: path for Lua script file.

    See the demo script.

For a complete understanding of the Lua API, see: Lua 5.0 Reference Manual.

Points of interest

History

  • 29th April 2005: First release.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here