Lua模块从dlmain推入C函数
Lua module pushing C functions from DllMain
我有大麻烦了。如你所知,Lua允许创建模块,你可以用require()函数从5.1(以前的loadlib)加载这些模块。
#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作为入口点)。我试过了,但没有用。有什么想法吗?
DllMain总是你的入口点(如果定义),但你不能用它来加载你的函数,因为你没有Lua状态来加载它们。
当你在Lua代码中运行"require"时,执行该代码的应用程序(例如Lua .exe)将加载你的DLL(调用DllMain),然后调用luaopen_MyModule
传入执行require语句的Lua状态。你的DllMain没有办法访问那个状态指针…
…嗯,没有普通的方式。你可以在加载你的DLL之前,把Lua状态的内存位置写到你的DLL可以访问的外部位置(注册表,文件等)。你的DLLMain可以获取指针寄存器并且它的函数进入那个状态。不知道为什么要这样做,但在C语言中,这在技术上是可能的。
这将要求您编写宿主,因此您可以安排在某处编写状态。或者,您可以有一个单独的模块,以普通的方式加载,它写入Lua_state值,然后所有其他模块都可以从它们的dlmain访问它。
这闻起来很像XY问题。想分享一下为什么你想在DllMain中注册你的函数吗?
试试这个…
而不是使用名称MyModule在require("MyModule")
和luaopen_MyModule
使用您的DLL被注入到可执行文件的名称。如果这不起作用,将require调用更改为在末尾有.exe
。
Lua的require将调用Win32 LoadLibrary,然后调用GetProcAddress来查找luaopen函数。两个调用都将使用require()的参数。PE-inject似乎使注入的DLL中的所有函数看起来就像在EXE模块中一样。因此,您需要LoadLibrary将句柄返回给EXE模块,然后GetProcAddress将找到注入的luaopen函数。
这可能不起作用的原因有几个。其一是Lua的require确实要求DLL文件名和DLL模块名匹配。这不是Win32的要求,所以对于您的可移植可执行文件可能不是这种情况。
- C++,从文件读取到结构,然后读取到向量(结构被推入向量太多次,而不仅仅是一次)
- VS2008 SP1:将一对推入矢量时没有合适的默认构造函数可用
- 如何将字符串推入shared_ptr向量?
- 弹出并推入堆栈
- 每次我将对象推入矢量时都会丢失数据
- 如何在不复制此代码的情况下将多个函数放入多个命名空间?
- 我应该在 stoi() 函数中放入多少位
- 将用unique_ptr的对象推入C 中的向量
- 在复制构造函数中放入什么 = 运算符重载
- 将矢量<int>推入矢量<矢量<int>>时,SIGABRT - free():下一个大小无效(快速)
- 将字符串从BASH脚本(C 程序)推入CIN
- 尝试从成员函数推送时不维护元素的成员向量
- 将子类 Y 推入 std::stack (C++) 后无法使用子类 Y 的方法<ParentClass>
- 将std ::计数结果推入向量
- turbo 如何在 C++ 的系统() 函数中放入一个 int varriable
- 推入C++向量时的构造函数和析构函数调用
- 将模板函数指针推入列表
- 如何在c++中将函数推入数组
- Lua模块从dlmain推入C函数
- 是否有可能防止g++在跨优化级别的函数开始时推入epb并保存esp ?