delphi6直连redis服务(用lua脚本redis模块)

一、创建一个exe程序

        创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn2: TButton;
    Memo1: TMemo;
    edt1: TEdit;
    edt2: TEdit;
    edt3: TEdit;
    btn3: TButton;
    edt4: TEdit;
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
uses
  LuaRedis;
  
{$R *.dfm}

procedure TForm1.btn2Click(Sender: TObject);
var
  sTmp, sErrorMsg: string;
begin
  Memo1.Text := '';
  try
    sTmp := getValue(Trim(edt1.Text), sErrorMsg);    // value111
    Memo1.Text := sTmp + '->' + sErrorMsg;
  except
    on e:Exception do begin
      ShowMessage('【异常】' + e.Message);
      Exit;
    end;
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
var
  sKey, sValue, sErrorMsg: string;
begin
  Memo1.Text := '';
  try
    sKey := Trim(edt2.Text);
    if setKeyValue(sKey, Trim(edt3.Text), StrToIntDef(Trim(edt4.Text), 0), sErrorMsg) then begin   // key111  value111
      sValue := getValue(Trim(edt2.Text), sErrorMsg);
    end;
    Memo1.Text := sKey + ':' + sValue + '->' + sErrorMsg;
  except
    on e:Exception do begin
      ShowMessage('【异常】' + e.Message);
      Exit;
    end;
  end;
end;

end.

二、封装LuaRedis.pas单元代码

        上面说的封装LuaRedis.pas单元(通过registerLuaState()和destroyLuaState()来加载和销毁lua的状态机),同时引用Lua.pas, LuaLib.pas单元,代码如下:

unit LuaRedis;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Lua, LuaLib;

const
  C_LuaPathFileName = './luaScript/mytest.lua';

function getValue(myKey: string; var sErrorMsg: string): string;

function setKeyValue(myKey, myValue: string; myExpire: Integer; var sErrorMsg: string): Boolean;

var
  LuaObj: TLua;
  L: TLuaState;

implementation

function loadLuaScript(sLuaPathFileName: String; var sErrorMsg: string): Boolean;
var
  nTmp: Integer;
begin
  Result := False;
  try
    sErrorMsg := '默认提示消息(loadLuaScript)!';
    if not FileExists(sLuaPathFileName) then begin
      sErrorMsg := '未查到路径中此Lua脚本文件(' + sLuaPathFileName + ')';
      Exit;
    end;
    nTmp := LuaObj.DoFile(sLuaPathFileName);
    case nTmp of
      LUA_OK : begin
        sErrorMsg := '成功加载路径中此Lua脚本文件!';
        Result := True;
      end;
      LUA_ERRSYNTAX : sErrorMsg := '在预编译Lua文件时发现了语法错误!';
      LUA_ERRMEM : sErrorMsg := '在执行Lua文件时内存分配错误!';
      LUA_ERRRUN : sErrorMsg := '在执行Lua文件中在调用函数时发生了运行时错误!';
      else
      sErrorMsg := '加载失败路径中此Lua脚本文件!';
    end;
  except
    on e:Exception do begin
      Result := False;
      sErrorMsg := '【异常】方法(loadLuaScript):' + e.Message;
      Exit;
    end;
  end;
end;

function getValue(myKey: string; var sErrorMsg: string): string;
var
  nRet: Integer;
begin
  try
    sErrorMsg := '默认提示消息(getValue)!';
    if not loadLuaScript(C_LuaPathFileName, sErrorMsg) then begin
      Exit;
    end;
    lua_getglobal(L, 'getValue');
    lua_pushstring(L, PAnsiChar(myKey));
    nRet := lua_pcall(L, 1, 1, 0);
    if nRet = 0 then begin
      Result := lua_toString(L, -1);
      sErrorMsg := 'Lua脚本正常执行';
      Exit;
    end else
      sErrorMsg := 'Lua脚本执行失败!';
  except
    on e:Exception do begin
      Result := '';
      sErrorMsg := '【异常】方法(getValue):' + e.Message;
      Exit;
    end;
  end;
end;

function setKeyValue(myKey, myValue: string; myExpire: Integer; var sErrorMsg: string): Boolean;
var
  nRet: Integer;
begin
  Result := False;
  try
    sErrorMsg := '默认提示消息(setKeyValue)!';
    if not loadLuaScript(C_LuaPathFileName, sErrorMsg) then begin
      Exit;
    end;
   
    lua_getglobal(L, 'setKeyValue');
    lua_pushstring(L, PAnsiChar(myKey));
    lua_pushstring(L, PAnsiChar(myValue));
    lua_pushinteger(L, myExpire);
    nRet := lua_pcall(L, 3, 1, 0);
    if nRet = 0 then begin
      Result := (lua_toInteger(L, -1) = 1);
      sErrorMsg := 'Lua脚本正常执行';
      Exit;
    end else
      sErrorMsg := 'Lua脚本执行失败!';
  except
    on e:Exception do begin
      Result := False;
      sErrorMsg := '【异常】方法(setKeyValue):' + e.Message;
      Exit;
    end;
  end;
end;

procedure registerLuaState();
begin
  if LuaObj = nil then begin
    LuaObj := TLua.Create;
    if L = nil then begin
      L := LuaObj.LuaInstance;
    end;
    // luaL_openlibs 是一个由 luaL(Lua 实用程序库)提供的函数,它用于打开一组标准的Lua库。
    // 这些库通常包括基础库(base)、字符串处理库(string)、表操作库(table)、数学函数库(math)、I/O库(io)、操作系统库(os)等。
    // 这个函数通常在你的C/C++程序中与Lua交互时使用,以提供完整的Lua标准库功能。
    luaL_openlibs(L);
  end;
end;

procedure destroyLuaState();
begin
  if LuaObj <> nil then begin
    if L <> nil then begin
      L := nil;
    end;
    LuaObj.Free;
  end;
end;

initialization
  registerLuaState();

finalization
  destroyLuaState();

end.

三、封装的Lua, LuaLib单元

        封装的Lua, LuaLib单元,代码如下:

{ 
/** 
 * @package     Delphi Lua 
 * @copyright   Copyright (c) 2009 Dennis D. Spreen (http://www.spreendigital.de/blog) 
 * @license     http://opensource.org/licenses/gpl-license.php GNU Public License 
 * @author      Dennis D. Spreen <dennis@spreendigital.de> 
 * @version     1.3 
 * @revision    $Id: Lua.pas 102 2009-09-30 11:39:41Z dennis.spreen $ 
 */ 
 
History 
1.3     DS      Improved Callback, now uses pointer instead of object index 
                Modified RegisterFunctions to allow methods from other class 
                to be registered, moved object table into TLua class 
1.2 DS  Added example on how to extend lua with a delphi dll 
1.1     DS      Improved global object table, this optimizes the delphi 
                function calls 
1.0     DS      Initial Release 
 
Copyright 2009  Dennis D. Spreen (email : dennis@spreendigital.de) 
 
This program is free software; you can redistribute it and/or modify 
it under the terms of the GNU General Public License as published by 
the Free Software Foundation; either version 2 of the License, or 
(at your option) any later version. 
 
This program is distributed in the hope that it will be useful, 
but WITHOUT ANY WARRANTY; without even the implied warranty of 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
GNU General Public License for more details. 
 
You should have received a copy of the GNU General Public License 
along with this program; if not, write to the Free Software 
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA 
}  
  
unit Lua;  
  
interface  
  
uses  
  Classes,  
  LuaLib;  
  
type  
  TLuaState = Lua_State;  
  
  TLua = class(TObject)  
  private  
    fAutoRegister: Boolean;  
    CallbackList: TList;  // internal callback list  
  public  
    LuaInstance: TLuaState;  // Lua instance  
    constructor Create(AutoRegister: Boolean = True); overload; virtual;  
    destructor Destroy; override;  
    function DoFile(Filename: String): Integer; virtual;// load file and execute  
    procedure RegisterFunction(FuncName: AnsiString; MethodName: AnsiString = ''; Obj: TObject = NIL); virtual; //register function  
    procedure AutoRegisterFunctions(Obj: TObject);  // register all published functions  
    procedure UnregisterFunctions(Obj: TObject); // unregister all object functions  
  end;  
  
implementation  
  
type  
  TProc = function(L: TLuaState): Integer of object; // Lua Function  
  
  TCallback = class  
    Routine: TMethod;  // Code and Data for the method  
    Exec: TProc;       // Resulting execution function  
  end;  
  
//  
// This function is called by Lua, it extracts the object by  
// pointer to the objects method by name, which is then called.  
//  
// @param       Lua_State   L   Pointer to Lua instance  
// @return      Integer         Number of result arguments on stack  
//  
function LuaCallBack(L: Lua_State): Integer; cdecl;  
var  
  CallBack: TCallBack;       // The Object stored in the Object Table  
begin  
  // Retrieve first Closure Value (=Object Pointer)  
  CallBack := lua_topointer(L, lua_upvalueindex(1));  
  
  // Execute only if Object is valid  
  if (assigned(CallBack) and assigned(CallBack.Exec)) then  
    Result := CallBack.Exec(L)  
  else  
    Result := 0;  
end;  
  
{ TLua }  
  
//  
// Create a new Lua instance and optionally create Lua functions  
//  
// @param       Boolean      AutoRegister       (optional)  
// @return      TLua                            Lua Instance  
//  
constructor TLua.Create(AutoRegister: Boolean = True);
begin  
  inherited Create;  
  // Load Lua Lib if not already done  
  if (not LuaLibLoaded) then  
    LoadLuaLib();  
  
  // Open Library  
  LuaInstance := Lua_Open();  
  luaopen_base(LuaInstance);  
  
  fAutoRegister := AutoRegister;  
  
  // Create Object List on initialization  
  CallBackList := TList.Create;  
  
  // if set then register published functions  
  if (AutoRegister) then  
    AutoRegisterFunctions(self);  
end;  
  
//  
// Dispose Lua instance  
//  
destructor TLua.Destroy;  
begin  
  // Unregister all functions if previously autoregistered  
  if (fAutoRegister) then  
    UnregisterFunctions(Self);  
  
  // dispose Object List on finalization  
  CallBackList.Free;  
  
  // Close instance  
  Lua_Close(LuaInstance);  
  inherited;  
end;  
  
//  
// Wrapper for Lua File load and Execution  
//  
// @param       String  Filename        Lua Script file name  
// @return      Integer  
//  
function TLua.DoFile(Filename: String): Integer;  
begin  
  Result := lual_dofile(LuaInstance, PAnsiChar(AnsiString(Filename)));  
end;  
  
//  
// Register a new Lua Function and map it to the Objects method name  
//  
// @param       AnsiString      FuncName        Lua Function Name  
// @param       AnsiString      MethodName      (optional) Objects Method name  
//  
procedure TLua.RegisterFunction(FuncName: AnsiString; MethodName: AnsiString = ''; Obj: TObject = NIL);  
var  
  CallBack: TCallBack; // Callback Object  
begin  
  // if method name not specified use Lua function name  
  if (MethodName = '') then  
    MethodName := FuncName;  
  
  // if not object specified use this object  
  if (Obj = NIL) then  
    Obj := Self;  
  
  // Add Callback Object to the Object Index  
  CallBack := TCallBack.Create;  
  CallBack.Routine.Data := Obj;  
  CallBack.Routine.Code := Obj.MethodAddress(String(MethodName));  
  CallBack.Exec := TProc(CallBack.Routine);  
  CallbackList.Add(CallBack);  
  
  // prepare Closure value (Method Name)  
  lua_pushstring(LuaInstance, PAnsiChar(FuncName));  
  
  // prepare Closure value (CallBack Object Pointer)  
  lua_pushlightuserdata(LuaInstance, CallBack);  
  
  // set new Lua function with Closure value  
  lua_pushcclosure(LuaInstance, LuaCallBack, 1);  
  lua_settable(LuaInstance, LUA_GLOBALSINDEX);  
end;  
  
//  
// UnRegister all new Lua Function  
//  
// @param       TObject     Object      Object with prev registered lua functions  
//  
procedure TLua.UnregisterFunctions(Obj: TObject);  
var  
  I: Integer;  
  CallBack: TCallBack;  
begin  
  // remove obj from object list  
  for I := CallBackList.Count downto 1 do  
  begin  
    CallBack := CallBackList[I-1];  
    if (assigned(CallBack)) and (CallBack.Routine.Data = Obj) then  
    begin  
      CallBack.Free;  
      CallBackList.Items[I-1] := NIL;  
      CallBackList.Delete(I-1);  
    end;  
  end;  
end;  
  
//  
// Registe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/602393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仅为娱乐,Python中如何重定义True为False?

在Python中&#xff0c;True 和 False 是内建的布尔常量&#xff0c;分别代表逻辑上的真和假。它们是不可变的&#xff0c;且在Python语言规范中具有特殊地位&#xff0c;不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的&#xff0c;这样的操作会…

​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

在缺少标注数据场景&#xff0c;SetFit 是解决的建模问题的一个有前途的解决方案&#xff0c;其由 Hugging Face 与Intel 实验室以及UKP Lab合作共同开发。作为一个高效的框架&#xff0c;SetFit 可用于对Sentence Transformers模型进行少样本微调。 SetFit 仅需很少的标注数据…

【JavaEE精炼宝库】计算机是如何工作的

目录 前言&#xff1a; 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系&#xff1a; 2.2 指令&#xff1a; 2.3 CPU是如何执行指令的&#xff08;重点&#xff09;&#xff1a; 2.4 小结&#xff1a; 三、编程语言 3.1 程序&#xff1a; 3.2 编程语言发展&a…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖&#xff0c;单号收益300左右&#xff0c;多开收益更多&#xff0c;轻松日入1000 可矩阵操作。 项目长期稳定&#xff0c;全自动挂机无需人工操作&#xff0c;小白&#xff0c;宝妈&#xff0c;想做副业的都可以。

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

翻译技巧早操练-(减译法)

hello&#xff0c;大家好&#xff0c;今天继续来学习翻译的技巧篇第二个-减译法。 往期回顾 翻译早操练-&#xff08;增译法&#xff09;-CSDN博客 减译法的目的就是为了译入语表达的通顺&#xff0c;如果原文的一些表达直接翻译到译入语即累赘还不合时宜&#xff0c;那么可以采…

【启明智显技术分享】基于ESP32-S3方案的彩屏固件烧录指南

前言&#xff1a; 【启明智显】专注于HMI&#xff08;人机交互&#xff09;及AIoT&#xff08;人工智能物联网&#xff09;产品和解决方案的提供商&#xff0c;我们深知彩屏显示方案在现代物联网应用中的重要性。为此&#xff0c;我们一直致力于为客户提供彩屏显示方案相关的技…

主播美颜技术探秘:计算机视觉赋能的直播美颜SDK

今天&#xff0c;我们将深入探讨直播美颜技术背后的计算机视觉原理&#xff0c;以及赋能这一技术的直播美颜SDK。 一、计算机视觉与直播美颜 计算机视觉是一门研究如何使机器“看”的学科&#xff0c;它利用数字图像处理和模式识别等技术&#xff0c;使计算机能够模拟人类视觉…

STL速查

容器 (Containers) 图解容器 支持随机访问 stringarrayvectordeque支持支持支持支持 string 类 构造函数 string(); ------创建一个空的字符串 例如: string str;string(const char* s); ------使用字符串s初始化string(const string& str); ------拷贝构造 赋值操作…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动&#xff01; 就在最近&#xff0c;有网友分享了一个用Stable Diffusion打造二次元动画的工具&#xff0c;直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元&#xff0c;耳机也可蜕变成小兔兔&#xff1a; 瞧&#xff01;连易拉罐的拉环也化身成…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构&#xff0c;表数据&#xff0c;索引以及序列号等对象导出成SQL文件。 数据库版本&#xff1a;Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本&#xff1a;Oracle SQL Develo…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

【Python】一道字典题目

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) 输出台&#xff1a;

构建一个快速数据分析(boruta+shap+rcs)的shiny APP

构建一个快速数据分析&#xff08;borutashaprcs&#xff09;的shiny APP 之前提出了一个快速数据分析的流程&#xff0c;包括&#xff1a; 变量筛选&#xff0c;使用Boruta等变量筛选的方法来找出相关的变量&#xff1b;发现规律&#xff0c;使用SHAP分析的散点图、交互作用图…

如何使用Python下载哔哩哔哩(Bilibili)视频字幕

在本文中&#xff0c;我将向大家展示如何使用Python下载哔哩哔哩&#xff08;Bilibili&#xff09;视频的字幕。通过这个方法&#xff0c;你可以轻松地获取你喜欢的视频的字幕文件&#xff0c;方便学习和交流。 准备工作 在开始之前&#xff0c;我们需要安装一些必要的库&…

第一个C++项目

文章目录 一、新建项目1.打开软件&#xff0c;选择“创建新项目”2.新建项目栏中&#xff0c;按自己的需求来设置项目模板&#xff0c;项目名称和文件存放位置&#xff0c;设置好后点击“确认”3. 点击“Next”4. 按照自己需求设置&#xff0c;设置完后&#xff0c;点击“Next”…

【Linux 性能详解】CPU性能篇

目录 平均负载&#xff08;Load Average&#xff09; CPU上下文切换 进程上下文切换 线程上下文切换 中断上下文切换 中断 硬中断 软中断 CPU使用率 性能分析工具 平均负载&#xff08;Load Average&#xff09; 平均负载&#xff1f;这个词对很多人来说&#xff0c…

【新三个数排序的自创算法,这是我厉年来很满意的一次排序算法设计,最好小于O(N)最坏O((NN/3)/2)。】2024-5-7

缘由如何用C&#xff0b;&#xff0b;解决一下问题_编程语言-CSDN问答 int a[]{1, 4, 7, 8, 5, 2, 3, 6, 9, 7}, n 10, x n, jh 0, j 0;px:if (j < n) {//缘由https://ask.csdn.net/questions/8099444if (--x < 2 j)x n - 1, j 3;if (x < n - 1 && a[x…

【强训笔记】day14

NO.1 思路&#xff1a;用一个哈希表&#xff0c;先遍历s1&#xff0c;统计哈希表内的字符个数&#xff0c;在遍历s2&#xff0c;s2中的字符在哈希表中减去&#xff0c;如果哈希表中的字符个数小于0那么就输出No。 代码实现&#xff1a; #include <iostream> #include&…