麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發 > 綜合 > 正文

Lua5.1中加載dll動態鏈接庫的方法

2024-07-21 23:04:47
字體:
來源:轉載
供稿:網友

一、加載專門為lua寫的擴展dll

    使用require或package.loadlib方法,在此不做過多解釋。

二、加載不是專為lua寫的擴展dll

    “不是專為lua寫的擴展dll”是指:dll中并沒有以lua注冊函數的方式導出接口,而是以__declspec(dllexport)形式導出的接口。這樣就不能使用“package.loadlib”方法調用,而要使用lua5.1封裝過的“alien.load()”方法。(Lua/5.1/lua/alien.lua)


基本用法:

1、加載alien:

復制代碼 代碼如下:

require(“alien”)

2、加載動態鏈接庫:(此處以”msvcrt.dll”為例)
復制代碼 代碼如下:

libc = alien.load(“msvcrt.dll”)
   
3、說明參數類型:(第一個參數表示返回類型,后面的參數表示傳入參數類型)
復制代碼 代碼如下:

  libc.puts:types(“void”, “string”)

 

Alien轉換 Lua numbers 為C的 numeric 類型, 轉換 nil 為 NULL,strings 為 const char* , userdata 為 void* 指針。而函數返回值的轉換工作正好相反 (pointer類型轉換為userdata)。

以上三步完成了dll的加載,之后便可調用dll中的函數來實現操作,例如:

復制代碼 代碼如下:

libc.puts(“test”)

 

當傳入引用類型參數時,需要alien在堆棧中分配空間,lua的變量將值傳遞給函數參數,如:

復制代碼 代碼如下:

scanf = libc.scanf
scanf:types(“int”, “string”, “ref int”, “ref double”)
_, x, y = scanf(“%i %lf”, 1, 1) — 后面兩個參數沒有實際意義,只是為了說明參數個數

調用時輸入23和24.5,輸入的這2個參數才是真正需要傳遞給函數的參數,ref int, ref double是告訴alien需要分配空間,調用C函數從棧中獲取它的參數,調用結束后將返回結果放到棧中(為了區分返回結果和棧中的其他的值,每個C函數還會返回結果的個數),然后lua函數返回結果值。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 国产精品久久久在线观看 | 神马顶级推理片免费看 | 中文字幕www. | 久久人 | 午夜久久久精品一区二区三区 | 久在线观看福利视频69 | 在线播放免费av | 成人做爽爽爽爽免费国产软件 | 亚洲国产精品一 | 精品二区在线观看 | 日本爽快片100色毛片视频 | 99精品视频一区二区 | 91成人久久 | 在线 日本 制服 中文 欧美 | 草莓福利视频在线观看 | 成人艳情一二三区 | 91在线色| 国产精品www | 亚洲九色| 成人毛片免费在线 | 精品中文一区 | 在线成人免费av | 主播粉嫩国产在线精品 | 在线2区 | 激情久久婷婷 | 国产精品久久二区 | 国产羞羞视频 | 精品视频一区二区三区四区 | 黄视频网站免费观看 | 日日摸夜夜骑 | 日韩做爰视频免费 | 538任你躁在线精品视频网站 | 国产噜噜噜 | 精品一区二区三区中文字幕老牛 | 91不雅视频| 久久久一区二区三区精品 | 国产成人高潮免费观看精品 | 久久国产精品二国产精品中国洋人 | 欧美成人一区二区三区电影 | 国产成人综合在线观看 | 在火车上摸两乳爽的大叫 |