- °³¿ä
- ÀͽºÆ÷Æ®ÇÒ ÇÔ¼ö ¸¸µé±â
- ÆÐŰÁö µî·Ï ÇÔ¼ö ¸¸µé±â
- ·ç¾Æ¿¡¼ DLL ºÒ·¯¿À±â
1 °³¿ä
À©µµ¿ìÁî ȯ°æ ÇÏ¿¡¼ DLL ÆÄÀÏÀ» ÀÌ¿ëÇØ, ·ç¾Æ È®Àå ¸ðµâÀ» ¸¸µå´Â ¹æ¹ýÀÌ´Ù.
2 ÀͽºÆ÷Æ®ÇÒ ÇÔ¼ö ¸¸µé±â
ÀÏ´Ü ÀͽºÆ÷Æ®ÇÒ ÇÔ¼öµéÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ¿©±â¿¡¼´Â DirectoryTraversingÀ» À§ÇÑ _findfirst, _findnext, _findclose ÇÔ¼ö¸¦ ÀͽºÆ÷Æ®Çϱâ·Î ÇÑ´Ù. (Ŭ·ÎÁ®¸¦ »ç¿ëÇϸé Á» ´õ ±ò²ûÇÏ°Ô ºüÁú °Í °°Áö¸¸, ÀÏ´ÜÀº ÆÐ½º.)
static int windows_find_first(lua_State* L)
{
intptr_t ptr = -1;
struct _finddata_t fileinfo = {0, };
if ((ptr = _findfirst(luaL_checkstring(L, 1), &fileinfo)) == -1)
{
lua_pushnil(L);
return 1;
}
lua_pushnumber(L, ptr);
lua_pushstring(L, fileinfo.name);
lua_pushboolean(L, (fileinfo.attrib & _A_SUBDIR) ? 1 : 0);
return 3;
}
static int windows_find_next(lua_State* L)
{
intptr_t ptr = -1;
struct _finddata_t fileinfo;
ptr = (intptr_t)luaL_checknumber(L, -1);
if (_findnext(ptr, &fileinfo) != 0)
{
lua_pushnil(L);
return 1;
}
lua_pushstring(L, fileinfo.name);
lua_pushboolean(L, (fileinfo.attrib & _A_SUBDIR) ? 1 : 0);
return 2;
}
static int windows_find_close(lua_State* L)
{
_findclose((intptr_t)luaL_checknumber(L, -1));
return 0;
}
3 ÆÐŰÁö µî·Ï ÇÔ¼ö ¸¸µé±â
DLLÀ» ÀÌ¿ëÇÏ´Â °æ¿ì¿¡µµ, ´Ù¸¥ ÆÐŰÁö¿Í ¸¶Âù°¡Áö·Î ÆÐŰÁö µî·Ï ÇÔ¼ö°¡ ÀÖ¾î¾ß ÇÑ´Ù. ´Ù¸¸ ·ç¾Æ ÂÊ¿¡¼ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ¾î¾ß ÇϹǷÎ, __declspec(dllexport)¸¦ ºÙ¿©Áà¾ß ÇÑ´Ù.
int __declspec(dllexport) luaopen_LuaExtension(lua_State* L)
{
static const luaL_Reg windowslib[] =
{
{ "find_first", windows_find_first },
{ "find_next", windows_find_next },
{ "find_close", windows_find_close },
{ NULL, NULL }
};
luaL_register(L, "win", windowslib);
return 0;
} ÀÌ ÇÔ¼ö À̸§Àº ¾à°£ ÁÖÀÇÇØ¾ß Çϴµ¥, luaopen_DLLNAME Çü½ÄÀ¸·Î ÇØÁà¾ßÇÑ´Ù. ¿Ö ±×·±Áö´Â ¾Æ·¡¿¡¼ ¼³¸íÇÑ´Ù. À§ÀÇ ÇÔ¼ö 4°³¸¦ ºôµåÇØ¼, LuaExtension.dll ÆÄÀÏÀ» ¸¸µé¾ú´Ù°í ÇÏÀÚ. ÀÌ ÆÄÀÏÀ» ÆÐ½º·Î µî·ÏµÈ ¾îµò°¡¿¡ º¹»çÇÑ´Ù.
4 ·ç¾Æ¿¡¼ DLL ºÒ·¯¿À±â
2°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.
ù¹øÂ°´Â package.loadlib ÇÔ¼ö¸¦ ¸í½ÃÀûÀ¸·Î »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù.
libinit = package.loadlib("LuaExtension", "luaopen_LuaExtension")
libinit() loadlib ÇÔ¼öÀÇ Ã¹¹øÂ° ÀÎÀÚ´Â DLL À̸§À̰í, µÎ¹øÂ° ÀÎÀÚ´Â ÆÐŰÁö µî·Ï ÇÔ¼öÀÇ À̸§ÀÌ´Ù. DLLÀ» ¹«»çÈ÷ ·ÎµåÇÑ °æ¿ì, ÆÐŰÁö µî·Ï ÇÔ¼ö¸¦ ¸®ÅÏÇÑ´Ù. ¸®ÅϰªÀ¸·Î ¹ÞÀº ÇÔ¼ö¸¦ È£ÃâÇØÁÖ¸é ÆÐŰÁö¸¦ µî·ÏÇÒ ¼ö ÀÖ´Ù.
µÎ¹øÂ°´Â ±×³É require ±¸¹®À» ÀÌ¿ëÇÏ´Â °ÍÀÌ´Ù.
require("LuaExtension") »ç½Ç require ±¸¹® ¾È¿¡¼ ù¹øÂ° ¹æ¹ý°ú ¶È°°Àº °úÁ¤ÀÌ ÀÌ·ç¾îÁø´Ù. ´Ù¸¸ ÆÐŰÁö µî·Ï ÇÔ¼ö´Â ¸ðµâ À̸§À» ÀÌ¿ëÇØ ÃßÁ¤ÇÏ°Ô µÇ´Âµ¥, ±× Çü½ÄÀÌ À§¿¡¼µµ Àá±ñ ³ª¿Â °Íó·³ luaopen_DLLNAME Çü½ÄÀÌ´Ù.
¹«»çÈ÷ ·ÎµåÇß´Ù¸é, ÀÌÁ¦ µüÈ÷ ´Ù¸¥ ÆÐŰÁö¿Í Ʋ¸± °ÍÀÌ ¾ø´Ù. ±×³É »ç¿ëÇÏ¸é µÈ´Ù. ¾Æ·¡ÀÇ ¿¹¿¡¼´Â DLL ¾ÈÀÇ DirectoryTraversing ÇÔ¼ö¸¦ ÀÌ¿ëÇØ, ÇöÀç µð·ºÅ丮 ¾È¿¡ ÀÖ´Â ¸ðµç ·ç¾Æ ÆÄÀϵéÀ» È£Ãâ(require)Çϰí ÀÖ´Ù.
local ptr, name, is_dir = win.find_first(".\\*.lua")
if ptr then
repeat
if not is_dir then
require(string.sub(name, 1, -5))
end
name, is_dir = win.find_next(ptr)
until name == nil
win.find_close(ptr)
end
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)