vs 2022 生成c++ dll, lua调用

10 篇文章 0 订阅

前提:

需要下载lua源代码,并且获取 lua.lib文件
有些lua的源代码已经编译过了,附带lib文件,可直接用;
如果没有,可以看这篇文章:静态库编译

一、dll 项目创建及项目属性设置

查看我的另一篇文章,创建及属性设置都一样。
vs2022编译c 动态库,以及调用

二、c++ dll 代码

这里生成一个可以获取随机数的dll

#include<Windows.h>
#include "lua.hpp"
#include<iostream>
#include<time.h>
#pragma comment(lib, "luaLib.lib")	// 这里需要lua的静态库,否则lua api 无法被调用
//static inline double timeout_gettime(void) {
//    FILETIME ft;
//    double t;
//    GetSystemTimeAsFileTime(&ft);
//    /* Windows file time (time since January 1, 1601 (UTC)) */
//    t = ft.dwLowDateTime / 1.0e7 + ft.dwHighDateTime * (4294967296.0 / 1.0e7);
//    /* convert to Unix Epoch time (time since January 1, 1970 (UTC)) */
//    return (t - 11644473600.0);
//}

static int getRand(lua_State* L) {
	int n = lua_gettop(L);
    double a, b, temp;
    srand(time(NULL));
	if (n == 0) {
        a = 0;
        b = time(NULL);
    }
    else if(n == 1) {
        a = 0;
        b = lua_tonumber(L, -1);
        lua_pop(L, -1);
    }
    else {
        a = lua_tonumber(L, -1);
        b = lua_tonumber(L, -1);
        lua_pop(L, -1);
        lua_pop(L, -1);
        if (a > b) {
            temp = a;
            a = b;
            b = temp;
        }
    }
    int randValue = rand() % int(b - a + 1) + a;
    lua_pushnumber(L, randValue);	// 返回结果需要入栈
    return 1;	// 执行成功,返回一
}
// 注册结构
static const luaL_Reg m_funcs[]{
    {"getRand", getRand},
    {NULL, NULL}
};
// 注册函数【luaopen_xxx 必须是 dll的名称,即 xxx.dll】
extern "C" int __declspec(dllexport) luaopen_cppdll2(lua_State *L) {
    luaL_newlib(L, m_funcs);	// 创建一个新表,并将函数入栈
    return 1;
}

注:直接点:
菜单:生成->生成xxxdll

三、lua代码编写

local cppdll2 = require "cppdll2" // 这个就是导出dll名称,为了防止获取失败,新手建议直接把lua放dll同目录下
print(cppdll2.getRand())	// 直接调用随机值函数
print(cppdll2.getRand(10))	// 直接调用随机值函数
print(cppdll2.getRand(10, 100))	// 直接调用随机值函数

注意:
一定要确保lua.exe 的版本和 生成dll用到的头文件 和 lib文件 版本一致,不然会执行失败!!!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值