[笔记]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月前
|
存储 Java C++
lua完整学习笔记
Lua学习笔记,涵盖了Lua的注释、数据结构、标识符、保留字、变量、运算符、函数、流程控制语句、循环语句、table的使用、迭代器以及模块化等基础知识点。
44 3
lua完整学习笔记
|
1月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
29 2
|
5月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
227 0
|
2月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
3月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
5月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
198 0
|
5月前
|
消息中间件 NoSQL Java
Spring Boot中使用Redis和Lua脚本实现延时队列
Spring Boot中使用Redis和Lua脚本实现延时队列
|
5月前
|
NoSQL Java Redis
redis的lua脚本
在 Lua 脚本中,可以使用redis.call()函数来执行Redis命令.
54 0
|
6月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
248 1
|
6月前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
226 0