# builtin.io 库模块帮助文档

## ::Shell32 成员列表 <a id="::Shell32" href="#::Shell32">&#x23;</a>

### ::Shell32.* <a id="::Shell32.any" href="#::Shell32.any">&#x23;</a>
可不用声明直接在此输入函数名并调用API函数  

一、传入参数规则：  
1、null参数不可省略  
2、32位整数类型，小于32位的整数、以及枚举类型都可以直接在API参数中写数值。  
3、对于任何数值类型的指针（输出参数）一律使用结构体表示，例如double * v 表示为{ double v }  
4、数组使用结构体表示  
5、所有结构体传给API的都是指针地址，都是输出参数并增加返回值  

二、返回值规则：  
1、返回值默认为int类型  
2、可以使用[API尾标]改变返回值为其他类型  

三、所有可用的【API尾标】:  
::Shell32.ApiNameW() 切换到Unicode版本，字符串UTF8-UTF16双向转换  
::Shell32.ApiNameA() 切换到ANSI版本,字符串不作任何转换  
::Shell32.ApiNameL() 返回值为64位LONG类型  
::Shell32.ApiNameP() 返回值为指针类型  
::Shell32.ApiNameD() 返回值为double浮点数  
::Shell32.ApiNameF() 返回值为float浮点数  
::Shell32.ApiNameB() 返回值为C++中的8位bool类型  
注意【尾标】前必须是小写字母

### ::Shell32.Control_RunDLL(hwnd,hinst,cmdLine,cmdShow) <a id="::Shell32.Control_RunDLL" href="#::Shell32.Control_RunDLL">&#x23;</a>
可用于启动控制面板命令,  
hwnd可指定为0,hinst 可指定为 _HINSTANCE,  
cmdLine 指定启动参数,cmdShow 指定为1即可,  
也可以通过process.rundll 运行此函数,  
或通过 process.control 直接执行控制面板命令

### ::Shell32.SHChangeNotify(_SHCNE,0,0,0) <a id="::Shell32.SHChangeNotify" href="#::Shell32.SHChangeNotify">&#x23;</a>
通知操作系统外壳刷新,例如刷新桌面图标等  
参数依次为@eventId,@flags,@item1,@item2  
参数@flags的值为5时函数名必须加上 W 尾标，即 ::Shell32.SHChangeNotifyW

### ::Shell32.ShellExecute(hwnd,operation,path,param,workDir,cmdShow) <a id="::Shell32.ShellExecute" href="#::Shell32.ShellExecute">&#x23;</a>
执行 path 指定的程序,  
第一个参数为数值格式的句柄,  
最后一个参数为数值,指定为1即可,其他参数都是字符串,  
详细用法请参考该 API 文档,  
注意省略的参数也要指定 null 值,  
非声明式调用 API 不能减少参数个数,  
raw.execute 函数提供类似功能，但所有参数都可以省略。  
process.execute 函数也提供类似功能

### ::Shell32.api("字符串参数","void()" ) <a id="::Shell32.api("字符串参数","void" href="#::Shell32.api("字符串参数","void">&#x23;</a>
声明Kernel32 API函数

## io 成员列表 <a id="io" href="#io">&#x23;</a>

### io.appData <a id="io.appData" href="#io.appData">&#x23;</a>
获取  %LocalAppData% 目录下的绝对路径。  
可选使用指定需要存入的数据

### io.appData(path,data) <a id="io.appData" href="#io.appData">&#x23;</a>
将@path指定的相对路径转换为系统 %LocalAppData% 目录下的绝对路径,  
可选使用 @data 指定需要存入的数据,  
存入文件与目标文件长度不同或 PE 时间戳不同则允许替换旧文件,  
指定 @data 参数后如果无法创建文件返回null,  
最后返回转换所得的完整路径

### io.curDir <a id="io.curDir" href="#io.curDir">&#x23;</a>
获取或修改当前目录

### io.curDir() <a id="io.curDir" href="#io.curDir">&#x23;</a>
无参数获取当前目录

### io.curDir(dir) <a id="io.curDir" href="#io.curDir">&#x23;</a>
将 @dir 参数指定的目录路径转换为完整路径并设为当前目录  
成功返回 true

### io.getSize() <a id="io.getSize" href="#io.getSize">&#x23;</a>
获取参数@1指定路径的文件字节长度,  
返回数值

### io.getSpecial(_CSIDL) <a id="io.getSpecial" href="#io.getSpecial">&#x23;</a>
获取特殊文件夹,  
参数@1使用 _CSIDL 开头的常量指定特殊文件夹的 CSIDL,  
不指定参数@1则默认值为 _CSIDL_DESKTOP,  
可选增加任意个拼接到目录后的子路径参数  
这个函数与fsys.getSpecial函数用法接近,  
但支持不定个数子路径参数, 不支持返回PIDL  

fsys.knownFolder 可用于获取更多已知的特殊文件夹

### io.specialData(path,data,csidl) <a id="io.specialData" href="#io.specialData">&#x23;</a>
将 @path 指定的相对路径转换为特殊文件夹下的绝对路径,  
可选使用 @data 指定需要存入的数据,  
存入文件与目标文件长度不同或 PE 时间戳不同则允许替换旧文件,  
指定 @data 参数后如果无法创建文件返回null,  
参数@csidl 使用 _CSIDL 开头的常量指定特殊文件夹的 CSIDL,  
不指定@csidl 则默认值为 _CSIDL_DESKTOP,  
最后返回转换所得的完整路径

### io.tmpname <a id="io.tmpname" href="#io.tmpname">&#x23;</a>
生成系统临时文件目录下的临时文件路径。  
此函数不会生成实际的文件，即使密集调用也不会生成相同的文件名。

### io.tmpname(prefix,ext) <a id="io.tmpname" href="#io.tmpname">&#x23;</a>
生成临时文件路径，  
可选用 @prefix 参数指定前缀名，  
可选用 @ext 参数指定后缀名，后缀名应包含点

### io.updateData <a id="io.updateData" href="#io.updateData">&#x23;</a>
更新指定文件的数据

### io.updateData(data,path,...) <a id="io.updateData" href="#io.updateData">&#x23;</a>
更新指定 @path 指定路径的文件为 @data 指定的数据。  
如果添加更多参数，则首先调用 io.joinpath 拼接到 @path 后面。  
存入文件与目标文件长度不同或 PE 时间戳不同则允许替换旧文件。  
替换失败返回 null，否则返回文件路径

## io.file 成员列表 <a id="io.file" href="#io.file">&#x23;</a>

### io.file.read(文件路径) <a id="io.file.read" href="#io.file.read">&#x23;</a>
string.load 函数的别名。  
以二进制模式读取文件或内嵌资源文件，返回普通字符串。  

路径开始可用单斜杠（或单反斜杠）表示应用程序根目录，前面再加`~`表示 EXE 根目录。  
如果`~\`或`~/`开头的EXE根目录路径不存在，自动转换为应用程序根目录下的路径重试。

### io.file.write(path,...) <a id="io.file.write" href="#io.file.write">&#x23;</a>
以二进制模式创建或打开文件并写入数据（清空原数据）。  

参数 @1 指定要写入的文件路径。  
其他一个或多个参数指定要写入的数据（可指定字符串，数值，buffer，或结构体）。  
成功返回 true，失败返回 null,错误信息,错误代码。  

string.save 函数作用类似但仅支持单个参数（只能是字符串或 buffer 类型）。  
另外，string.save 将参数 @2 设为 true 可以追加而不清空数据。

### 全局常量

### ::Shell32 <a id="::Shell32" href="#::Shell32">&#x23;</a>
默认已加载的Shell32.dll模块对象（参考标准库：peload.io），  
提供Windows系统外壳 API
