Lua 调用 Windows Win32 API COM

Lua中调用Windows API COM

 

Lua中调用 Win32 API 有一些其他第三方ffi库。

这里介绍在Lua中调用Win32 API 或者COM组件的另一个更好的解决方案。

 

首先确保使用的Lua的版本是 5.1。高版本的可能有问题。

下载通用库:Win32exts for Lua(内含Lua SDK)

https://github.com/tankaishuai/win32exts_for_Lua

 

将win32exts.dll 放入Lua搜索目录下即可。仅有此一个文件。

require win32exts

 

win32exts调用的基本用法如下:

(1)常规具名函数(以MessageBoxA/W为例)调用:

 

导入模块符号。第一个参数为待加载的模块名,可以带路径,传入"*"表示当前进程的所有模块;

第二个参数表示函数符号名称,传入"*"表示该模块的所有符号。

win32exts.load_sym("*", "*")

或 win32exts.load_sym("C:\\windows\\system32\\user32.dll", "MessageBoxW")

或 win32exts.load_sym("user32", "MessageBoxA")

或 win32exts.load_sym("user32", "*")

 

win32exts.MessageBoxA(0, "call MessageBoxA", "", 1)

宽字符需要用 {} 包装一下

win32exts.MessageBoxW(0, {"call MessageBoxW"}, nil, 1)

 

(2)带回调的函数(以EnumWindows为例)调用:

 

先分配一块内存后面用:

g_buf = win32exts.malloc(2*260)

 

定义一个回调函数:

 

function EnumWndProc(args)

        --【args为参数包,以下取参数】

        hWnd = win32exts.arg(args, 1)

        lParam = win32exts.arg(args, 2)

 

        win32exts.GetWindowTextW(hWnd, g_buf, 260)

        --【读取内存中的宽字符串】

        --【read_***系列接口读内存,write_***系列接口写内存】

        strText = win32exts.read_wstring(g_buf, 0, -1)

 

        win32exts.MessageBoxW(0, {strText}, g_buf, 1)

 

        strRetVal = "1, 8"

        g_index = g_index + 1

        if g_index > 3 then    --【假设只弹框三次】

                strRetVal = "0, 8"

        end

 

        --【返回值是形如这样的字符串: "回调返回值, 参数字节数",

        --对于 cdecl 调用约定,参数字节数总是取 0 】

        return strRetVal

end

 

然后调用:

win32exts.EnumWindows(EnumWndProc, 0)

 

 

(3)匿名(非具名)函数调用:

 

假设通过某个接口获取了某函数的地址 lFuncAddr,然后可以类似下述方式调用:

iRetVal = win32exts.call( lFuncAddr, arg1, arg2, arg3 ...  )

 

当然具名函数也可以类似调用

 

 

调用COM组件:

 

--

-- 测试 COM 组件, 打开计算器

--

wsh = win32exts.create_object("Wscript.Shell")

wsh.invoke("Run", "calc")

wsh.release()

 

 

原创文章 17 获赞 7 访问量 4661

猜你喜欢

转载自blog.csdn.net/tan_kaishuai/article/details/100019191