2

Lua のサイトからダウンロードできる Lua52.exe バイナリを使用しています。私が作成した DLL で機能を拡張したいと考えています。そこで、VS DLL プロジェクトに Lua ソースを含めた DLL を作成しました。そのコードは以下です。Lua52.exe で実行する lua ファイルで次の操作を行うと、「複数の Lua VM が検出されました」というエラーが表示されます。したがって、Lua52.exe には lua52.dll が付属しているため、動的にリンクされていると想定し、起動時に lua52.dll をロードして lua VM を起動します。DLL がロードされると、渡された lua_State が lua52.exe からのものであると思われます。VMの話は何ですか?DLL 内の lua に対して動的にリンクする必要がありますか? どうにかして DLL が lua VM を作成しないようにすることはできますか? つまり、自分でやっているのではないので、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;
}
4

1 に答える 1