我使用的是 Lua52.exe 二进制文件,你可以从 Lua 的网站下载。我想用我写的 DLL 扩展它的功能。因此,我编写了一个 DLL,其中我将 Lua 源代码包含到了我的 VS DLL 项目中。该代码如下。当我在通过 Lua52.exe 运行的 lua 文件中执行以下操作时,我收到错误“检测到多个 Lua VM”。所以 Lua52.exe 带有 lua52.dll 所以我假设它是动态链接的,当它启动时它会加载 lua52.dll 来启动一个 lua VM。当我的 DLL 被加载时,我怀疑传入的 lua_State 来自 lua52.exe。VM在谈论什么?我必须在我的 DLL 中动态链接到 lua 吗?我可以让我的 DLL 不以某种方式创建一个 lua 虚拟机吗?我的意思是我不是自己做的,所以 lua 源中的某些东西必须是。
package.loadlib("LuaDLLTest.dll", "luaopen_msglib")()
#define DLL_EXPORT extern "C" __declspec(dllexport)
#include "lua.hpp"
#define PI (3.14159265358979323846)
static int miles_to_km(lua_State *L)
{
double miles = luaL_checknumber(L, 1);
double km = miles * 1.609;
lua_pushnumber(L, km);
return 1; /* one result */
} /* end of miles_to_km */
static int circle_calcs(lua_State *L)
{
double radius = luaL_checknumber(L, 1);
double circumference = radius * 2 * PI;
double area = PI * radius * radius;
lua_pushnumber(L, circumference);
lua_pushnumber(L, area);
return 2; /* one result */
} /* end of miles_to_km */
static const luaL_Reg testlib[] =
{
{ "miles_to_km", miles_to_km },
{ "circle_calcs", circle_calcs },
{ NULL, NULL }
};
/*
** Open msg library
*/
DLL_EXPORT int luaopen_msglib(lua_State *L)
{
lua_newtable(L);
luaL_setfuncs(L, testlib, 0);
lua_setglobal(L, "Math");
return 1;
}