Lua5.1中加载dll动态链接库的方法_Lua

一、加载专门为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函数返回结果值。

时间: 2024-08-15 04:44:26

Lua5.1中加载dll动态链接库的方法_Lua的相关文章

Lua5.1中加载dll动态链接库的方法

  这篇文章主要介绍了Lua5.1中加载dll动态链接库的方法,本文讲解了加载专门为lua写的扩展dll的方法和加载不是专为lua写的扩展dll的方法,需要的朋友可以参考下 一.加载专门为lua写的扩展dll 使用require或package.loadlib方法,在此不做过多解释. 二.加载不是专为lua写的扩展dll "不是专为lua写的扩展dll"是指:dll中并没有以lua注册函数的方式导出接口,而是以__declspec(dllexport)形式导出的接口.这样就不能使用&q

快速掌握WordPress中加载JavaScript脚本的方法_javascript技巧

在 WordPress 中加载脚本(为 CSS 和 JS,下同)文件,大多数人的做法是直接在 header.php 文件中添加 link 标签,或者把 link 标签通过 wp_head 钩子直接添加到 head 标签里,这种做法是不符合官方规范的. 标准的脚本加载方式应该是使用 WordPress 官方提供的函数(后边会说),统一标准有几个好处,首先就是更加安全和利于管理,其次是更加的方便快捷,而且不仅主题能挂载脚本,插件也可以,并且还能管理脚本,并且调整挂载顺序和位置和其它内容. 在哪个钩子

关于TOMCAT 中加载DLL的问题

问题描述 最近在一个WEB程序中,使用了JNI相关技术,写了一个DLL文件(用VS2008+C写的),这个DLL在我的MyEclipse中测试通过,通过的过程,我没有增加其他的DLL作为它的依赖项的...但当我把它移动到WEB程序中时,它就老是报出"javax.servlet.UnavailableException:C:tomcat-6.0.32binJNITest.dll:Can'tfinddependentlibraries"这里DLL应该是加载成功了,但是说没有找到依赖项请问,

多线程中加载DLL

问题描述 求助:我写了一个DLL,里面有一个方法.然后在应用种序中用以下方法动态加载该DLL,并调用里面的方法.TestParamtersparameters=(TestParamters)Parameters;stringDLLPath=Application.StartupPath+"\DLL\"+parameters.Wafer+".dll";AssemblyAss=Assembly.LoadFrom(DLLPath);TypeTestClass=Ass.Ge

java中Web Project中加载dll文件的终极解决方案

1.首先把要加载的dll文件拷贝到Web Project的src目录下 2.声明一个TestDLL类,名字请根据实际命名  代码如下 复制代码 package com.anllin.jni; public class TestDLL {     public TestDLL(String... filenames)     {         // 取得src下的物理路径,         String path = TestDLL.class.getResource("/").get

Flash中加载外部文件的方法_Flash As

Flash可以通过帧.按扭.影片剪辑来调用外部文件.调用的外部文件包括:外部文本文件.外部程序文件.外部*.swf文件.外部图片文件.外部音乐文件.外部脚本文件 .现总结如下: [loadMovieNum()函数] [用法]:loadMovieNum("url",level [, variables])  [功能]: 函数:在播放原来加载的 SWF 文件的同时将 SWF 文件或 JPEG 文件加载到 Flash Player 中的某个级别.  [参数]:首先我们可以看到该函数有3个参数

解析Java和Eclipse中加载本地库(.dll文件)的详细说明_java

最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对大家的类似工作有所帮助首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述.其次,Java中加载dll的方式

java 加载dll介绍(转)

最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows).刚刚把程序跑通,赶紧把一些心得写出来,mark.也希望对大家的类似工作有所帮助  首先,应当明确,dll有两类:(1)Java所依赖的dll和,(2)dll所依赖的dll.正是由于第(2)种dll的存在,才导致了java中加载dll的复杂性大大增加,许多说法都是这样的,但我实验的结果却表明似乎没有那么复杂,后面会予以详细阐述.  其次,Java中加载dl

利用xwizard.exe加载dll

本文讲的是利用xwizard.exe加载dll,在之前的文章介绍了利用Excel.Application object's RegisterXLL()加载dll的技巧.本文继续,介绍最近学习到的一种更为通用的方法--利用xwizard.exe加载dll.  该方法最大的特点是xwizard.exe自带微软签名,在某种程度上说,能够绕过应用程序白名单的拦截. 0x01 简介 本文将要介绍以下内容: · xwizard.exe简介 · 利用思路 · 实际测试 0x02 xwizard.exe简介 应