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

📄 unit1.~pas

📁 本程序旨在讲解如何用Delphi创建一个可以在易语言中执行的支持库
💻 ~PAS
字号:
unit Unit1;

////////////////////////////////////////////////////////////////////////////////
//
// 要增加一个全局命令,请:
//   1.编写命令的实现函数,原形为pFN_EXECUTE_CMD;
//   2.设置常量CommandsCount值加一;
//   3.在InitImpCommands函数中,初始化数组成员InitImpCommands[CommandsCount-1];
//   4.在InitArgumentsInfo函数中,增加一个CASE(即初始化数组成员ArgumentsInfo[CommandsCount-1][]);
//   5.在InitCommandsInfo函数中,增加一个CASE(即初始化数组成员CommandsInfo[CommandsCount-1]);
//   6.在InitLibInfo函数中,修改库的版本号(本步可省略)。
//
// 要增加一个常量,请:
//   1.在InitConstInfo函数中,增加一个CASE(初始化数组成员ConstsInfo[InitConstInfo-1];
//   2.设置常量ConstsCount值加一;
//   3.在InitLibInfo函数中,修改库的版本号(本步可省略)。
//
////////////////////////////////////////////////////////////////////////////////

interface

uses Windows, elibTypes;

const
  CommandsCount = 2;  //!!! 命令个数
  ConstsCount   = 1;  //!!! 常量个数(如果为0,请把常量信息数组ConstsInfo的定义行注释掉,同时把函数InitConstInfo中的代码清除)

var
  LibInfo      : LIB_INFO;

  CommandsInfo : array[0..CommandsCount-1] of CMD_INFO;          // 命令信息
  ArgumentsInfo: array[0..CommandsCount-1] of array of ARG_INFO; // 参数信息
  ImpCommands  : array[0..CommandsCount-1] of pFN_EXECUTE_CMD;   // 命令实现
  ConstsInfo   : array[0..ConstsCount-1]   of LIB_CONST_INFO;    // 常量信息

  function ProsessNotify (nMsg:Integer; dwParam1:LongWord=0; dwParam2:LongWord=0) :Integer; stdcall;
  function AddInFunction (nAddInFnIndex:Integer) :Integer; stdcall;

  //----------------------------------------------------------------------------
  // 唯一的输出函数 GetNewInf() 的声明

  function GetNewInf () : pLIB_INFO; stdcall; export;

  //----------------------------------------------------------------------------
  // 命令实现函数的声明(所有函数的原形都是相同的,即pFN_EXECUTE_CMD)
  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  //左移
  procedure usrSHL(pRetData:pMDATA_INF; nArgCount:Integer; pArgInf:pMDATA_INF); cdecl;
  //右移
  procedure usrSHR(pRetData:pMDATA_INF; nArgCount:Integer; pArgInf:pMDATA_INF); cdecl;

  //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  //----------------------------------------------------------------------------
  // 内部初始化函数的声明
  procedure InitLibInfo;        // 初始化库信息
  procedure InitCommandsInfo;   // 初始化命令信息
  procedure InitArgumentsInfo;  // 初始化参数信息
  procedure InitImpCommands;    // 初始化命令实现信息
  procedure InitConstInfo;      // 初始化常量信息

////////////////////////////////////////////////////////////////////////////////
implementation

//uses Unit2, Unit5;

// 这是本库唯一的输出函数GetNewInf的定义
function GetNewInf () : pLIB_INFO; stdcall; export;
begin
  Result:=@LibInfo;
end;

////////////////////////////////////////////////////////////////////////////////
// 初始化库信息
procedure InitLibInfo;
begin
  LibInfo.m_dwLibFormatVer:=LIB_FORMAT_VER;
  LibInfo.m_szGuid:=PChar('713B2774F7664D27BDD048AA88900FC1'); //Ctrl+Shift+G
  LibInfo.m_nMajorVersion:=1;   // 主版本号
  LibInfo.m_nMinorVersion:=0;   // 次版本号
  LibInfo.m_nBuildNumber:=0;    // 构建版本号
  LibInfo.m_nRqSysMajorVer:=3;
  LibInfo.m_nRqSysMinorVer:=0;
  LibInfo.m_nRqSysKrnlLibMajorVer:=3;
  LibInfo.m_nRqSysKrnlLibMinorVer:=0;
  LibInfo.m_szName:=PChar('*【移位扩展库】* Roya Onfly');  // 支持库名称
  LibInfo.m_nLanguage:=LT_CHINESE;
  LibInfo.m_szExplain:=PChar('易语言移位扩展支持库 Build 0414'+#13+#10+
                      '    诺亚鸿飞软件工作室 吴江涛 '+#13+#10+
                      '------------------------------------------------------------------------------------------------------------------------'+#13+#10);

  LibInfo.m_dwState:=0;

  LibInfo.m_szAuthor:=PChar('吴江涛');        // 作者
  LibInfo.m_szZipCode:=PChar('330034');
  LibInfo.m_szAddress:=PChar('南昌航空工业学院290信箱');
  LibInfo.m_szPhone:=PChar('0791-7066853');
  LibInfo.m_szFax:=nil;
  LibInfo.m_szEmail:=PChar('wujtao@91x.com');
  LibInfo.m_szHomePage:=PChar('Http://wujtao.126.com');
  LibInfo.m_szOther:=PChar('QQ:51273885(私人) 362666286(工作)'+#13+#10+
                      '------------------------------------------------------------------------------------------------------------------------'+#13+#10);


  LibInfo.m_nDataTypeCount:=0;
  LibInfo.m_pDataType:=nil;
  LibInfo.m_nCategoryCount:=1;
  LibInfo.m_szzCategory:=PChar('0024 逻辑移位'+#0);
  LibInfo.m_nCmdCount:=CommandsCount;
  LibInfo.m_pBeginCmdInfo:=@CommandsInfo;
  LibInfo.m_pCmdsFunc:=@ImpCommands;
  LibInfo.m_pfnRunAddInFn:=AddInFunction;
  LibInfo.m_szzAddInFnInfo:=PChar('诺亚鸿飞软件工作室'+#0);
  LibInfo.m_pfnNotify:=ProsessNotify;
  LibInfo.m_pfnSuperTemplate:=nil;
  LibInfo.m_szzSuperTemplateInfo:=nil;
  LibInfo.m_nLibConstCount:=ConstsCount;
  LibInfo.m_pLibConst:=@ConstsInfo;
  LibInfo.m_szzDependFiles:=nil;
end;

////////////////////////////////////////////////////////////////////////////////
// 初始化命令信息
procedure InitCommandsInfo;
var i:Integer;
begin
  // 采用for+case的结构,可使新增一个命令或常量时,在复制、粘贴之后,尽可能减少修改代码的次数。下同。
  for i:=0 to High(CommandsInfo) do case i+1 of
  
  1:// 第一个命令的信息---------------------------------------------------------
    with CommandsInfo[i] do begin
      m_szName:=PChar('左移');
      m_szEGName:=PChar('SHL');
      m_szExplain:=PChar('对数进行左移运算.');
      m_shtCategory:=1;
      m_wState:=0;
      m_dtRetType:=SDT_INT;
      m_wReserved:=0;
      m_shtUserLevel:=LVL_HIGH;
      m_shtBitmapIndex:=0;
      m_shtBitmapCount:=0;
      m_nArgCount:=High(ArgumentsInfo[i])+1;
      m_pBeginArgInfo:=pARG_INFO(ArgumentsInfo[i]);
    end;

  2:// 第二个命令的信息---------------------------------------------------------
    with CommandsInfo[i] do begin
      m_szName:=PChar('右移');
      m_szEGName:=PChar('SHR');
      m_szExplain:=PChar('对数进行右移运算.');
      m_shtCategory:=1;
      m_wState:=0;
      m_dtRetType:=SDT_INT;
      m_wReserved:=0;
      m_shtUserLevel:=LVL_HIGH;
      m_shtBitmapIndex:=0;
      m_shtBitmapCount:=0;
      m_nArgCount:=High(ArgumentsInfo[i])+1;
      m_pBeginArgInfo:=pARG_INFO(ArgumentsInfo[i]);
    end;

  end; // end of case and for
end;

////////////////////////////////////////////////////////////////////////////////
// 初始化参数信息
procedure InitArgumentsInfo;
var i,j,count:Integer;
begin
  for i:=0 to High(ArgumentsInfo) do case i+1 of

  1://以下是第一个命令的参数信息================================================
      begin
      count:=2;  //!!! 本命令的参数个数
      SetLength(ArgumentsInfo[i],count);
      for j:=0 to High(ArgumentsInfo[i]) do case j+1 of
      1:  //第一个参数----------------------------------------------------------
          with ArgumentsInfo[i][j] do begin
            m_szName:=PChar('源数字');
            m_szExplain:=PChar('该数是要进行左移运算的源数字(为整数型,最大长度4字节');
            m_shtBitmapIndex:=0;
            m_shtBitmapCount:=0;
            m_dtDataType:=SDT_INT;
            m_nDefault:=0;
            m_dwState:=0;
          end;

      2:  //第二个参数----------------------------------------------------------
          with ArgumentsInfo[i][j] do begin
            m_szName:=PChar('移位数');
            m_szExplain:=PChar('该数是要进行左移运算的移位书,不能超过16');
            m_shtBitmapIndex:=0;
            m_shtBitmapCount:=0;
            m_dtDataType:=SDT_INT;
            m_nDefault:=1;                    //默认参数
            m_dwState:=AS_HAS_DEFAULT_VALUE;  //参数状态,有默认参数
          end;
      end; // end of case j+1 and for
      end; // end of case i+1

   2://以下是第二个命令的参数信息================================================
      begin
      count:=2;  //!!! 本命令的参数个数
      SetLength(ArgumentsInfo[i],count);
      for j:=0 to High(ArgumentsInfo[i]) do case j+1 of
      1:  //第一个参数----------------------------------------------------------
          with ArgumentsInfo[i][j] do begin
            m_szName:=PChar('源数字');
            m_szExplain:=PChar('该数是要进行右移运算的源数字(为整数型,最大长度4字节');
            m_shtBitmapIndex:=0;
            m_shtBitmapCount:=0;
            m_dtDataType:=SDT_INT;
            m_nDefault:=0;
            m_dwState:=0;
          end;

      2:  //第二个参数----------------------------------------------------------
          with ArgumentsInfo[i][j] do begin
            m_szName:=PChar('移位数');
            m_szExplain:=PChar('该数是要进行右移运算的移位数,不能超过16');
            m_shtBitmapIndex:=0;
            m_shtBitmapCount:=0;
            m_dtDataType:=SDT_INT;
            m_nDefault:=1;                    //默认参数
            m_dwState:=AS_HAS_DEFAULT_VALUE;  //参数状态,有默认参数
          end;
      end; // end of case j+1 and for
      end; // end of case i+1

  // 在此添加其它命令的参数信息

  end; // end of case i+1 and for
end;

////////////////////////////////////////////////////////////////////////////////
// 初始化命令实现信息
// 在这里编写用户自定义的处理函数
procedure InitImpCommands;
begin
  ImpCommands[0]:=usrSHL;   //左移函数
  ImpCommands[1]:=usrSHR;   //右移函数

end;

////////////////////////////////////////////////////////////////////////////////
// 初始化常量信息
procedure InitConstInfo;
var i:Integer;
begin
  for i:=0 to High(ConstsInfo) do case i+1 of

  1://第一个常量----------------------------------------------------------------
      with ConstsInfo[i] do begin
        m_szName:=PChar('诺亚鸿飞');
        m_szEGName:=PChar('Roya');
        m_szExplain:=nil;
        m_shtReserved:=1;
        m_shtType:=CT_TEXT;
        m_szText:=PChar('诺亚鸿飞软件工作室 吴江涛');
        m_dbValue:=0;
      end;

  //在此添加其它常量信息

  end; // end of case and for
end;

////////////////////////////////////////////////////////////////////////////////
// 接受来自易IDE的通知,目的就是获得向易IDE反馈信息的函数指针g_fnNotifySys(全局变量)
function ProsessNotify (nMsg:Integer; dwParam1:LongWord=0; dwParam2:LongWord=0) :Integer; stdcall;
var ReturnValue: Integer;
begin
  ReturnValue:=NR_OK;
  case nMsg of
      NL_SYS_NOTIFY_FUNCTION:
      g_fnNotifySys:=pFN_NOTIFY_SYS(dwParam1);
    else ReturnValue:=NR_ERR;
  end;
  Result:=ReturnValue;
end;

////////////////////////////////////////////////////////////////////////////////
// 附加功能实现函数的定义(代码实现)
function AddInFunction (nAddInFnIndex:Integer) :Integer; stdcall;
begin
(*
  AboutMe(nil,0,nil);
*)
  MessageBox(0,pchar(nAddInFnIndex),'E-IDE Notify',MB_OK);
  Result:=0;


end;

////////////////////////////////////////////////////////////////////////////////
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
// 命令实现函数的定义(代码实现)
// 在函数中可通过ArgArray(pArgInf)[i].m_Value读取易传过来的第i个参数(i从0开始,0表示第一个参数)
procedure usrSHL (pRetData:pMDATA_INF; nArgCount:Integer; pArgInf:pMDATA_INF); cdecl;
begin
//左移实现过程
  pRetData.m_Value.m_int:=ArgArray(pArgInf)[0].m_Value.m_int SHL ArgArray(pArgInf)[1].m_Value.m_int;
end;


procedure usrSHR (pRetData:pMDATA_INF; nArgCount:Integer; pArgInf:pMDATA_INF); cdecl;
begin
//右移实现过程
  pRetData.m_Value.m_int:=ArgArray(pArgInf)[0].m_Value.m_int SHR ArgArray(pArgInf)[1].m_Value.m_int;

end;

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
////////////////////////////////////////////////////////////////////////////////
initialization
  //////////////////////////////////////////////////////////////////////////////
  // 初始化支持库信息,以下函数的调用顺序不可轻易变动
  InitArgumentsInfo;
  InitCommandsInfo;
  InitImpCommands;
  InitConstInfo;
  InitLibInfo;
  //////////////////////////////////////////////////////////////////////////////

end.

⌨️ 快捷键说明

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