[笔记]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

效果


相关文章
|
7月前
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
383 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
7月前
|
NoSQL Redis 数据库
Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
253 13
|
9月前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
143 6
|
11月前
|
存储 Java C++
lua完整学习笔记
Lua学习笔记,涵盖了Lua的注释、数据结构、标识符、保留字、变量、运算符、函数、流程控制语句、循环语句、table的使用、迭代器以及模块化等基础知识点。
167 3
lua完整学习笔记
|
11月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
132 2
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
399 0
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
442 1
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
456 0