2013-04-05 43 views
1

推的C函数我有该死的大问题。如你所知,Lua允许创建模块,并且你可以用5.1(以前的loadlib)中的require()函数加载这些模块。的Lua模块从DllMain的

#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作为切入点)。我试过了,但没有奏效。 有什么想法吗?

+0

“*但我需要使用标准方式(DllMain作为入口点)。”* ...为什么? – 2013-04-06 01:30:54

回答

0

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

的DllMain总是会成为你的入口点(如果定义),但你不能用它来加载功能,因为你没有的Lua状态将其装入有

当你运行“规定”在Lua代码,执行该代码的应用程序(例如lua.exe)将加载您的DLL(调用的DllMain),然后调用luaopen_MyModule传入的Lua状态该执行的需要声明。有没有办法为你的DllMain能够访问到该状态的指针......


...好,没有普通方式。您可能一起想办法,以便主机应用程序加载您的DLL之前写的Lua状态的存储位置,以您的DLL(注册表,文件等)访问一些外部的位置。你的DLLMain可以获取指针寄存器,并且它的功能进入该状态。不知道你为什么想要这样做,但用C这样的语言,它在技术上是可行的。

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


这个味道很像XY Problem。介意分享为什么要在DllMain中注册您的功能呢?

+1

XY问题...今天学到了一些东西! – 2013-04-05 23:14:14

0

尝试......

而不是使用名称MyModule的在require("MyModule")luaopen_MyModule使用您的DLL注入到可执行文件的名称。如果这样做不起作用,则更改要求呼叫以使.exe结束。

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

这可能不起作用的一些原因。一个是,Lua的要求确实需要DLL文件名和DLL模块名称匹配。这不是Win32要求,因此可能不适用于您的便携式可执行文件。