- 执行检查
- 处理错误
- 加载和释放DLL
- 传递给DLL函数的参数
- 给API传递一个字符串或者获取从API那获取一个返回的字符串。
- 传递一个结构体给API
- 给API传递一个带字符串的结构体
- CallBack调用的进程
- 其他
运行一个在外部DLL中的函数。 该函数可以是一个Windows API的函数。 被 API访问的函数是标准的Windows库的功能(例如USER32, KERNEL32, GDI32, 等等) 函数可以被指定,通过: - 其名称。
- 其编号。
16版本和更高版本其地址。 16新版本其地址。 其地址。
16版本和更高版本同样可以使用 API型的描述型类型的变量。 对于在同一应用中被多次调用的API或者使用特殊类型的参数,建议使用API描述型变量和直接使用 (不通过 API函数传递 )。 16新版本同样可以使用 API型的描述型类型的变量。 对于在同一应用中被多次调用的API或者使用特殊类型的参数,建议使用API描述型变量和直接使用 (不通过 API函数传递 )。 同样可以使用API型的描述型类型的变量。 对于在同一应用中被多次调用的API或者使用特殊类型的参数,建议使用API描述型变量和直接使用 (不通过API函数传递 )。注意: - 该函数等价于函数调用DLL32。
16版本和更高版本如果要执行的函数具有QWORD类型的参数,那么必须使用一个 API型的描述型类型的变量(语法4) 16新版本如果要执行的函数具有QWORD类型的参数,那么必须使用一个 API型的描述型类型的变量(语法4) 如果要执行的函数具有QWORD类型的参数,那么必须使用一个API型的描述型类型的变量(语法4).
API("用户32", "发消息A", hWnd, wMsg, l参数1, l参数2)
语法
运行一个外部DLL或者通过名称指定的Windows API的一个函数 隐藏详细信息
<结果> = API(<DLL名> , <函数名> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<函数名称>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <DLL的名称>: 字符串(有引号) 包含要执行的函数的库(DLL)名称。 <函数名称>: 字符串(有引号) 要执行的函数的名称。 该函数应该在特定的DLL中。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(看标注),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
执行一个外部DLL或者通过编号指定的Windows API的一个函数。 隐藏详细信息
<结果> = API(<DLL名> , <函数名> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<函数名称>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <DLL的名称>: 字符串(有引号) 包含要执行的函数的库(DLL)名称。 <函数的编号>: 整数型 要执行的函数的编号。 该函数应该在特定的DLL中。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
16版本和更高版本
执行一个外部DLL或者通过地址指定的Windows API的一个函数 隐藏详细信息
<结果> = API(<函数地址> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<函数名称>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <函数的地址>: 整数型 要执行的函数的内存地址。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
16新版本
执行一个外部DLL或者通过地址指定的Windows API的一个函数 隐藏详细信息
<结果> = API(<函数地址> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<函数名称>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <函数的地址>: 整数型 要执行的函数的内存地址。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
执行一个外部DLL或者通过地址指定的Windows API的一个函数 隐藏详细信息
<结果> = API(<函数地址> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<函数名称>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <函数的地址>: 整数型 要执行的函数的内存地址。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
16版本和更高版本
用一个API描述型变量来运行一个外部DLL或者API Windows函数。 隐藏详细信息
<结果> = API(<要运行的API> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<要运行的API>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <要运行的API>: 描述型API变量 API型的描述型 类型变量包含了要运行的函数的特性。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
16新版本
用一个API描述型变量来运行一个外部DLL或者API Windows函数。 隐藏详细信息
<结果> = API(<要运行的API> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<要运行的API>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <要运行的API>: 描述型API变量 API型的描述型 类型变量包含了要运行的函数的特性。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
用一个API描述型变量来运行一个外部DLL或者API Windows函数。 隐藏详细信息
<结果> = API(<要运行的API> [, <参数1> [, <参数2> [, ...]]])
<结果>: 32bits下4字节整数型,64bits下8字节整数型。 执行函数<要运行的API>的结果。 此结果可以是错误提示信息。 该结果的类型取决于执行的函数。 请参考这个函数的资料来获取更多信息。 如果函数的结果大小超出了平台的大小,其不能被获取。 <要运行的API>: 描述型API变量 API型的描述型 类型变量包含了要运行的函数的特性。 <参数1>: 与参数相对应的类型 要传递给函数的第一个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
<参数2>: 与参数相对应的类型 要传递给函数的第二个参数。 这些参数应该与函数需要的参数类型相同。 可以是:- “简单”类型(查看注释),
- 结构体(看标注),
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
注意
执行检查 - 函数API被保护以防止在调用函数中出现“一般保护性错误”。 尽管如此,一旦此类型的错误产生了,那么一个W语言错误将被触发。
- 对于PASCAL调用原型的功能(尤其是WindowsAPI的功能),一个传递给函数的参数数量的总结控制被执行。 当发生分歧时,一个W语言错误将被触发。
处理错误 在运行方法时,如果返回的结果对应的是错误信息,请使用函数 错误信息 来获取此错误的更多信息(同时使用常量 异常错误.系统错误代码 或 异常错误.系统消息)。
加载和释放DLL 函数 API 自动加载需要的DLL,然后将其释放(如果其已经被加载)。 该机制可能会很慢,除了对于DLL系统(KERNEL, USER, GDI)。 为了优化执行速度,建议用函数加载DLL加载DLL然后当该DLL不再使用时用函数释放DLL释放。
传递给DLL函数的参数 这些参数应该与函数需要的参数类型相同。 可用类型如下: - "简单"类型(整数型,浮点型和布尔型)。 使用其他的W语言类型将会产生一个W语言错误。
如果要运行的方法需要一个Windows指针或句柄作为参数,请使用一个系统整数型. 如果要运行的函数需要一个地址,那么请用 操作符&。 - "字符串"类型。
- 结构类型。
- 一个W语言的过程名。 这个过程将被DLL的函数调用(看标注).
参数取决于运行的方法 请参考这个函数的资料来获取更多信息。
给API传递一个字符串或者获取从API那获取一个返回的字符串。 - 作为输入参数,请使用字符串类型。
例如:
sString是字符串型 API(<DLL>, <函数>, s字符串)
- 作为输出参数,C语言不能够简单的处理动态字符串。 因此,您必须:
- 通过"长度是...的字符串"确定一个最大值。
例如:
sString是长度是100的字符串型 API(<DLL>, <函数>, s字符串) // 在C语言中: // strncpy(C语言指针, "Test", 100)
- 通过C语言获取字符串的地址(这种情况下,C语言的代码部分应保留返回的字符串),然后通过函数字符串获取将字符串转换成一个字符串变量。
例如:
n字符串地址是系统整数型 API(<DLL>, <函数>, &n字符串地址) sString是字符串型 sString=字符串获取(n字符串地址,字符串.ASCIIZ地址) // 在C语言中: *C语言指针="Test"
- 作为返回值,通过C语言获取字符串的地址(这种情况下,C语言的代码部分应保留返回的字符串),然后通过函数字符串获取将字符串转换成一个字符串变量。
例如:
n字符串地址是系统整数型 n字符串地址 = API(<DLL>, <函数>) sString是字符串型 sString=字符串获取(n字符串地址,字符串.ASCIIZ地址) // 在C语言中: 返回C语言指针
传递一个结构体给API 结构体可以直接带参数地被传递给API,无需通过它们的地址。 要做到这一点,只需一个接一个地给结构体传递成员参数。 限制: 所有结构体成员必须以4个字节的形式排齐。
给API传递一个带字符串的结构体 - 作为输入,使用代码如下:
Struct是结构型 sString是字符串型 结束 S是Struct API(<DLL>, <函数>, &一个结构体)
- 作为输出参数,C语言不能够简单的处理动态字符串。 因此我们需要:
- 确定一个最大值并且拷贝到W语言的内存里。
例如:
sString是长度是100的字符串型 Struct是结构型 aString是整数型 结束 S是Struct S:aString = &sString API(<DLL>, <函数>, &一个结构体) // 在C语言中: // strncpy(C语言Struct->C语言指针, "Test", 100)
- 通过C语言获取字符串的地址(这种情况下,C语言的代码部分应保留返回的字符串)。
例如:
sString是字符串型 Struct是结构型 aString是整数型 结束 S是Struct API(<DLL>, <函数>, &一个结构体) s字符串 = 字符串获取(一个结构体提:a字符串.ASCIIZ地址 ) // 在C语言中: C语言Struct->C语言指针 = "Test"
CallBack调用的进程 有一些Windows API函数等待着进程"CallBack"的地址作为参数: 此过程将会被API函数再调用。 例如: EnumWindows的API允许列出在一个工作站上所有打开的Windows窗口。 此功能需要一个参数的过程的地址: 本程序将被调用每个发现的窗口。 16版本和更高版本注意: 回调过程可用于32位就像64位一样。 16新版本注意: 回调过程可用于32位就像64位一样。 注意: 回调过程可用于32位就像64位一样。在W语言中使用进程CallBack:1. 在您的项目里创建callback进程
要获取参数,我们必须准确地描述所有的参数使之与函数"CallBack"相对应。 否则,将会提示"常规保护错误"。
过程 <过程名> (<参数1> 是 [一个] <类型1>, ... <参数2> 是 [一个] <类型2>)
注意: - 该类型必须匹配API文档中的描述。
18版本和更高版本DLL的调用函数“回调”的协定必须是“stdcall”或者“cdecl”。 默认情况下,调用协定被认为是“stdcall”。 可以声明一个回调“cdecl”归功于“调用协定”延伸的应用。 函数的协议变成:
过程 <过程名> (<参数1> 是 [一个] <类型1>, ... <参数2> 是 [一个] <类型2>) <调用协定=CDECL>
18新版本DLL的调用函数“回调”的协定必须是“stdcall”或者“cdecl”。 默认情况下,调用协定被认为是“stdcall”。 可以声明一个回调“cdecl”归功于“调用协定”延伸的应用。 函数的协议变成:
过程 <过程名> (<参数1> 是 [一个] <类型1>, ... <参数2> 是 [一个] <类型2>) <调用协定=CDECL>
DLL的调用函数“回调”的协定必须是“stdcall”或者“cdecl”。 默认情况下,调用协定被认为是“stdcall”。 可以声明一个回调“cdecl”归功于“调用协定”延伸的应用。 函数的协议变成:
过程 <过程名> (<参数1> 是 [一个] <类型1>, ... <参数2> 是 [一个] <类型2>) <调用协定=CDECL>
- 所有参数都应以数值传递。 要通过地址获取参数:
- 请使用一个整数型
- 通过使用函数传递, 获取或分配真正的数值。
2. 修改相应函数的调用。 使用如下语法:
API(<DLL名>, <函数名>, <回调过程名>)
为了获取更多细节,请参考完整例子。
|
|
| | |
|