aardio 文档

raw 库模块帮助文档

raw 成员列表

原生接口编程与原生类型操作支持库。
这是自动导入的内置库。

使用手册相关文档

raw._release(内核对象)

释放cdata类型内核对象,慎用.
此函数保证不会重复释放已释放的内核对象,所以参数可以是已释放的内核对象,
如果参数是cdata类型内核对象,或者参数的_topointer元方法中返回类型内核对象,则调用内核对象的_gc析构函数
传入null会忽略不执行任何操作

可用于释放cdata类型内核对象、com对象、IUnknown指针、com.interface创建的对象
不能用于释放table.gc或gcdata创建的cdata对象

raw.buffer

分配可读写的、固定长度的内存,
返回可读写该内存的原生字节数组( buffer ),可存取各种二进制数据。

可用[]下标操作符读写 8 位无符号字节数值,可用 # 操作符取数组长度。
不支持连接操作符,支持 raw.concat,string.concat,string.join 等拼接函数。

在几乎所有字符串函数中都可以作为字符串使用。
在结构体中也可作为指针、 BYTE[]数组的值。
在原生 API 参数中可作为内存指针、字符串、输出字符串使用。
在 COM 函数中可作为安全数组使用。

raw.buffer(初始值)

分配可读写的、固定长度的内存,
返回可读写该内存的原生字节数组( buffer ),可存取各种二进制数据。

参数可以是一个结构体、字符串、或 buffer,传入{ }返回null,
重新分配内存并复制初始值指定的数据,返回buffer对象,
buffer在多数字符串函数中都可以作为字符串使用
在API中可以作为字符串、指针、字节数组使用
在COM函数中可作为安全数组使用

buffer在json中会转换为{type="Buffer";data={} }格式的表对象,
这种表对象可作为raw.buffer的唯一参数还原为buffer对象

raw.buffer(长度,初始值)

分配可读写的、固定长度的内存,
返回可读写该内存的原生字节数组( buffer ),可存取各种二进制数据。

参数一指定需要分配的内存大小,
,内存初始值可以用结构体、指针、buffer、或字符串指定一段内存数据,
也可用一个数值指定所有字节的初始值,不指定默认初始化所有字节为0,

如果初始值指定为字符串或buffer类型,
填充初始数据以后剩余的字节会全部初始为为0

此函数分配的内存是可读写的字节数组,可使用下标操作符读写字节值
buffer在多数字符串函数中都可以作为字符串使用
在API中可以作为字符串、指针、字节数组使用

raw.byte()

转换参数@1指定的数值为 byte 类型数值(8位整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.byte 函数

返回对象:rawNumberObject

raw.closehandle()

关闭句柄资源

raw.concat

此函数主要用于向raw.realloc创建的[动态指针]所指内存中追加数据

raw.concat(buffer,追加字符串,buffer保留长度,追加长度)

二进制模式拼接字符串
文本模式拼接请使用string.concat
参数@1应为 buffer 对象,
buffer保留长度可省略,默认为0
追加长度可省略,默认为追加字符串长度
返回拼接后的有效数据长度,有效长度不会超过 buffer大小

raw.concat(动态指针,追加数据,追加长度)

追加数据
参数@1必须是raw.realloc创建的[动态指针]
如果内存长度不够时,此函数会自动调用raw.realloc调整内存大小
此函数返回新的[动态指针],传入的动态指针地址可能改变必须弃用

追加数据可以是字符串、buffer、动态指针、普通指针、结构体
追加长度为可选参数,如果追加数据为指针、或动态指针则必须明确指定追加长度如果
如果追加参数是字符串、或 buffer,会在尾部添加'\u0000'(不计长度)

可选在第4个参数中指定动态调整指针内存大小时的默认增加长度,该值默认为1024

raw.convert

转换并返回结构体

raw.convert(源指针,目标结构体,字节单位偏移,结构体单位偏移)

读取内存数据到目标结构体,返回目标结构体,
参数@1可以是指针、buffer、字符串,
可选用参数@3指定在源指针上按字节单位计数的偏移位置,不指定默认为0,
如果在参数@4指定了按结构体为单位大小的偏移位置,则忽略参数@3

raw.convert(源结构体,目标指针,字节单位偏移,结构体单位偏移)

把结构体写入内存,返回内存指针,
参数@2可以是指针、buffer,
可选用参数@3指定在目标指针上按字节单位计数的偏移位置,不指定默认为0,
如果在参数@4指定了按结构体为单位大小的偏移位置,则忽略参数@3

raw.convert(源结构体,目标结构体)

转换结构体,返回目标结构体

raw.convertArray(源内存指针,源数组长度,"数据类型")

将指针指向的内存转换为普通数组,传入空指针返回空值
数据类型参数可省略,默认为"pointer"
类型类型也可以直接传入一个声明元素类型的结构体参数
注意该函数不会检测内存溢出错误,调用该函数时必须保证数组长度是正确的值

raw.copy

复制内存数据

raw.copy(目标指针,源数据,复制长度)

复制内存数据
参数@1允许指针,buffer类型参数,
参数@2允许使用指针,buffer,字符串,或结构体参数,
此函数不允许其他可自动转换为指针的非指针类型参数。

如果复制源或目标是buffer,字符串,或结构体等可获取内存长度的类型,
复制长度可以省略,如果未指定复制长度,并且源数据是buffer,或字符串时,
复制全部数据并且复制尾部隐藏的'\u0000'到目标内存,如果复制目标是指针,
那么要保证复制源加上这2个字节也不会超过目标内存长度。

如果aardio能获取复制源或目标的内存长度,
那么复制长度不会超过实际检测到的内存长度,
但如果参数是指针将无法自动检测到内存长度

raw.double()

转换参数@1指定的数值为 double 类型数值(64位浮点数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.double 函数

返回对象:rawNumberObject

raw.dup(源句柄,源进程,目标进程,允许子进程继承)

返回复制的系统句柄
除参数1之外,其他参数可选
默认仅在当前进程中复制句柄
复制的句柄应使用raw.closehandle释放

raw.execute

运行外部程序,成功返回 true。
process.execute 函数提供类似的功能,区别可参考函数源码

raw.execute(file,param,operation,showCmd,workDir,hwnd)

运行外部程序,成功返回 true。
@file 指定要运行的程序路径,其他所有参数可省略,
@param 字符串参数,可选指定启动参数。
@operation 可选用一个字符串指定执行动词,省略则使用默认动词或 "open"。
@showCmd 可选用 SW 前缀常量指定显示选项,默认为 _SW_SHOW。
@workDir 参数可选指定工作目录。
@hwnd 可选指定所有窗口句柄,默认取当前线程活动窗口

raw.explore(path,args,...)

使用资源管理器(Explorer.exe)打开文件或目录。
第一个参数 @path 指定文件路径,可为空值( null )。
注意 Explorer.exe 不解析标准的命令行参数转义符,这一点与其他程序不同。
如参数 @path 尾部有双反斜杠\\则为无效路径并打开默认目录(打开我的文档,XP系统报错)。
如参数 @path 指定为 ","或"file:" 则打开“此电脑(This PC)”。
如参数 @path 使用shell:::前缀则可以指定特殊路径的 CLSID。

可用第二个参数 @args 或更多参数指定 Explorer.exe 命令行选项,
例如指定 "/select" 在资源管理器选择指定路径。
注意 "/n" 等选项在新系统中是无意义的,Explorer 将总是打开新窗口。

raw.find

用法与string.find相同
区别是参数@1允许使用内存指针
并必须使用参数@2指定查找数据的内存长度
指定错误的指针或长度会导致内存错误,请谨慎使用此函数

raw.find(指针,内存长度,"查找模式",开始位置)

使用模式串在字符串中查找子串的位置,
参数@1可以使用指针、字符串、或 buffer
无论指定任何类型,内存长度都不可省略,aardio不会检测指定的内存长度是否错误
开始位置为可选参数,默认为1,必须以字节计数,
函数返回匹配结果的起始,结束位置,以及所有捕获分组
如果有多个捕获分组,将附加为多个返回值

raw.float()

转换参数@1指定的数值为 float 类型数值(32位浮点数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.float 函数

返回对象:rawNumberObject

raw.indexOf

与 string.indexOf 类似,
但 raw.indexOf 基于二进制搜索字符串,可查找包含 '\0' 的字符串。
更重要的区别是参数 @1允许使用内存指针,
并必须使用参数 @2 指定查找数据的内存长度。
指定错误的指针或长度会导致内存错误,请谨慎使用此函数。

raw.indexOf(指针,查找内存长度,查找字符串,起始索引)

使用模式串在字符串中查找子串的位置,
参数@1可以使用指针、字符串、或 buffer
无论指定任何类型,内存长度都不可省略,aardio不会检测指定的内存长度是否错误
开始位置为可选参数,默认为1,必须以字节计数,
函数返回匹配结果的起始位置

raw.int()

转换参数@1指定的数值为 int 类型数值(32位整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.int 函数

返回对象:rawNumberObject

raw.join(buffer数组,分隔字符串,起始索引,结束索引)

拼接字符串或 buffer 数组,返回 buffer。
如果拼接后长度为空,此函数返回 null。

参数@1指定的数组可包含字符串或buffer,
包含 buffer 的数组只能用 raw.join 拼接,不可使用 string.join 拼接
参数 @2 可选指定一个间隔字符串。
起始索引与结束索引为可选参数,可传入负数表示自数组尾部倒计数

raw.loadDll

加载 DLL
DLL变量名如果为全局变量,首字母必须大写且必须按如下格式赋值
::User32 := raw.loadDll("User32.dll")

如果DLL厂商仅提供一个版本的DLL,一般是32位的DLL,在aardio可以直接加载,
如果DLL厂商提供了64位、32位两个版本的DLL,这时候你需要选择32位版本的DLL才能加载,
aardio程序也是32位的,主要是因为64位程序只能运行在64位平台,而32位程序兼容所有平台。

32位的进程的内存限制仅仅是限制单个进程的内存,
实际上一般的桌面软件基本都不可能用到好几个GB的内存
目前aardio提供process.command可以很方便的使用使用多进程交互
如果软件使用外部数据库、或者其他服务端口,因为跨进程都不会受单进程的内存限制。
编写网站的FastCGI同样是多进程模式。

raw.loadDll("DLL路径","共享名字","调用约定")

第一个参数可以是DLL路径或DLL内存数据,
载入内存DLL数据时,可使用第二个参数指定共享模块名称以启用共享模式,
如果DLL本身是库文件,则共享名称应使用库名字空间路径.
参数@3可选指定调用约定,默认为"stdcall,microsoft"

路径首字符可用斜杠表示应用程序根目录,用~加斜杠表示EXE根目录
如果~\~/开头的EXE根目录路径不存在,自动转换为应用程序根目录下的路径重试,

如果DLL文件依赖同目录下的其他DLL文件,而这些DLL不在默认搜索目录顺序内时,
aardio将会调用::Kernel32.SetDllDirectory()自动修正该问题,
并在操作完成后自动恢复默认设置

raw.loadDll()

返回对象:dllModuleObject

raw.long()

转换参数@1指定的数值为 long 类型数值(64位整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.long 函数

返回对象:rawNumberObject

raw.main

进程主模块,默认调用约定为stdcall
与raw.module("stdcall")返回的值相同,
可用于将当前进程中的函数指针转换为aardio函数

返回对象:dllModuleObject

raw.match

用法与string.match相同
区别是参数@1允许使用内存指针
并必须使用参数@2指定查找数据的内存长度
指定错误的指针或长度会导致内存错误,请谨慎使用此函数

raw.match(指针,内存长度,"模式串",开始位置)

使用模式串在字符串中查找子串,
参数@1可以使用指针、字符串、或 buffer,
无论指定任何类型,内存长度都不可省略,aardio不会检测指定的内存长度是否错误
参数@3指定查找模式串。
参数@4可选,用于指定起始位置,负数表示尾部倒计数,
返回匹配字符串,如果使用了匹配分组则返回多个对应的匹配串,
返回值的顺序对应模式串中左圆括号的开始顺序

raw.mixin(指针,结构体对象,任意个混入对象)

混入新的值,支持任意个混入table对象,
自动更新指针指向内存,并返回结构体对象

raw.module("调用约定")

指定约定并返回进程主模块,
省略参数时调用约定默认为stdcall,
可用于将当前进程中的函数指针转换为aardio函数,

raw.module()

返回对象:dllModuleObject

raw.realloc

快速分配内存并返回[动态指针]
aardio会在[动态指针]头部倒退8个字节记录内存以及存储内容长度,
动态指针的头部结构体如下:

{  
    INT capacity;//分配的内存容量  
    INT size;//存储的数据长度  
}  

动态指针指向的内存尾部隐藏2个字节并放置'\u0000'(不计入内存长度)
[动态指针]可作为普通指针使用,并可用于 raw.concat 函数快速拼接数据
使用此函数将[动态指针]的长度设为0时可释放内存
[动态指针]不会被自动回收,必须手动释放

raw.realloc(0,动态指针)

长度指定为0则释放[动态指针],指针参数为null时忽略不报错
建议使用传入[动态指针]的变量接收空的返回值,以避免误用失效的指针变量

raw.realloc(内存长度)

快速分配内存并返回指针,
可选用参数3指定分配内存中所有字节的初始值
初始值可指定所有字节的字节码,也可指定字符串、结构体
返回分配的指针,该指针可作为普通指针使用
指针不会被自动回收,必须手动释放

raw.realloc(内存长度,动态指针,初始值)

调整内存大小,可能返回新指针
传入指针必须弃用,返回值是新的指针必须手动释放,
可选用参数3指定分配内存中所有字节的初始值,
初始值可指定所有字节的字节码,也可指定字符串、结构体
指定初始值会重置指针记录的数据长度

如果指定的初始值为字符串或 buffer,
并且其长度超过了动态指定已分配的内存长度,
则aardio会自动截断放不下去的尾部数据。

raw.remoteApi

在外部进程内创建远程调用函数

raw.remoteApi(目标进程,"void()","dll名","函数名")

参数(进程ID或句柄,函数原型,加载DLL模块名,函数名,调用约定)
不指定调用约定时默认使用stdcall调用约定
不会在API函数名字后面自动添加或移除"A","W"编码声明后缀,
并且要注意搜索DLL时默认搜索路径包含目标EXE所在目录,而非当前EXE目录

raw.remoteApi(目标进程,"void()","dll名","函数名","cdecl")

参数(进程ID或句柄,函数原型,加载DLL模块名,函数名,调用约定)
不会在API函数名字后面自动添加或移除"A","W"编码声明后缀,
并且要注意搜索DLL时默认搜索路径包含目标EXE所在目录,而非当前EXE目录

raw.remoteApi(目标进程,"void()",CALL地址,调用约定)

参数(进程ID或句柄,函数原型,CALL地址,调用约定)
参数@1可以是进程ID,也可以是进程句柄(此函数不负责关闭该句柄)
注意参数@1不能指定当前进程ID或句柄,
不指定调用约定在数时默认使用stdcall调用约定

raw.remoteApi(目标进程,"void(INT thisAddr)","dll名","函数名","thiscall")

参数(进程ID或句柄,函数原型,加载DLL模块名,函数名,调用约定)
thiscall使用第一个参数指定this指针地址
不会在API函数名字后面自动添加或移除"A","W"编码声明后缀,
并且要注意搜索DLL时默认搜索路径包含目标EXE所在目录,而非当前EXE目录

raw.serializeDupHandle("类名",句柄)

复制进程内有效句柄并序列化对象
只能用于_serialize元方法,且必须kernelCall参数为真
序列化类构造函数必须支持指针参数1为指针类型句柄,参数2为true的参数
并负责在析构函数中调用 raw.closehandle 释放该句柄

raw.sizeof( )

返回结构体、原生类型、动态指针内存长度
参数可以是结构体、或包含类型名的字符串
参数如果是指针,则必须是raw.realloc函数创建的动态指针,
传入动态指针,返回2个值,分别为存储数据长度、分配内存总长度
传入其他来源指针,因缺少指针头信息会导致崩溃
传入null值返回0
无参数报错

raw.str

转换为纯文本字符串(去掉尾部多余终结符)
参数为空返回null

如果输入参数是字符串,应当改用 string.str 函数

raw.str(指针,是否unicode,偏移)

转换为纯文本字符串(去掉尾部多余终结符)
参数一可以是指针或buffer,其余参数可省略,偏移默认为0
参数@2为true反回字符串标记会设置UTF-16标记,否则设为UTF-8标记,
注意此函数并不会转换编码,不可指定错误的编码参数
参数为空返回null

raw.str(结构体,是否unicode)

结构体内存数据转换为文本字符串
参数@2为 true 返回字符串标记会设置 UTF-16 标记,否则设为 UTF-8 标记
注意此函数并不会转换编码,不可指定错误的编码参数

raw.swap(数值,"INT");

反向转换整数的大小端字节序
参数@2指定API数据类型,支持"INT","int","WORD","word",省略则默认为"INT"
64位整数请使用math.size64对象的swap函数转换

raw.toPointer()

获取对象的指针,可选用参数@2指定偏移值,
所有可用于API函数 pointer 类型的对象都可以用此函数提取指针
参数不允许为数值,数值转换为指针类型应使用topointer函数

滥用此函数提取对象的原始指针在很多时候是不必要且不安全的,
可能在原对象被回收以后,仍然在错误的使用获得的指针,让程序变得不稳定。
实际上 buffer, 结构体等对象在很多函数里都可以直接作为指针使用,
这样更安全、更稳定、代码更简洁,也避免了不必要的函数调用。

raw.toarray

此函数的作用是在运行时创建一个确定长度的原生类型数组。
也可以直接定义不指定长度的原生数组,并在运行时使用 length 属性改变长度。
示例:{ int array[] = { length = 10 } }

raw.toarray()

返回对象:rawToArrayResultObject

raw.toarray(arrrayOrLength,rawTypename,fieldName)

创建一个包含指定长度原生类型数组的结构体。
参数@1指定数组长度值,也可以指定用于初始化原生数组的 aardio 数组。
可选参数 @2 指定数组元素类型,默认为"struct",
可选参数@3指定数组字段名字,默认为"array"。

raw.tocdecl

创建cdecl调用约定的原生回调函数,

应保持原生回调函数在有效作用域内,否则会自动释放,
函数返回值应当先赋值到变量而不是直接写到调用参数里,
这会导致函数未返回但原生回调函数可能已释放。

如果原生回调函数被指定为某对象的成员,在函数内部又循环引用了该对象,
这会导致无法释放资源。使用参数@3将该对象指定为owner可避免该问题

raw.tocdecl(函数,"int()",owner)

参数@2与API声明语法相同,可使用&表示输出参数,
例如C中的int *指针在aardio回调中声明为int &
有几个输出参数,就可增加相应个数的返回值用于更新输出参数值,
未返回的输出结构体参数忽略不更新传入的结构体。

回调参数声明可直接指定结构体,传入实参必须是结构体指针,
结构体声明不能再嵌套结构体,不能包含变量,
示例:raw.tocdecl(func,"int({int x;int y} &pt)")

返回值类型检测比输出参数宽松,数值,布尔值、null值可按C规则兼容转换,
返回值传结构体时必须返回不大于64位的结构体,且传值而非传址

raw.tofastcall

创建 ms-fastcall 调用约定的原生回调函数
注意前两个参数不能大于32位,

应保持原生回调函数在有效作用域内,否则会自动释放,
函数返回值应当先赋值到变量而不是直接写到调用参数里,
这会导致函数未返回但原生回调函数可能已释放。

如果原生回调函数被指定为某对象的成员,在函数内部又循环引用了该对象,
这会导致无法释放资源。使用参数@3将该对象指定为owner可避免该问题

raw.tofastcall(函数,"int()",owner)

参数@2与API声明语法相同,可使用&表示输出参数,
例如C中的int *指针在aardio回调中声明为int &
有几个输出参数,就可增加相应个数的返回值用于更新输出参数值,
未返回的输出结构体参数忽略不更新传入的结构体。

回调参数声明可直接指定结构体,传入实参必须是结构体指针,
结构体声明不能再嵌套结构体,不能包含变量,
示例:raw.tocdecl(func,"int({int x;int y} &pt)")

返回值类型检测比输出参数宽松,数值,布尔值、null值可按C规则兼容转换,
返回值传结构体时必须返回不大于64位的结构体,且传值而非传址

raw.tostdcall

创建stdcall调用约定的原生回调函数,

应保持原生回调函数在有效作用域内,否则会自动释放,
函数返回值应当先赋值到变量而不是直接写到调用参数里,
这会导致函数未返回但原生回调函数可能已释放。

如果原生回调函数被指定为某对象的成员,在函数内部又循环引用了该对象,
这会导致无法释放资源。使用参数@3将该对象指定为owner可避免该问题

raw.tostdcall(函数,"int()",owner)

参数@2与API声明语法相同,可使用&表示输出参数,
例如C中的int *指针在aardio回调中声明为int &
有几个输出参数,就可增加相应个数的返回值用于更新输出参数值,
未返回的输出结构体参数忽略不更新传入的结构体。

回调参数声明可直接指定结构体,传入实参必须是结构体指针,
结构体声明不能再嵌套结构体,不能包含变量,
示例:raw.tocdecl(func,"int({int x;int y} &pt)")

返回值类型检测比输出参数宽松,数值,布尔值、null值可按C规则兼容转换,
返回值传结构体时必须返回不大于64位的结构体,且传值而非传址

raw.tostring( )

将结构体、指针、或 buffer 对象转换为普通字符串
参数如果是结构体不需要指定截取位置
参数如果是 buffer 类型,自动获取 buffer 长度并设为截取长度
参数如果是指针且未指定长度时,以'\0'为终止符并设为截取长度,
转换为不包含'\0'的文本字符串,建议改用 raw.str 函数

raw.tostring( , start,end)

将指针、或 buffer 对象转换为普通字符串
start指定开始位置(省略则默认设为1),end指定结束位置,

如果未指定结束位置参数,
参数如果是buffer类型,自动获取buffer长度并设为结束位置
参数如果是指针,以'\0'为终止符并设为结束位置

raw.typeOfArray()

如果参数是一个包含原生数组的结构体,
返回原生类型名,以及数组字段名字。
如果是其他对象则返回 null 。

raw.ubyte()

转换参数@1指定的数值为 BYTE 类型数值(8位无符号整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.ubyte 函数,
注意在原生类型中使用大写的 BYTE 类型表示8位无符号整数

返回对象:rawNumberObject

raw.uint()

转换参数@1指定的数值为 INT 类型数值(32位无符号整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.uint 函数,
注意在原生类型中使用大写的 INT 类型表示32位无符号整数

返回对象:rawNumberObject

raw.ulong()

参数@1可传入数值或 math.size64 对象,
返回适用于 LONG 类型数值(64位无符号整数)的包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.ulong 函数,
注意在原生类型中使用大写的 LONG 类型表示64位无符号整数

返回对象:rawNumberObject

raw.uword()

转换参数@1指定的数值为 WORD 类型数值(16位无符号整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.uword 函数,
注意在原生类型中使用大写的 WORD 类型表示16位无符号整数

返回对象:rawNumberObject

raw.word()

转换参数@1指定的数值为 word 类型数值(16位整数)包装对象,
返回对象支持 tonumber tostring 等类型转换函数。

用于调用非声明式原生 API 函数的参数,
默认传值,参数@2为 true 则用于传址参数(传数值的指针)。

用于 COM 函数参数则总是传值, COM 函数也可使用 com.word 函数

返回对象:rawNumberObject

dllModuleObject 成员列表

dllModuleObject.?

可不用声明直接在此输入函数名并调用API函数

一、传入参数规则:
1、调用约定在加载DLL的参数中指定,支持cdecl不定个数参数
2、null参数不可省略
3、32位整数类型,小于32位的整数、以及枚举类型都可以直接在API参数中写数值。
4、对于任何数值类型的指针(输出参数)一律使用结构体表示,例如double * v 表示为{ double v }
5、数组使用结构体表示
6、所有结构体传给API的都是指针地址,都是输出参数并增加返回值

二、返回值规则:
1、返回值默认为int类型,可用 >>> 0 强制转为无符号数,
2、可以使用[API尾标]改变返回值为其他类型

三、所有可用的【API尾标】:
dll.ApiNameW() 切换到Unicode版本,字符串UTF8-UTF16双向转换
dll.ApiNameA() 切换到ANSI版本,字符串不作任何转换
dll.ApiNameL() 返回值为 math.size64 对象(64位无符号 LONG 类型)
dll.ApiNameP() 返回值为指针类型
dll.ApiNameD() 返回值为double浮点数
dll.ApiNameF() 返回值为float浮点数
dll.ApiNameB() 返回值为C++中的8位bool类型
注意尾标必须大写且尾标前没有大写字符,
API 已含W尾标时可省略,API以'_w'结尾也按 Unicode 版本处理。

dllModuleObject.api("字符串参数","void()" )

声明API函数,参数(函数名,函数原型,调用约定="stdcall,microsoft")
可选使用参数3指定调用约定,默认值为"stdcall,microsoft",
返回值为原生函数对象( cdata 类型 )

dllModuleObject.api("字符串参数","void()" ,"cdecl")

声明API函数,参数(函数名,函数原型,调用约定)
参数3使用一个字符串指定调用约定,逗号后面可选指定开发工具厂商,
返回值为原生函数对象( cdata 类型 )

dllModuleObject.api(函数名,函数原型,调用约定,this指针)

声明API函数,
返回值为原生函数对象( cdata 类型 ),
参数@1也可以指定导出函数名,或用数值指定导出函数序号
调用约定可省略,默认为stdcall
this指针为可选参数,指定该参数以后在调用时可省略首参数

dllModuleObject.api(函数地址,函数原型,调用约定,this指针)

如果模块是当前进程,
参数@1可用指针或数值指定原生函数的内存地址,
返回值为原生函数对象( cdata 类型 ),

调用约定可省略,默认为stdcall
this指针为可选参数,指定该参数以后在调用时可省略首参数

dllModuleObject.api(导出符号名)

仅指定一个参数时,
直接返回导出符号指针而非返回原生函数对象。
不会对参数 @1 自动添加或移除 A,W 尾标,
而是精确匹配导出符号名。

此操作不会增加DLL的引用计数,在使用导出符号指针时DLL变量应在生存周期内

dllModuleObject.gethandle()

返回模块句柄

rawNumberObject 成员列表

rawNumberObject.value

对象存储的数值

Markdown 格式