⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elibtypes.pas

📁 本程序旨在讲解如何用Delphi创建一个可以在易语言中执行的支持库
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  //////////////////////////////////////////////////////////////////////////////
  // “库常量”数据结构 Lib_Const_Info

  pLIB_CONST_INFO =^LIB_CONST_INFO;
  LIB_CONST_INFO  = record

    m_szName       : PChar;     // 常量名称
    m_szEGName     : PChar;     // 常量英文名称,可以为空或nil
    m_szExplain    : PChar;     // 详细解释

    m_shtReserved  : Smallint;  // 必须为 1 。
    m_shtType      : Smallint;  // 常量类型,取值为CT_NULL(0),CT_NUM(1),CT_BOOL(2),CT_TEXT(3)之一,见下面的说明和常量定义
    m_szText       : PChar;	    // 文本(当m_shtType取值为CT_TEXT时)
    m_dbValue      : double;	  // 数值(当m_shtType取值为CT_NUM、CT_BOOL时)
    ////////////////////////////////////////////////////////////////////////////
    // 其中,m_shtType 可以取以下常量值之一:
    //   CT_NULL  = 0;  // 空值
    //   CT_NUM   = 1;	// 数值型,如: 3.14159
    //   CT_BOOL  = 2;	// 逻辑型,如: 1       ( 1代表'真'; 0代表'假')
    //   CT_TEXT  = 3;	// 文本型,如: 'abc'
    ////////////////////////////////////////////////////////////////////////////
  end;

const
  //////////////////////////////////////////////////////////////////////////////
  // 以下常量在 LIB_CONST_INFO 结构中用到

  CT_NULL  = 0;  // 空值
  CT_NUM   = 1;	 // 数值型,如: 3.14159
  CT_BOOL  = 2;	 // 逻辑型,如: 1       ( 1代表'真'; 0代表'假')
  CT_TEXT  = 3;	 // 文本型,如: 'abc'

  //////////////////////////////////////////////////////////////////////////////

type
  //////////////////////////////////////////////////////////////////////////////
  // 常用数据结构。

  // 标识窗口单元
  pMUNIT = ^MUNIT;
  MUNIT  = record
    m_dwFormID  : LongWord;
    m_dwUnitID  : Longword;
  end;

  // 临时结构,仅在MDATA_INF中用于定义m_Value成员
  T_MDATA_INF_Data = packed record       // Note: packed record, it's important.
    case Integer of
       // 第一部分。注意:当对应参数具有AS_RECEIVE_VAR或AS_RECEIVE_VAR_ARRAY或AS_RECEIVE_VAR_OR_ARRAY标志定义时将使用下面的第二部分。
    0: ( m_byte          : Byte);        // SDT_BYTE 数据类型的数据,下同。
    1: ( m_short         : SmallInt);    // SDT_SHORT
    2: ( m_int           : Integer);     // SDT_INT
    3: ( m_int64         : Int64);       // SDT_INT64
    4: ( m_float         : Single);      // SDT_FLOAT
    5: ( m_double        : Double);      // SDT_DOUBLE
    6: ( m_date          : TDateTime);   // SDT_DATE_TIME   (在VC中: typedef double DATE; 在Delphi中: type TDateTime = type Double;)
    7: ( m_bool          : LongBool);    // SDT_BOOL  (在VC中: typedef int BOOL;)
    8: ( m_pText         : PChar);       // SDT_TEXT,经过系统预处理,即使是空文本,此指针值也不会为nil,以便于处理。指针所指向数据的格式见前面的描述。!!!为了避免修改到常量段(m_pText有可能会指向易程序常量段区域)中的数据,只可读取而不可更改其中的内容,下同。
    9: ( m_pBin          : ^Byte);       //??? LPBYTE;  // SDT_BIN,经过系统预处理,即使是空字节集,此指针值也不会为nil,以便于处理。指针所指向数据的格式见前面的描述。!!!只可读取而不可更改其中的内容。
    10:( m_dwSubCodeAdr  : LongWord);    // SDT_SUB_PTR,为子程序代码地址指针。
    11:( m_unit          : MUNIT);       // 窗口单元、菜单数据类型的数据。
    12:( m_pCompoundData : Pointer);     // 复合数据类型数据指针,指针所指向数据的格式见前面的描述。!!! 只可读取而不可更改其中的内容。
    13:( m_pAryData      : Pointer);     // 数组数据指针,指针所指向数据的格式见前面的描述。注意如果为文本或字节集数组,则成员数据指针可能为NULL。!!! 只可读取而不可更改其中的内容。

       // 第二部分。为指向变量地址的指针,仅当参数具有AS_RECEIVE_VAR或AS_RECEIVE_VAR_ARRAY或AS_RECEIVE_VAR_OR_ARRAY标志时才被使用。
    14:( m_pByte          : ^Byte);      // SDT_BYTE 数据类型变量的地址,下同。
    15:( m_pShort         : ^SmallInt);  // SDT_SHORT
    16:( m_pInt           : ^Integer);   // SDT_INT
    17:( m_pInt64         : ^Int64);     // SDT_INT64
    18:( m_pFloat         : ^Single);    // SDT_FLOAT
    19:( m_pDouble        : ^Double);    // SDT_DOUBLE
    20:( m_pDate          : ^TDateTime); // SDT_DATE_TIME
    21:( m_pBool          : ^LongBool);  // SDT_BOOL
    22:( m_ppText         : PPChar);     // SDT_TEXT,注意*m_ppText可能为NULL(代表空文本)。写入新值之前必须释放前值,例句:NotifySys (NRS_MFREE, (DWORD)*m_ppText)。!!!不可直接更改*m_ppText所指向的内容,只能释放原指针后设置入NULL(空文本)或使用NRS_MALLOC通知分配的新内存地址指针(下同)。
    23:( m_ppBin          : ^PByte);     // SDT_BIN,注意*m_ppBin可能为NULL(代表空字节集)。写入新值之前必须释放前值,例句:NotifySys (NRS_MFREE, (DWORD)*m_ppBin)。!!!不可直接更改*m_ppBin所指向的内容,只能释放原指针后设置入NULL(空字节集)或新指针。
    24:( m_pdwSubCodeAdr  : ^LongWord);  // SDT_SUB_PTR,子程序代码地址变量地址。
    25:( m_pUnit          : ^MUNIT);     // 窗口单元、菜单数据类型变量地址。
    26:( m_ppCompoundData : ^Pointer);   // 复合数据类型变量地址。!!!注意写入新值之前必须使用NRS_MFREE通知逐一释放所有成员(即:SDT_TEXT、SDT_BIN及复合数据类型成员)及原地址指针。!!!不可直接更改*m_ppCompoundData所指向的内容,只能释放原指针后设置入新指针。
    27:( m_ppAryData      : ^Pointer);   // 数组数据变量地址,注意: 1、写入新值之前必须释放原值,例句:NotifySys (NRS_FREE_ARY,m_dtDataType, (DWORD)*m_ppAryData),注意:此例句只适用于m_dtDataType为系统基本数据类型时的情况,如果为复合数据类型,必须根据其定义信息逐一释放。2、如果为文本或字节集数组,则其中成员的数据指针可能为NULL。!!!不可直接更改*m_ppAryData所指向的内容,只能释放原指针后设置入新指针。
  end;

  // MDATA_INF用作记录函数指针pFN_EXECUTE_CMD的返回值和参数信息
  pMDATA_INF = ^MDATA_INF;
  MDATA_INF  = record
    m_Value      : T_MDATA_INF_Data;  // 数据内容
    m_dtDataType : DATA_TYPE;         // 数据类型,见下面的说明

    ////////////////////////////////////////////////////////////////////////////
    //
    // 关于 m_dtDataType 的说明:
    //
    //  1、当用作传递参数数据时,如果该参数具有AS_RECEIVE_VAR_OR_ARRAY或
    //     AS_RECEIVE_ALL_TYPE_DATA标志,且为数组数据,则包含标志DT_IS_ARY,
    //     这也是DT_IS_ARY标志的唯一使用场合。
    //     DT_IS_ARY 的定义为:const DT_IS_ARY = $20000000;
    //  2、当用作传递参数数据时,如果为空白数据,则为_SDT_NULL。
    //
    ////////////////////////////////////////////////////////////////////////////
  end;

  ArgArray = array of MDATA_INF;  // 通常用于全局命令的实现代码中, 辅助读取参数值。

  // !!! ASSERT(sizeof(MDATA_INF)==sizeof(DWORD)*3); 结构MDATA_INF的尺寸必须等于12字节。


  //////////////////////////////////////////////////////////////////////////////
  // 通知用数据结构。

  // 支持库可以通知易编辑环境(IDE)或易运行环境(RUNTIME)的码值:

  PMDATA = ^MDATA;
  MDATA  = record          // 初始值:m_pData=nil; m_nDataSize=0;
    m_pData     : PByte;
    m_nDataSize : Integer;
  end;

  // 记录事件的来源
  PEVENT_NOTIFY = ^EVENT_NOTIFY;
  EVENT_NOTIFY  = class        // 记录事件的来源
    m_dwFormID    : LongWord;  // 调用ITF_CREATE_UNIT接口所传递过来的所处窗口ID(dwWinFormID参数)
    m_dwUnitID    : Longword;  // 调用ITF_CREATE_UNIT接口所传递过来的窗口单元ID(dwUnitID参数)
    m_nEventIndex : Integer;   // 事件索引(在窗口单元定义信息LIB_DATA_TYPE_INFO中m_pPropertyBegin成员中的位置)
    m_nArgCount   : Integer;   // 本事件所传递的参数数目,最多 5 个。
    m_nArgValue   : array[0..4] of Integer; // 记录各参数值,SDT_BOOL型参数值为 1 或 0。

    //!!! 注意下面两个成员在没有定义返回值的事件中无效,其值可能为任意值。
    m_blHasReturnValue : LongBool; // 用户事件处理子程序处理完毕事件后是否提供了返回值。
    m_nReturnValue     : Integer;  // 用户事件处理子程序处理完毕事件后的返回值,逻辑值用数值 0(假) 和 1(真) 返回。

    procedure EVENT_NOTIFY(dwFormID,dwUnitID : LongWord; nEventIndex:Integer);

  end;

const
  //////////////////////////////////////////////////////////////////////////////
  // 消息常量定义 (消息号)

  // NES_ 开头的常量为仅被易编辑环境(IDE)处理的通知(消息号)。[NES: Notify_Editable_System]

  NES_GET_MAIN_HWND = 1;  // 取易编辑环境主窗口的句柄,可以在支持库的AddIn函数中使用。
  NES_RUN_FUNC = 2;       // 通知易编辑环境运行指定的功能,返回一个BOOL值。dwParam1为功能号;dwParam2为一个双DWORD数组指针,分别提供功能参数1和2。

  // NAS_ 开头的常量为既被易编辑环境又被易运行环境处理的通知(消息号)。[NAS: Notify_All_System]
  NAS_GET_LIB_DATA_TYPE_INFO = 1002;  //返回指定库定义数据类型的pLIB_DATA_TYPE_INFO定义信息指针。dwParam1为欲获取信息的数据类型DATA_TYPE;如果该数据类型无效或者不为库定义数据类型,则返回nil,否则返回pLIB_DATA_TYPE_INFO指针。

  // NRS_ 开头的常量为仅能被易运行环境处理的通知(消息号)。[NRS: Notify_Runtime_System]
  NRS_UNIT_DESTROIED     = 2000; // 通知系统指定的单元已经被销毁。dwParam1为dwFormID;dwParam2为dwUnitID;
  NRS_CONVERT_NUM_TO_INT = 2001; // 转换其它数值格式到整数。dwParam1为pMDATA_INF指针,其m_dtDataType必须为数值型。返回转换后的整数值。
  NRS_GET_CMD_LINE_STR   = 2002; // 取当前命令行文本,返回命令行文本指针,有可能为空串。
  NRS_GET_EXE_PATH_STR   = 2003; // 取当前执行文件所处目录名称,返回当前执行文件所处目录文本指针。
  NRS_GET_EXE_NAME       = 2004; // 取当前执行文件名称,返回当前执行文件名称文本指针。
  NRS_GET_UNIT_PTR       = 2006; // 取单元对象指针。dwParam1为WinForm的ID;dwParam2为WinUnit的ID。成功返回有效的单元对象CWnd*指针,失败返回nil。
  NRS_GET_AND_CHECK_UNIT_PTR        = 2007; // 取单元对象指针,并检查该指针。dwParam1为WinForm的ID;dwParam2为WinUnit的ID。成功返回有效的单元对象CWnd*指针,失败自动报告运行时错误并立即退出程序。
  NRS_EVENT_NOTIFY                  = 2008; // 通知系统产生了事件。dwParam1为PEVENT_NOTIFY指针。如果返回0,表示此事件已被系统抛弃,否则表示系统已经成功传递此事件到用户事件处理子程序。
  NRS_STOP_PROCESS_EVENT_NOTIFY     = 2009; // 通知系统暂停处理事件通知。
  NRS_CONTINUE_PROCESS_EVENT_NOTIFY = 2010; // 通知系统继续处理事件通知。
  NRS_DO_EVENTS          = 2018; // 通知Windows系统处理所有已有事件。
  NRS_GET_UNIT_DATA_TYPE = 2022; // 取单元数据类型。dwParam1为WinForm的ID;dwParam2为WinUnit的ID。成功返回有效的DATA_TYPE,失败返回0。
  NRS_FREE_ARY           = 2023; // 释放指定数组数据。dwParam1为该数据的DATA_TYPE,只能为系统基本数据类型;dwParam2为指向该数组数据的指针。
  NRS_MALLOC             = 2024; // 分配指定空间的内存,所有与易程序交互的内存都必须使用本通知分配。dwParam1为欲需求内存字节数。dwParam2如为0,则如果分配失败就自动报告运行时错并退出程序,如不为0,则如果分配失败就返回nil。返回所分配内存的首地址。
  NRS_MFREE              = 2025; // 释放已分配的指定内存。dwParam1为欲释放内存的首地址。
  NRS_MREALLOC           = 2026; // 重新分配内存。dwParam1为欲重新分配内存尺寸的首地址;dwParam2为欲重新分配的内存字节数。返回所重新分配内存的首地址,失败自动报告运行时错并退出程序。
  NRS_RUNTIME_ERR        = 2027; // 通知系统已经产生运行时错误。dwParam1为char*指针,说明错误文本。
  NRS_EXIT_PROGRAM       = 2028; // 通知系统退出用户程序。dwParam1为退出代码,该代码将被返回到操作系统。
  NRS_GET_PRG_TYPE       = 2030; // 返回当前用户程序的类型,为2(调试版)或3(发布版)。
    
  //////////////////////////////////////////////////////////////////////////////
  // 易编辑环境(IDE)或易运行环境(RUNTIME)可以通知支持库的码值(消息号):

  NL_SYS_NOTIFY_FUNCTION = 1;
        // 告知支持库通知系统用的函数指针,在装载支持库前通知,可能有多次,
  	// (后通知的值应该覆盖前面所通知的值),忽略返回值。
	// 库可将此函数指针记录下来以便在需要时使用它通知信息到系统。
	// dwParam1: (PFN_NOTIFY_SYS)
  //////////////////////////////////////////////////////////////////////////////

const
  NR_OK  =  0;
  NR_ERR = -1;
type
  // 此函数用作易编辑环境(IDE)或易运行环境(RUNTIME)通知支持库有关事件。
  pFN_NOTIFY_LIB = function(nMsg:Integer; dwParam1:LongWord=0; dwParam2:LongWord=0) :Integer; stdcall; // 参数dwParam1,dwParam2如果不使用则置0

  // 此函数用作库通知易编辑环境(IDE)或易运行环境(RUNTIME)有关事件。
  pFN_NOTIFY_SYS = function(nMsg:Integer; dwParam1:LongWord=0; dwParam2:LongWord=0) :Integer; stdcall; // 参数dwParam1,dwParam2如果不使用则置0

  //////////////////////////////////////////////////////////////////////////////
  // 所有命令和方法实现函数的原型 pFN_EXECUTE_CMD
  //
  // 说明如下:
  //   1、必须是CDECL调用方式;
  //   2、pRetData用作返回数据;
  //   3、!!!如果指定库命令返回数据类型不为_SDT_ALL,可以
  //      不填充 pRetData->m_dtDataType,如果为_SDT_ALL,则必须填写;
  //   4、pArgInf提供参数数据本身,所指向的MDATA_INF记录每个输入参数,数目等同于nArgCount。
  //////////////////////////////////////////////////////////////////////////////
  pFN_EXECUTE_CMD    = procedure(pRetData:pMDATA_INF; nArgCount:Integer; pArgInf:pMDATA_INF); cdecl;

  // 运行支持库中ADDIN功能的函数
  pFN_RUN_ADDIN_FN   = function(nAddInFnIndex:Integer) :Integer; stdcall;

  // 创建库中提供的超级模板程序的函数
  pFN_SUPER_TEMPLATE = function(nTemplateIndex:Integer) :Integer; stdcall;

////////////////////////////////////////////////////
const
  LIB_FORMAT_VER = 20000101;	// 库格式号。在LIB_INFO结构中使用。


type
  (*                    ***************                                       *)
  (**********************   LIB_INFO  *****************************************)
  (*                    ***************                                       *)
  //////////////////////////////////////////////////////////////////////////////
  // “支持库信息”数据结构 LIB_INFO

  pLIB_INFO = ^LIB_INFO;
  LIB_INFO  = record
    m_dwLibFormatVer         : LongWord;   // 库格式号,应该等于LIB_FORMAT_VER
    m_szGuid                 : PChar;      // 对应于本库的唯一GUID串,不能为NULL或空,相同库的所有后续版本此串都应相同。注意,此GUID字串必须使用专用工具软件生成(在Delphi内,可以通过组合键[Ctrl+Shift+G]生成一个GUID字串),以防止出现重复。

    m_nMajorVersion          : Integer;    // 本库的主版本号,必须大于0
    m_nMinorVersion          : Integer;    // 本库的次版本号
    m_nBuildNumber           : Integer;    // 构建版本号。本版本号仅用作区分相同正式版本号的系统软件(譬如仅仅修改了几个 BUG,不值得升级正式版本的系统软件)。任何公布过给用户使用的版本其构建版本号都应该不一样。赋值时应该顺序递增。

    m_nRqSysMajorVer         : Integer;    // 所需要易语言系统的主版本号,目前应该为 3
    m_nRqSysMinorVer         : Integer;    // 所需要易语言系统的次版本号,目前应该为 0
    m_nRqSysKrnlLibMajorVer  : Integer;    // 所需要的系统核心支持库的主版本号,目前应该为 3
    m_nRqSysKrnlLibMinorVer  : Integer;    // 所需要的系统核心支持库的次版本号,目前应该为 0

    m_szName                 : PChar;      // 库名,不能为nil或空
    m_nLanguage              : Integer;    // 本库所支持的语言,目前应该为 LT_CHINESE (=1)。见下面的说明和常量定义。
    m_szExplain              : PChar;      // 有关本库的详细解释
    m_dwState                : LongWord;   // 支持库状态,见以下的说明和常量定义(LBS_FUNC_NO_RUN_CODE(4);LBS_NO_EDIT_INFO(8))

    m_szAuthor               : PChar;      // 作者姓名
    m_szZipCode              : PChar;      // 邮编
    m_szAddress              : PChar;      // 地址
    m_szPhone                : PChar;      // 电话
    m_szFax                  : PChar;      // 传真
    m_szEmail                : PChar;      // 电子邮件
    m_szHomePage             : PChar;      // 网站主页
    m_szOther                : PChar;      // 作者其它信息

    m_nDataTypeCount         : Integer;             // 本库中自定义数据类型的数目,必须等于m_pDataType所指向数组成员的数目

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -