【问题标题】:Lua module pushing C functions from DllMainLua 模块从 DllMain 推送 C 函数
【发布时间】:2013-03-28 12:23:59
【问题描述】:

我有该死的大问题。如您所知,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 作为入口点)。我试过了,但没有用。 有什么想法吗?

【问题讨论】:

  • "但我需要使用标准方式(DllMain 作为入口点)。" ...为什么?

标签: c++ c lua


【解决方案1】:

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

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

当您在 Lua 代码中运行“require”时,执行该代码的应用程序(例如 lua.exe)将加载您的 DLL(调用 DllMain),然后调用 luaopen_MyModule传入 Lua 状态执行了require语句。您的 DllMain 无法访问该状态指针...


...嗯,没有普通的方式。您可以解决一些问题,以便主机应用程序将 Lua 状态的内存位置写入您的 DLL 可访问的某个外部位置(注册表、文件等)在加载之前你的DLL。您的 DLLMain 可以获取指针寄存器并将其功能置于该状态。不知道您为什么要这样做,但在像 C 这样的语言中,这在技术上是可行的。

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


这闻起来很像XY Problem。愿意分享为什么你想在 DllMain 中注册你的函数?

【讨论】:

    【解决方案2】:

    试试这个...

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-28
      • 2018-12-21
      • 2012-01-27
      • 2021-12-09
      • 1970-01-01
      • 2012-01-27
      • 2021-12-27
      • 2013-02-08
      相关资源
      最近更新 更多