Lua 與 C 擴充 -C++類別

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 後的結果

回到目錄
https://husking-studio.com/extending-lua-with-c

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *