PC SOFT

WINDEV的在线文档

  • 执行检查
  • 处理错误
  • 加载和释放DLL
  • 传递给DLL函数的参数
  • 给API传递一个字符串或者获取从API那获取一个返回的字符串。
  • 传递一个结构体给API
  • 给API传递一个带字符串的结构体
  • CallBack调用的进程
  • 其他
产品
WinDevWebDev-服务器代码WebDev-浏览器代码WinDev Mobile报表和查询
平台
WindowsLinuxWindows MobileWindows PhoneWindows Store appsAndroidAndroid Widget iPhone/iPad
语言
JavaPHPAjax用户代码(MCU)外部语言
数据库
HFSQLHFSQL Client/Server存储过程HF 5.5OLE DBODBC本地访问

运行一个在外部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"hWndwMsgl参数1l参数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那获取一个返回的字符串。

  1. 作为输入参数,请使用字符串类型。
    例如:
    sString是字符串型
    API(<DLL>, <函数>, s字符串)
  2. 作为输出参数,C语言不能够简单的处理动态字符串。 因此,您必须:
    • 通过"长度是...的字符串"确定一个最大值。
      例如:
      sString是长度是100的字符串型
      API(<DLL>, <函数>, s字符串)
      // 在C语言中:
      // strncpy(C语言指针, "Test", 100)
    • 通过C语言获取字符串的地址(这种情况下,C语言的代码部分应保留返回的字符串),然后通过函数字符串获取将字符串转换成一个字符串变量。
      例如:
      n字符串地址是系统整数型
      API(<DLL>, <函数>, &n字符串地址)
      sString是字符串型
      sString=字符串获取(n字符串地址,字符串.ASCIIZ地址)
      // 在C语言中: *C语言指针="Test"
  3. 作为返回值,通过C语言获取字符串的地址(这种情况下,C语言的代码部分应保留返回的字符串),然后通过函数字符串获取将字符串转换成一个字符串变量。
    例如:
    n字符串地址是系统整数型
    n字符串地址 = API(<DLL>, <函数>)
    sString是字符串型
    sString=字符串获取(n字符串地址,字符串.ASCIIZ地址)
    // 在C语言中: 返回C语言指针

传递一个结构体给API

结构体可以直接带参数地被传递给API,无需通过它们的地址。 要做到这一点,只需一个接一个地给结构体传递成员参数。

限制: 所有结构体成员必须以4个字节的形式排齐。

给API传递一个带字符串的结构体

  1. 作为输入,使用代码如下:
    Struct是结构型
    sString是字符串型
    结束
    S是Struct
    API(<DLL>, <函数>, &一个结构体)
  2. 作为输出参数,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>
  • 所有参数都应以数值传递。 要通过地址获取参数:
    1. 请使用一个整数型
    2. 通过使用函数传递, 获取或分配真正的数值。
2. 修改相应函数的调用。 使用如下语法:
API(<DLL名>, <函数名>, <回调过程名>)

为了获取更多细节,请参考完整例子。

WinDev用户代码(MCU)

其他

  • API函数和调用DLL32与其它进程不冲突。
  • 如果调用的API函数修改了语言环境参数,那么以前的语言环境参数被备份了。
函数API参数可以配置这些函数的默认行为。

注意: 直到100045版本:

  • API函数和调用DLL32与其它进程不冲突。
  • 如果调用的API函数修改了环境参数,那么以前的环境参数不被备份。

组件
WinDev wd200vm.dll
Linux wd200vm.so