向编译器声明 DLL 中定义的实体。
[Attributes] [Modifiers] _DLL FUNCTION | PROCEDURE
[([<idParam> [AS | REF <idType>] [, ...])]
[AS <idType>]
[<idConvention>]
:<idDLL>.<idEntity>
[CharSet= AUTO|ANSI|UNICODE]
参数
<idEntity> | DLL 中定义的实体名称或编号。 这通常与 <EntityDeclaration> 中定义的实体名称相同,但不一定,后者可能定义了实体在应用程序中的别名。 <idEntity> 必须是由 <idDLL> 标识的 DLL 公共协议的一部分。 |
IdEntity 也可以指定为字面量字符串。这样做是为了指定 DLL 中导出函数的名称,这些名称包含的字符在 X# 中不允许作为标识符的一部分。 |
<idParam> | 参数变量。 以这种方式指定的变量会自动声明为局部变量。 这些变量也称为形参(形式参数),用于接收调用实体时传递的参数。 |
AS | REF | OUT | IN <idType> | 指定参数变量的数据类型(称为强类型)。 AS 表示参数必须通过值传递,REF 表示参数必须通过带 @ 操作符的引用传递。OUT 是一种特殊的 REF 参数,不必在调用前赋值,必须在实体内部赋值。IN 参数作为 READONLY 引用传递。 |
列表中的最后一个参数也可以声明为 PARAMS <idType>[] ,这将告诉编译器函数/方法可以接收零个或多个可选参数。 |
使用 CLIPPER 调用约定的函数或方法将被编译为一个带有单个参数的函数,该参数被声明为 Args PARAMS USUAL[] 。 |
<idConvention> | 指定此实体的调用约定。 <idConvention> 必须是以下内容之一: |
o CLIPPER
o STRICT
o PASCAL
o CALLBACK
o THISCALL
大多数 调用约定 仅用于向后兼容。 但是,存在两个例外情况: 1. CLIPPER 声明方法具有未类型化参数。通常只有没有声明参数的方法才需要这样做。否则,编译器在检测到未类型化参数时将假定使用 CLIPPER 调用约定。 2. 外部 DLL 的方法和函数可以使用 STRICT、PASCAL、 CALLBACK 调用约定。 |
<idDLL> | 包含实体定义的 DLL 文件名,不含扩展名或路径名(即基本文件名)。 假定扩展名为 .DLL(由 Windows 决定的某些例外情况可能有 .EXE 扩展名),用于在运行时搜索文件的规则将在下文的 "描述"部分解释。 |
Charset | 可选择指定字符串参数具有哪些字符集 |
_DLL 声明了一个实体,该实体由应用程序使用,但定义在 DLL 中。 该语句不仅告诉编译器 DLL 实体的位置和名称(或编号),而且还告诉编译器它的调用约定(即它需要哪些参数以及返回值的类型)。 使用 _DLL 语句声明实体时,它还向编译器表明,该实体在声明之后没有其他源代码。
一旦声明,就可以在应用程序中以标准方式调用该实体。
警告: _DLL 语句中包含的实体名称区分大小写。这与 X# 编译器直接矛盾,后者不区分大小写,但与 Windows 调用协议一致。因此,如果开启了大小写敏感功能或打开了大写锁定,则必须格外小心。
下面的示例说明了两个 Windows API 函数的 _DLL 声明:
_DLL FUNCTION MessageBeep(siLevel AS SHORTINT) AS VOID PASCAL:User.MessageBeep
_DLL FUNCTION MessageBox(hwndParent AS PTR, pszText AS PSZ, pszCapt AS PSZ, dwFlags AS DWORD) ;
AS LONG PASCAL:User.MessageBox
// 如果需要,您也可以声明一个带有 "普通 "字符串参数的函数。添加 ANSI 或 UNICODE 子句来指明您要调用的版本。
_DLL FUNCTION MessageBox(hwndParent AS PTR, pszText AS STRING, pszCapt AS STRING, dwFlags AS DWORD) ;
AS LONG PASCAL:User.MessageBox ANSI
ACCESS, ASSIGN, FUNCTION, METHOD, PROCEDURE