Lua 與 C 擴充 -C++類別
環境
windows 11 64bit
Visual Studio 2022
Lua 5.4.6
下載這個檔案 – lunar.h
https://www.dropbox.com/scl/fi/wi9sxxuxbb3dunpl5mjll/lunar.h?dl=0&rlkey=ope8e6th3gbunwq59g7t85q4t
寫一個簡單的 class
pirate.h
#ifndef __PIRATE_H
#define __PIRATE_H
#include "lunar.h"
class CPirate
{
private:
int m_nAge;
char m_szName[128];
public:
static const char className[];
static Lunar<CPirate>::RegType methods[];
public:
CPirate(lua_State *L);
~CPirate();
int GetAge(lua_State *L);
int SetAge(lua_State *L);
int GetName(lua_State *L);
int SetName(lua_State *L);
};
extern "C"
{
int __declspec(dllexport) luaopen_pirate(lua_State *L);
}
#endif
pirate.cpp
#include "pirate.h"
#include <string.h>
const char CPirate::className[] = "Pirate";
Lunar<CPirate>::RegType CPirate::methods[] = {
LUNAR_DECLARE_METHOD(CPirate, GetAge),
LUNAR_DECLARE_METHOD(CPirate, SetAge),
LUNAR_DECLARE_METHOD(CPirate, GetName),
LUNAR_DECLARE_METHOD(CPirate, SetName),
{0,0}
};
CPirate::CPirate(lua_State *L)
{
m_nAge = luaL_checknumber(L, 1);
}
CPirate::~CPirate()
{
printf("deleted Pirate\n");
}
int CPirate::GetAge(lua_State *L)
{
lua_pushnumber(L, m_nAge);
return 1;
}
int CPirate::SetAge(lua_State *L)
{
m_nAge = luaL_checknumber(L, 1);
return 0;
}
int CPirate::GetName(lua_State *L)
{
lua_pushstring(L, m_szName);
return 1;
}
int CPirate::SetName(lua_State *L)
{
strcpy_s(m_szName, lua_tostring(L, 1));
return 0;
}
extern "C" {
int luaopen_pirate(lua_State *L)
{
Lunar<CPirate>::Register(L);
return 1;
}
}
寫 compile 指令 – compile.bat
cl /LD /MD pirate.cpp K:\Lua\546\lib17\x86\Release\lua54.lib
打開 VS 的文字控制編譯器 – VC.bat
@echo off
%comspec% /k ""C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat"" x86
打開之後輸入 compile,編譯完成
主要是要產生 pirate.dll
test.lua
require("pirate")
function Pirate:getName()
return self:GetName()
end
function Pirate:setName(name)
self:SetName(name)
end
function Pirate:getAge()
return self:GetAge()
end
function Pirate:setAge(age)
self:SetAge(age)
end
a = Pirate(100)
print(a:getAge())
a:setAge(90)
print(a:getAge())
a:setName("abc")
print(a:getName())
b = Pirate:new(20)
print(b:getAge())
把 pirate.dll 和 test.lua 放一起,執行 test.lua 後的結果