2013-04-05 41 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要求,因此可能不適用於您的便攜式可執行文件。