Lua5.1中加载dll动态链接库的方法
一、加载专门为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函数返回结果值。
相关推荐
-
C++与C#互调dll的实现步骤
本文实例展示了C++与C#互调dll的实现步骤,在进行大型项目共享dll动态链接库中可以用到.具体方法如下: 一.C#调用C++ dll步骤(只能导出方法): 1. c++建立空项目->源文件文件夹中添加cpp文件和函数 2. c++属性设置中,配置类型设置为动态库dll,公共语言运行时支持改为/clr 3. c#引用c++的dll 4. c#声明c++的方法,并添加 DllImport特性 5. c#工程属性设置为:目标平台x86 6. 注意方法的类型匹配 7. 引发PInvokeStackI
-
C#生成DLL文件的方法小结
使用csc命令将.cs文件编译成.dll的过程 很多时候,我们需要将.cs文件单独编译成.dll文件, 操作如下: 打开命令窗口->输入cmd到控制台->cd C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 转到vs.net安装的该目录下->执行csc命令csc /target:library File.cs->在该目录下产生一个对应名字的.dll文件(前提:把.cs文件放到C:\WINDOWS\Microsoft.NET\Framewor
-
java使用JNA(Java Native Access)调用dll的方法
JNA(Java Native Access):建立在JNI之上的Java开源框架,SUN主导开发,用来调用C.C++代码,尤其是底层库文件(windows中叫dll文件,linux下是so[shared object]文件).JNI是Java调用原生函数的唯一机制,JNA就是建立在JNI之上,JNA简化了Java调用原生函数的过程.JNA提供了一个动态的C语言编写的转发器(实际上也是一个动态链接库,在Linux-i386中文件名是:libjnidispatch.so)可以自动实现Java与C之
-
从C#程序中调用非受管DLLs的方法
本文实例讲述了从C#程序中调用非受管DLLs的方法.分享给大家供大家参考.具体方法如下: 前言: 从所周知,.NET已经渐渐成为一种技术时尚,那么C#很自然也成为一种编程时尚.如何利用浩如烟海的Win32 API以及以前所编写的 Win32 代码已经成为越来越多的C#程序员所关注的问题.本文将介绍如何从C#代码中调用非受管DLLs.如果某个函数是一个带有串类型(char*)输出参数的Win32 API 或者是DLL输出函数,那么从C#中如何调用它呢?对于输入参数的情形问题到不大,但如何获取从参数
-
VC程序在Win32环境下动态链接库(DLL)编程原理
本文详细讲述了VC程序在Win32环境下动态链接库(DLL)编程原理.分享给大家供大家参考.具体分析如下: 一般比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费:另一个缺点是
-
c++生成dll使用python调用dll的方法
第一步,建立一个CPP的DLL工程,然后写如下代码,生成DLL 复制代码 代码如下: #include <stdio.h> #define DLLEXPORT extern "C" __declspec(dllexport) DLLEXPORT int __stdcall hello() { printf("Hello world!\n"); return 0; } 第二步,编写一个 python 文件:
-
C#中使用IrisSkin2.dll美化WinForm程序界面的方法
一.添加控件IrisSkin2.dll.方法: 1.右键"工具箱"."添加选项卡",取名"皮肤". 2.右键"皮肤","选择项"弹出对话框 3.点击"浏览",找到IrisSkin2.dll,,next,next,确定. 4.在皮肤里会出现. 5.把SkinEngine拖到设计界面,会出现在下面. 二,把皮肤文件中以ss
-
C#将dll打包到程序中的具体实现
直接进入主题 先来看一个栗子,假设现在有一个第三方dll 复制代码 代码如下: namespace TestLibrary1{ public class Test { public void Point() { Console.WriteLine("aaabbbccc"); } }} TestLibrary1.dll 在项目中引用,然后调用其中的方法Test,将输出aaabbbccc 复制代码 代码如下:
-
c#的dllimport使用方法详解
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport属性应用于方法,要求最少要提供包含入口点的dll的名称.DllImport的定义如下: 复制代码 代码如下: [AttributeUsage(AttributeTargets.Method)]public class DllImportAttribute: System.Attribute{public DllImportA
-
C# 调用C++写的dll的实现方法
dll的编写,首先是打开VS新建一个C++的控制台程序,下一步后选择dll以及空文档即可.然后就是添加一个类添加一个方法.方法排头固定格式 extern"C"__declspec(dllexport) 后面加方法即可. 例如如下代码: C++dll代码: 复制代码 代码如下: extern"C"__declspec(dllexport) char* ShowImages(BYTE img[],int w,int h){;} C#调用dll基本也是固定格式,如下样式,
-
C#生成DLL文件的方法
本文实例讲述了C#生成DLL文件的方法.分享给大家供大家参考.具体分析如下: Visual C#生成DLL文件 VisualC.Delphi或者VB等编程语言来编写的DLL文件,在编译完成以后,产生DLL文件已经是一个可以直接供计算机使用的二进制文件.但用Visual C#编译器生成的受管代码虽然也是二进制文件,但不是可以直接供计算机使用的原始代码,实质上是一种中间语言(IL)代码,需要经过"下一代窗口服务"( Next Generation Windows Services,简写为N
-
C#实现动态加载dll的方法
本文实例讲述了C#实现动态加载dll的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.IO; namespace Alif.CommonAPI.DynamicLoadAssembly { public class AssemblyDynamicLoader<T
-
用Python遍历C盘dll文件的方法
python 的fnmatch还真是省心,相比于 java 中的FilenameFilter,真是好太多了,你完成不需要去实现什么接口. fnmatch 配合 os.walk() 或者 os.listdir() ,你能做的事太多了,而且用起来相当 easy. # coding: utf-8 """ 遍历C盘下的所有dll文件 """ import os import fnmatch def main(): f = open('dll_list.t
-
C++调用C#的DLL程序实现方法
把C#编译成DLL或者Axtive控件,再由C调用!比如使用C++调用C#的DLL. SwfDotNet是.net下输出flash的类库.SwfDotNet是C#编写的,作者的C#水平,真是令我佩服.这是个特别好的读写Swf文件的库.但是,我要用在C++项目中,怎么让C++调用C#的DLL呢.今天一上午都在琢磨这个问题,耽误了很多时间,原因是编译是出现:warning C4819: 该文件包含不能在当前代码页(936)中表示的字符.请将该文件保存为 Unicode 格式以防止数据丢失. 接着就是
-
python引用DLL文件的方法
本文实例讲述了python引用DLL文件的方法.分享给大家供大家参考.具体分析如下: 在python中调用dll文件中的接口比较简单,如我们有一个test.dll文件,内部定义如下: extern "C" { int __stdcall test( void* p, int len) { return len; } } 在python中我们可以用以下两种方式载入 1. import ctypes dll = ctypes.windll.LoadLibrary( 'test.dll' )
-
使用SNK密钥文件保护你的DLL和代码不被反编译教程
大家做项目开发一般都是分层的,比如UI层,业务层,数据访问层.业务层引用数据访问层的DLL(比如dataAccess.dll),并使用dataAccess.dll中的方法.当项目完成并给客户用了,可有些心里BT的客户这个时候也可以请个稍微懂NET的人来引用你的dataAccess.dll并调用其中的方法搞破坏.比如可以直接使用里面的ChangePwd(string UserName,string Pwd)方法把其他用户的密码改了,这个时候就你就....... 好了,该开始说怎么保护我们的代码了:
-
MFC扩展DLL中导出类和对话框的实现方法
本文实例讲述了MFC扩展DLL中导出类和对话框的实现方法,分享给大家供大家参考.具体实现方法如下: 一般来说,如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对话框. 程序运行结果如下图所示: 一.创建MFC扩展DLL 步骤: 运行Visual Studio 6.0->File->New...->Projects: 选择Mfc AppWiz
-
在Visual Studio中用C++语言创建DLL动态链接库图文教程
什么是DLL(动态链接库)? DLL是一个包含可由多个程序同时使用的代码和数据的库.例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数.因此,每个程序都可以使用该DLL中包含的功能来实现"打开"对话框.这有助于促进代码重用和内存的有效使用.这篇文章的目的就是让你一次性就能了解和掌握DLL. 为什么要使用DLL(动态链接库)? 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复
-
C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
直接上代码: using System; using System.Collections.Generic; using System.Windows.Forms; using System.Management; using System.IO; namespace SqliteAuto { static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main
随机推荐
- AngularJS过滤器详解及示例代码
- springboot+maven快速构建项目的示例代码
- 浅述iOS11 Xcode 9 按住command 单击 恢复到从前(直接跳转到定义)
- 活用2003的“分区增容”功能
- DEDE添加迅雷专用链接(半迅雷化)
- Java编程中字节流与字符流IO操作示例
- Java中CyclicBarrier的用法分析
- Java Socket编程(三) 服务器Sockets
- thinkphp隐藏index.php/home并允许访问其他模块的实现方法
- Yii 2.0如何使用页面缓存方法示例
- PHP读取XML格式文件的方法总结
- php删除与复制文件夹及其文件夹下所有文件的实现代码
- 详解jQuery同步Ajax带来的UI线程阻塞问题及解决办法
- jQuery基于ajax操作json数据简单示例
- c#中文转unicode字符示例分享
- Ubuntu下Mysql 常用指令及中文乱码问题
- java生成缩略图的方法示例
- 详解RequireJS按需加载样式文件
- 泛型编程去掉字段重复数据的方法
- Android实现带有删除按钮的EditText示例代码