[笔记]Lua脚本学习笔记《二》调用cpp动态库

简介: [笔记]Lua脚本学习笔记《二》调用cpp动态库

方法一

创建VS dll项目

#ifndef CPP_DLL_API_H
#define CPP_DLL_API_H
#ifdef __cplusplus
#define EXTERN_C extern "C"
#else
#define EXTERN_C extern "C"
#endif
#ifndef EXPORT_API
#define EXPORT_API EXTERN_C __declspec(dllexport)
#else
#define EXPORT_API EXTERN_C __declspec(dllimport)
#endif
#endif
#include "cpp_dll_lib_api.h"
extern "C"{
#include <lua.h>
#include <lauxlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <lualib.h>
#include <math.h>
}
#include <Windows.h>
EXPORT_API int Add(lua_State *L){
  int param_count = lua_gettop(L);
  if (param_count != 2) {
    lua_pushnil(L);
    lua_pushstring(L, "ShowMessageBox: param num error");
    return 2;
  }
  int arg1 = luaL_checknumber(L, 1);
  int arg2 = luaL_checknumber(L, 2);
  lua_pushnumber(L, arg1 + arg2);
  return 1;
}
EXPORT_API int ShowMessageBox(lua_State *L)
{
  int param_count = lua_gettop(L);
  if (param_count != 2) {
    lua_pushnil(L);
    lua_pushstring(L, "ShowMessageBox: param num error");
    return 2;
  }
  const char * sTitle = luaL_checkstring(L, 1);
  const char * sText = luaL_checkstring(L, 2);
  if (sTitle == NULL || strlen(sTitle) == 0 || sText == NULL || strlen(sText) == 0) {
    lua_pushnil(L);
    lua_pushstring(L, "ShowMessageBox: param error");
    return 2;
  }
  int ret = MessageBoxA(NULL, sTitle, sText, 0);
  lua_pushnumber(L, ret);
  return 1;
}

Lua脚本

将dll放到lua/clib中

local pf = package.loadlib("cpp_dll_lib.dll","ShowMessageBox")
print(pf)
pf("hello", "again")

dumpbin查看导出函数

dumpbin.exe /exports .\cpp_dll_lib.dll

dumpbin在(不同版本vs不同路径 我这里是vs2013的)

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin

效果


相关文章
|
1月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
63 0
|
2月前
|
算法 NoSQL Java
springboot整合redis及lua脚本实现接口限流
springboot整合redis及lua脚本实现接口限流
76 0
|
2天前
|
存储 NoSQL 调度
Redis Lua脚本:原子性的真相揭秘
【4月更文挑战第20天】
10 0
Redis Lua脚本:原子性的真相揭秘
|
22天前
|
NoSQL Java Redis
lua脚本做redis的锁
这段内容是关于使用Redis实现分布式锁的Java代码示例。`RedisLock`类包含`lock`和`unlock`方法,使用`StringRedisTemplate`和Lua脚本进行操作。代码展示了两种加锁方式:一种带有过期时间,另一种不带。还提到了在加锁和解锁过程中的异常处理,并提供了相关参考资料链接。
18 3
|
24天前
|
存储 NoSQL 数据处理
Redis Lua脚本:赋予Redis更强大的逻辑与功能
Redis Lua脚本:赋予Redis更强大的逻辑与功能
|
1月前
|
监控
通过Lua脚本实现禁止员工上班玩游戏的软件的自动化任务管理
使用Lua脚本,企业可以自动化管理员工行为,防止上班时间玩游戏。Lua是一种轻量级脚本语言,适合编写监控任务。示例脚本展示了如何检测工作时间内员工是否玩游戏,并在发现时执行相应操作,如关闭游戏或发送警告。此外,另一脚本演示了如何将监控数据通过HTTP POST自动提交到网站,以实现有效的行为管理。这种解决方案灵活且可定制,有助于提升工作效率。
123 1
|
1月前
|
NoSQL Java 数据库
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
优惠券秒杀案例 - CAS、Redis+Lua脚本解决高并发并行
|
1月前
|
Java API Maven
|
2月前
|
NoSQL Java 数据处理
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
Redis和Spring Boot的绝佳组合:Lua脚本的黑科技
57 0
|
3月前
|
存储 NoSQL 关系型数据库
Redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
Redis协议与异步方式(redis网络层、pipeline、事务、lua脚本、ACID特性、发布订阅、hiredis实现同步连接与异步连接)
73 0