Lua模块从DllMain推送C函数

时间:2013-04-05 22:52:04

标签: c++ c lua

我遇到了大问题。如您所知,Lua允许制作模块,您可以使用5.1(之前的loadlib)中的require()函数加载这些模块。

#define LUA extern "C" __declspec(dllexport) int __cdecl

static int l_TestFunc(lua_State * L) 
{

    lua_pushboolean (L, 1); // return true

    return 1;
}

LUA luaopen_MyModule(lua_State *L)
{

    printf("test2");
    lua_pushcfunction(L, l_TestFunc);
    lua_setglobal(L, "TestFunc");

    return 1;
}

所以在Lua中你只是使用require("MyModule")并且一切正常。(luaopen_ *是入口点)

但我需要使用标准方式(DllMain作为入口点)。我试过但它没用。 有什么想法吗?

2 个答案:

答案 0 :(得分:0)

  

但我需要使用标准方式(DllMain作为入口点)。我试过但它没有用。有什么想法吗?

DllMain始终是您的入口点(如果已定义),但您无法使用它来加载您的函数,因为您没有Lua状态可以将它们加载到那里。 / p>

当你跑步"要求"在Lua代码中,执行该代码的应用程序(例如lua.exe)将加载您的DLL(调用DllMain),然后调用luaopen_MyModule 传递执行require语句的Lua状态。您的DllMain无法访问该状态指针...


......好吧,没有普通的方式。您可以解决问题,以便主机应用程序将Lua状态的内存位置写入您的DLL(注册表,文件等)可访问的某个外部位置你的DLL。您的DLLMain可以将指针寄存器及其功能提取到该状态。不确定你为什么要这样做,但是用C语这样的技术可行。

这需要您编写主机,因此您可以安排在某处编写状态。或者你可以有一个单独的模块,加载普通方式,写入Lua_state值,然后所有其他模块可以从他们的DllMains访问它。


这闻起来很像XY Problem。小心分享为什么你想在DllMain中注册你的功能?

答案 1 :(得分:0)

试试这个......

不使用require("MyModule")luaopen_MyModule中的名称MyModule,而是使用注入DLL的可执行文件的名称。如果这不起作用,请将require调用更改为.exe

Lua的要求是调用Win32 LoadLibrary,然后调用GetProcAddress来查找luaopen函数。两个调用都将使用参数require()。似乎PE注入使注入的DLL中的所有函数看起来就像它们在EXE模块中一样。因此,您需要LoadLibrary将句柄返回到EXE模块,然后GetProcAddress将找到注入的luaopen函数。

这可能不起作用的原因有几个。一个是Lua的要求确实要求DLL文件名和DLL模块名匹配。这不是Win32的要求,因此可能不适用于您的可移植可执行文件。