Delphi XE开发Linux应用(一)

article/2025/9/11 12:09:04

Delphi是我常用的开发工具,使用C语言开发Linux应用当然高效,但是对于数据库的操作等方面还是不方便,开发的速度和功能和Delphi比起来还是相差甚远。因此我选择使用Delphi XE进行Linuxde开发,Delphi xe开发Linux以下应用非常方便当然也可以使用Linux下的容器技术进行管理。

  • Console Application

  • EMS Package(RAD Server)

  • DataSnap WebBroker

  • WebBroker

  • Dynamic-link Libraries

  • DUnitX Project

一、Linux开发环境的配置。

(1)安装ubuntu系统

首先在虚拟机安装ubuntu系统,我这里使用的是64位桌面版:ubuntu16.04.2

(2)安装SDK

在ubuntu中打开terminal终端,输入指令:sudo add-apt-repository ppa:ubuntu-sdk-team/ppa

然后再输入:sudo apt install Ubuntu-sdk 安装sdk

3)运行paserver

将10.2安装目录下的Embarcadero\Studio\19.0\PAServer\LinuxPAServer19.0.tar.gz文件复制到ubuntu系统中,并解压,然后进入这个解压目录点击右键开启一个terminal终端。

并运行paserver.

(4)配置Delphi

打开tools-options-sdk manager。然后点击add...

在弹出来的对话框选择64-bit Linux然后select a profile to connect:选择Add new

Profile name随便设置一个。我设置的是:Linux64,点击next.

然后输入ubuntu的ip地址。端口号就是默认的64211,密码由于没设置就不需要填写,填完点击Test Connection如果提示成功就可以了。

然后开始安装SDK了...

(5)安装fmxforlinux

如果不是桌面应用,那么完成前面四个步骤就已经可以了,但是桌面系统还需要安装FMXFORLINUX。

如果你要开发基于FMX框架的桌面应用并且要运行在linux系统的话,那还需要安装一个fmxlinux的插件,因为delphi10.2本身是不支持开发linux的桌面应用的,这个第三方的插件貌似是FMX框架的原开发者离开了Embarcadero公司后,自己做出来的,所以他开发的这个插件在稳定性上应该是没有问题的,感兴趣的同学可以到此网站下载,目前测试版本可以免费下载:http://www.fmxlinux.com/index.html。下载以后直接安装就可了。10.3可以安装1.41,直接安装完成即可。

(6)测试程序

创建一个FMX应用程序,在界面上添加一个TMEMO和一个TBUTTON然后点击按钮添加

Memo1.Lines.Add('First linux application');

在project点击右键,选择add linux platform

程序运行成功。

二、DELPHI开发LINUX包

我们知道,有了包的存在,开发插件架构的程序,才成为可能 。

DELPHI在WINDOWS里面的包的扩展名是.bpl。

在LINUX里面的包的扩展名是.so。

怎样在LINUX里面加载.so的包?

不论加载WINDOWS的包,还是加载LINUX的包,都是使用LoadPackage()函数加载。

function LoadPackage(const Name: string; AValidatePackage: TValidatePackageProc): HMODULE;
{$IFDEF POSIX}
varDLErrorMsg: string;M: TMarshaller;
{$ENDIF POSIX}
begin
{$IFDEF MSWINDOWS}Result := SafeLoadLibrary(Name);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}Result := HMODULE(dlopen(M.AsAnsi(Name, CP_UTF8).ToPointer, PkgLoadingMode));
{$ENDIF POSIX}if Result = 0 thenbegin
{$IFDEF POSIX}DLErrorMsg := string(dlerror);
{$ENDIF POSIX}raise EPackageError.CreateResFmt(@sErrorLoadingPackage,[Name,{$IFDEF MSWINDOWS}SysErrorMessage(GetLastError){$ENDIF MSWINDOWS}{$IFDEF POSIX}DLErrorMsg{$ENDIF POSIX}]);end;tryInitializePackage(Result, AValidatePackage);except
{$IFDEF MSWINDOWS}FreeLibrary(Result);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}dlclose(Result);
{$ENDIF POSIX}raise;end;
end;
procedure UnloadPackage(Module: HMODULE);
beginFinalizePackage(Module);
{$IFDEF MSWINDOWS}FreeLibrary(Module);
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}dlclose(Module);InvalidateModuleCache;
{$ENDIF POSIX}
end;

三、开发linux 上的Daemon

Delphi 10.2 支持linux, 而且官方只是支持命令行编程,目地就是做linux 服务器端的开发。既然是做linux服务器端的开发,那么普通的命令行运行程序,然后等待开一个黑窗口的方式就太low了(目前就有个别语言大咖,经常在Windows 上开个黑窗口,看起来非常恶心),那么如果避免这个尴尬的问题?

其实Linux 下也有类似windows 服务的功能,Linux Daemon 就是其中的一种方式,命令行运行后直接返回,同时在后台建立一个同样的进程。接受客户端的访问。常见的一些linux 服务基本上都是这样工作的。例如著名apache,mysql 等。具体的linux Daemon 的介绍,

今天我们就使用delphi 来开发一个后台的http server, 来说明delphi 如何开发linux 的Daemon.

3.1、新建工程,建一个控制台应用。
3.2、因为这个只能在linux 运行,所以直接加入linux 支持。
3.3、因为我们要做http server, 要放一些控件,因此再加一个datamodule.
3.4、然后在datamodule 上放一个Tidhttpserver 控件
3.5、在oncommandget 里面加入以下事件
procedure Tdmf.IdHTTPServer1CommandGet(AContext: TIdContext;ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
beginAResponseInfo.ContentText:='I am delphi for linux service';
end;
3.6、修改工程文件如下
program Project2;{$APPTYPE CONSOLE}{$R *.res}
usesPosix.Unistd,Posix.SysTypes,System.SysUtils,dmp in 'dmp.pas' {dmf: TDataModule};procedure daemon;begindmf:=Tdmf.Create(nil);dmf.IdHTTPServer1.Active:=True;tryrepeatsleep( * );until False;finallydmf.Free;end;end;varpid: pid_t;beginpid := fork;if pid =  thenbeginwriteln('starting service');daemon;end;end.
3.7、编译运行

首先我们看一下系统中的运行进程: ps -ef

里面没有Project2 的任何信息。

我们运行这个程序:

运行完后,程序立即就返回了

我们在看看系统进程里面的情况

我们可以看见这个Project2 依然在进程中。

那么这个进程是否可以正常工作呢?

我们打开浏览器,看看情况如何?

可以看见这个这个程序在后面运行的非常正常。

当然了,由于这是一个demo, 我没有做太多的处理,其实由于daemon 进程无法与前台直接交互,我们以后写这种应用时。

应该多用 日志 文件来记录运行情况,一般出问题时,能够快速的找到问题的根源。

那么这个程序一直在后台运行,我们再次编译和发布时,就没办法覆盖了,怎么关掉这个后台进程呢?

办法很简单,也很粗暴(反正我喜欢)。

使用linux 的kill 命令。

找到该应用的pid, 直接干掉

然后使用ps -ef 看看

Project2 已经不在了,整个世界清静了。


http://chatgpt.dhexx.cn/article/FakpvIxO.shtml

相关文章

Delphi XE 10 跨平台三层数据库应用教程

Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高、最容易上手的,其快速设计RAD理念是无与伦比的符合人性。 目前网上XE10类似教程很少,而且学习途中遇到一些问题就难以继续了&#x…

FleaPHP的单入口文件详解

在 FleaPHP 应用程序使用 MVC 模式时&#xff0c;应用程序的所有功能都通过一个单一的文件来调用。这种通过单一文件来执行所有功能的应用程序&#xff0c;称为单一入口应用程序。 该文件通常放在程序主目录下。其代码如下所示&#xff1a; Php代码 <?php /** * 入口…

介绍国产的PHP MVC框架:FleaPHP

国产的PHP MVC框架&#xff1a;FleaPHP 官方网站&#xff1a;http://www.fleaphp.org框架下载&#xff1a;http://www.fleaphp.org/download框架API &#xff1a;http://www.fleaphp.org/docs/api/index.html开发指南&#xff1a;http://www.fleaphp.org/guide框架社区&#…

FleaPHP 开发指南 - 7. 数据表关联

数据表关联是指两个或者多个数据表的记录之间的逻辑关系。 例如&#xff1a; 每一个公民都有一个身份证号码 每一位作者都写了多本&#xff08;0-n&#xff09;书籍&#xff0c;而每一本书籍都有多个&#xff08;1-n&#xff09;作者 每一篇文章都有多个&#xff08;0-n&…

FleaPHP 开发指南 - 5. 应用程序设置

FleaPHP 是一个具有高度灵活性的框架。开发者可以用不同的设置来调整 FleaPHP 的工作方式。这些设置统一保存在名为“应用程序设置”的数据源中。 实际上,除了 FleaPHP 框架本身,应用程序也可以使用“应用程序设置”来保存应用程序运行时需要的各种设置。 FleaPHP 的应用程…

FleaPHP 开发指南 - 6. 访问数据库

这一章我们就来看看 FleaPHP 的数据库访问功能。体验一下 FleaPHP 出色的自动化 CRUD 能力。 连接数据库 在 htdocs 目录中创建子目录 testDB&#xff0c;并在子目录下创建文件 test1.php 文件&#xff0c;内容如下&#xff1a; <?phprequire(../FLEA/FLEA.php);__FLEA_P…

FleaPHP 的 Ajax 支持和 WebControls

原文地址&#xff1a; http://www.fleaphp.org/bbs/viewthread.php?tid40 FleaPHP 现在具有了基本的 Ajax 支持&#xff0c;示例代码如下&#xff1a; 首先在控制器显示模版的动作方法中有如下代码&#xff1a; /* * * 显示登录界面 */ function actionIndex() {…

实际采用 FleaPHP 的网站

下面都是采用 FleaPHP 框架开发的网站列表&#xff0c;如果发现无效连接请在留言。 如果你有采用 FleaPHP 开发的网站&#xff0c;并且愿意公开网址&#xff0c;可以发邮件到 dualface (at) gmail.com 需要提供的信息包括网站名称和连接地址&#xff0c;以及简单的介绍文字。…

获取和安装 FleaPHP

目前 FleaPHP 还处于开发中&#xff0c;您应该经常访问该页面&#xff0c;下载最新版本的 FleaPHP&#xff0c;或者通过 Subversion 仓库直接更新本地的 FleaPHP 代码。 FleaPHP 完全版和 FleaPHP runtime 核心合计下载次数已经超过 2000 次。 下载 FleaPHP 如果无法使用 Sub…

关于 FleaPHP

FleaPHP 并不是心血来潮的结果&#xff0c;而是作者在 Web 开发中不断探索的成果。虽然 FleaPHP 缺乏 Zend Framework 那样巨大的号召力&#xff0c;也没有 CakePHP 和 Symfony 那样庞大的社区。但 FleaPHP 仍然是一个值得你花时间去了解、去学习的框架。 FleaPHP 的设计目标 F…

http头部content-type与数据格式

http 头部中的 content-type 和我们传递的数据是息息相关的&#xff0c;不同的取值&#xff0c;服务器解析处理方式不同&#xff0c; 介绍一下几种常见的方式 text/plain&#xff1a;ajax默认方式&#xff0c;将文件设置为纯文本的形式&#xff0c;浏览器在获取到这种文件时…

http 协议中的content-type

content-type可以位于请求头、响应头&#xff0c;分别代表&#xff1a; Request头&#xff1a;请求的与实体对应的MIME信息&#xff08;post请求时的请求体&#xff09;Response头&#xff1a;返回内容的MIME类型 由于http1.0版规定&#xff0c;头信息必须是 ASCII 码类型&am…

contentType的类型及其在上传下载的例子

content-type之上传下载 下载 Content-Type 实体头部用于指示资源的MIME类型&#xff0c;在响应中&#xff0c;Content-Type标头告诉客户端实际返回的内容的类型。 Content-Disposition 是 MIME 协议的扩展&#xff0c;通常用在下载文件时&#xff0c;是下载文件的一个标识字…

Http中Content-Type等属性详解

前言 一直以来对HTTP请求中各种属性一知半解,偶然在博客中找到一篇,特意摘录过来方便自己以后查看. 正文 敬请关注博客&#xff0c;后期不断更新优质博文&#xff0c;谢谢 这里讲解Content-Type的可用值&#xff0c;以及在spring MVC中如何使用它们来映射请求信息。 1. Con…

HTTP首部——Content-Type的作用

前言 对于我们习以为常的东西&#xff0c;却没有仔细思考它的作用。 HTTP的首部都各有个的价值&#xff0c;最近看到这个Content-Type&#xff0c;忽然让我想起来以前自己的一个小小的失误&#xff0c;而产生了一个bug。但是当时却搞得我焦头烂额&#xff0c;我在网络上查找了一…

http(S)系列之(一):概念

参考文章&#xff1a; HTTP & HTTPS网络协议重点总结&#xff08;基于SSL/TLS的握手、TCP/IP协议基础、加密学&#xff09; 一篇比较全的HTTP协议详解 记&#xff1a;千万别误会&#xff0c;本章是完全ctrlc然后ctrlv&#xff0c;知识理解才是最重要&#xff0c;不必要在…

http 协议之 Content-Type

Content-Type 字段是 http 服务端返回给客户端时&#xff0c;head 里面带上的&#xff0c;这个字段表明服务端返回给客户端的 body 是什么类型的&#xff0c;然后客户端就可以根据这个类型进行文件处理。如浏览器客户端&#xff0c;针对 text/html 类型时&#xff0c;是直接显示…

Http中的Content-Type详解

Content-Type Content-Type&#xff08;MediaType&#xff09;&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff0c;也叫做MIME类型。在互联网中有成百上千中不同的数据类型&#xff0c;HTTP在传输数据对象时会为他们打上称为MIME的数据格式标签&#x…

HTTP(S)协议详解

1 什么是协议 协议&#xff0c;网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵从的一组约定。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。 粗俗理解协议就是 比如你的电脑和我的电脑要通信&#xff0c;&a…

详解Http的Content-Type

目录 1.概述 2.常用类型 2.1.application/x-www-form-urllencoded 2.2.application/json 3.Spring MVC支持的编码 3.1.实验 3.2.适配器 3.3.自定义适配器 1.概述 HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;超文本传输协议。超文本&#xf…