Show/Hide Toolbars

XSharp

用途

向编译器声明 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