封装GetProcAddress让Lua调用Windows API

本文介绍了如何使用云风的方法修复程序中的bug,并通过自定义API进行参数传递和调用,详细展示了函数myLoadLibrary、CallApi和myGetProcAddress的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考了云风的方法,修复了一点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;
}
复制代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asmcvc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值