参考了云风的方法,修复了一点bug。
DWORD myLoadLibrary(const char *lpFileName)
{
    HMODULE h = GetModuleHandleA(lpFileName);
    if ( h==NULL ){
        h = LoadLibraryA(lpFileName);
    }
    return (DWORD)h;
}
static int CallApi(lua_State* L)
{
    int n = lua_gettop(L);
    FARPROC fc=(FARPROC)lua_touserdata(L,lua_upvalueindex(1));
    if ( fc==NULL ){
        lua_pushinteger(L,0);
        return 1;
    }
    DWORD dwRet = 0;
    DWORD dwParam = 0;
    for (int i=0;i<n;i++) {
        switch (lua_type(L,i+1) ) {
        case LUA_TNIL:
            __asm{
                push 0;
            }
            break;
        case LUA_TNUMBER:
            dwParam=(DWORD)lua_tointeger(L,i+1);
            __asm{
                push dwParam;
            }
            break;
        case LUA_TBOOLEAN:
            dwParam=(DWORD)lua_toboolean(L,i+1);
            __asm{
                push dwParam;
            }
            break;
        case LUA_TSTRING:
            dwParam=(DWORD)lua_tostring(L,i+1);
            __asm{
                push dwParam;
            }
            break;
        case LUA_TLIGHTUSERDATA:
            dwParam=(DWORD)lua_touserdata(L,i+1);
            __asm{
                push dwParam;
            }
            break;
        default:
            lua_pushstring(L,"unknown argument type");
            lua_error(L);
            break;
        }
    }
    __asm{
        call fc;
        mov dwRet,eax;
    }
    
    lua_pushinteger(L,dwRet);
    return 1;
}
int myGetProcAddress(lua_State* L)
{
    FARPROC func = NULL;
    DWORD dwModule = 0;
    string strFuncName;
    int n = lua_gettop(L);
    if ( n>1 ){
        if ( lua_isnumber(L,-2) ){
            dwModule = lua_tonumber(L,-2);
        }
        if ( lua_isstring(L,-1) ){
            strFuncName = lua_tostring(L,-1);
        }
        func = GetProcAddress((HMODULE)dwModule,strFuncName.c_str());
    }
    lua_pushlightuserdata(L,func);
    lua_pushcclosure(L,CallApi,1);
    return 1;
}
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/lua/wrapper-windows-api-getprocaddress-for-lua.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)