程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 將Lua嵌入到自己的程序中

將Lua嵌入到自己的程序中

編輯:關於VC++

原文:http://www.codeproject.com/KB/cpp/lua.aspx

介紹

本文介紹將Lua嵌入到自己程序中的方法。

什麼是Lua

Lua是具有簡單數據描述的擴展編程語言(動態解析語言)。它提供了非常好的面向對象編程, 函數式編程(functional programming),數據驅動式編程(data-driven programming), 它可以作為一個強大、輕量的腳本語言,供任何需要的程序使用。Lua 以一個用 clean C 寫成的庫形式提供。(所謂 Clean C ,指的 ANSI C 和 C++ 中共通的一個子集)

Lua例子(FOR 循環)

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

詳細描述可以參考Lua網站http://www.lua.org/about.html

背景

本例子是WTL程序(簡單的HTML幫助系統),結合Lua腳本作為參數和內容的定制。

定義的Lua函數如下:

-- # 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

現在我將展示如何使用Lua/C++創建這些函數。

代碼

1. 首先要做的是創建含Lua的DLL

2. 在工程裡做如下鏈接:

//
// For sample:
//
//---------------------------------------------
// Library Linkage
//---------------------------------------------
//-
#if defined (_DEBUG)
#pragma comment( lib, "lua.lib" ) // Lua Support
#else
#pragma comment( lib, "lua.lib" ) // Lua Support
#endif
//-

記得:要更改項目的屬性Project Property -> linker -> general -> additional library directory

到lua lib所在目錄。

3. 添加Lua包含文件:

extern "C"
{
#include "lua.h"
}

記得:要更改項目的屬性 Project Property -> C/C++ -> general -> additional include directories

到lua include所在目錄。

注意:lua lib裡的所有文件保持"c"的擴展名,因為Lua采用ANSI C編寫。

4. 現在我們需要按如下方式啟動Lua VM

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. 現在我們寫Lua 和 C/C++ 結合的函數

Lua API函數可以這樣寫:

lua_register(s, n, g)

這裡:

s:是lua_State

n:暴露給Lua的函數名稱

g: C/C++中的結合函數

請看下面例子:

//...
// 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. 現在我們需要加載並執行Lua腳本//...
// Do things with lua
code.
lua_register( luaVM, "SetHome", l_SetHome );
//more glue
functions
lua_dofile(luaVM, "hrconf.lua");
//...

執行Lua API函數可以這樣:lua_dofile(s, p)

這裡:

s: 是lua_State

p: 是Lua腳本文件

為了完全理解Lua API,可以參考Lua 參考手冊http://www.lua.org/manual/5.1/manual.html

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved