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

221 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

@[toc]

方法一

创建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

效果

在这里插入图片描述