//SE_API外部标准函数调用插件库v0.3
//功能包括：
// - 支持stdcall及cdecl两种调用方式的外部动态链接库
// - 可支持各种函数参数类型及返回值类型
//   - B : byte 字节
//   - W : Word 字
//   - D : DWord 双字
//   - I : Integer 整数
//   - P : Pointer 指针
//   - S : PChar 字符串
//   - F : Single 单精度浮点数
//   - U : Double 双精度浮点数
// - 可自动处理字符串参数

//本插件限制：目前暂不支持包含复杂指针类型参数的函数调用。

//脚本大师自带的demo脚本中，包含了相关的演示脚本。

//更新历史
//v0.30 : 首次发布的版本


::APIOpen
function APIOpen(LibName:string; FuncName:string; ParamTypes:string; CallType:string): integer;
打开指定外部动态链接库LibName中的指定函数FuncName，返回已打开函数的句柄。
LibName: 外部动态链接库文件名，通常是一个*.dll的文件。
FuncName: 需要打开的外部动态链接库中的指定函数的名字，
         *请注意，该名字区分大小写，必须与外部函数库的导出名字一致。
ParamTypes: 函数的参数表示字符串，通常的形式应当为"XXXX:X"
         冒号前面的XXXX每一个X表示该函数的一个参数，X的取值则表示这个参数的类型
         冒号后面的X则表示函数的返回值类型
         可能的函数参数及返回值类型列举如下：
         - B : byte 字节
         - W : Word 字
         - D : DWord 双字
         - I : Integer 整数
         - P : Pointer 指针
         - S : PChar 字符串
         - F : Single 单精度浮点数
         - U : Double 双精度浮点数
CallType: 函数的调用模式，可支持"Stdcall"(简写为"S")和"cdecl"(简写为"C")两种模式
         如果该参数被忽略或者输入了一个不可识别的模式，则默认按"Stdcall"方式调用
         注: Windows系统标准函数都是stdcall模式调用，只有某些特殊情况才需要用到cdecl模式
举例：
//首先要打开指定的API函数，注意函数名要区分大小写
set hMessageBox=APIOpen('User32.dll','MessageBoxA','ISSI:I','s')
//调用外部函数，注意第2,3,4,5这四个参数为MessageBox所需的输入参数
set i=APICall(hMessageBox,0,'演示如何直接调用标准外部API函数','测试',0)
//最后记得一定要关闭函数以释放系统资源
do APIClose(hMessageBox)

::APIClose
procedure APIClose(hFunc:integer);
关闭已经通过APIOpen打开的外部函数句柄
hFunc: 使用APIOpen打开的函数句柄
举例：
//首先要打开指定的API函数，注意函数名要区分大小写
set hMessageBox=APIOpen('User32.dll','MessageBoxA','ISSI:I','s')
//调用外部函数，注意第2,3,4,5这四个参数为MessageBox所需的输入参数
set i=APICall(hMessageBox,0,'演示如何直接调用标准外部API函数','测试',0)
//最后记得一定要关闭函数以释放系统资源
do APIClose(hMessageBox)

::APICall
function APICall(hFunc:integer; Param1,Param2,Param3,...) : Value;
调用外部动态链接库中的函数实现需要的功能。
hFunc: 通过APIOpen打开的外部函数句柄。
Param1,Param2,Param3,...: 第2至第n个参数都为外部函数所需的参数
      注意，这些外部函数所需参数需要根据前面APIOpen时指定的参数类型来一一正确对号入座，
      否则可能造成外部函数执行不正常。
外部函数的返回值即为本函数的返回值，返回值类型会自行根据外部函数返回值类型转换。
举例：
//首先要打开指定的API函数，注意函数名要区分大小写
set hMessageBox=APIOpen('User32.dll','MessageBoxA','ISSI:I','s')
//调用外部函数，注意第2,3,4,5这四个参数为MessageBox所需的输入参数
set i=APICall(hMessageBox,0,'演示如何直接调用标准外部API函数','测试',0)
//最后记得一定要关闭函数以释放系统资源
do APIClose(hMessageBox)
