Delphi XE开发Linux应用(一)
创始人
2024-06-01 23:23:20
0

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如果提示成功就可以了。

(5)安装fmxforlinux

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

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

http://www.fmxlinux.com/index.html。下载以后直接安装就可了。

(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 已经不在了,整个世界清静了。

相关内容

热门资讯

老舍的经典名言名句 关于老舍的经典名言名句  1、的智慧,加上孩子的天真,或者就能成个好作家了。  2、美丽的人是不多施...
“楼上阑干横斗柄,露寒人远鸡... 楼上阑干横斗柄,露寒人远鸡相应。 [译文] 北斗星已斜挂在高楼之上,清晨露寒,离人走远,只有晨起的鸡...
描写桥的诗句 描写桥的诗句(精选90句)  在平时的.学习、工作或生活中,大家都经常接触到诗句吧,诗句通常按照诗文...
庆祝元宵节古诗鉴赏 按中国民间的传统,在一元复始,大地回春的节日夜晚,天上明月高悬,地上彩灯万盏人们观灯、猜灯谜、吃元宵...
四季的诗句 四季的诗句四季的诗句1  1、春风知别苦,不遣柳条青。李白《劳劳亭》  2、草秀故春色,梅艳昔年妆。...
八月湖水平,涵虚混太清--孟... 八月湖水平,涵虚混太清。 [译文] 洞庭湖八月水势大涨,与湖岸相平,包容着天空的倒影,远处天水相连,...
描写初夏清风凉爽的诗句 描写初夏清风凉爽的诗句  夏风大部分是热的,但是也有凉爽的时候,下面是小编整理的夏天诗句,欢迎大家学...
形容女人伤感的古诗句 形容女人伤感的古诗句  世间无限丹青手,一片伤心画不成。  兽炉沈水烟,翠沼残花片,一行行写入相思传...
湘女归魂,佩环玉冷无声,凝情... “湘女归魂,佩环玉冷无声,凝情谁诉。”出处 出自 宋代 吴文英 的《过秦楼·黄钟商芙蓉》“湘女归魂,...
莫言的创作特点 莫言的创作特点  文学作品至今没有严格的评判标准,好与坏的标准是什么?如何判断一个作者的潜力?这就看...
描写龙的诗句 描写龙的诗句  应物 【龙潭】 石激悬流雪满湾,五龙潜处野云闲。  来济 【出玉关】 敛辔遵龙汉,衔...
长江与黄河的诗句 长江与黄河的诗句  优美逶迤的山岭,蜿蜒盘旋,犹如一条正在酣睡的`巨龙。俯瞰足下,白云弥漫,环观群峰...
关于边塞的诗句古诗 导语:苍茫戈壁虽有鸟飞绝,人踪灭的苍凉,也许这贫瘠而厚重的戈壁下面蕴含着丰富的宝藏,茫茫戈壁留给我的...
匈奴草黄马正肥,金山西见烟尘... “匈奴草黄马正肥,金山西见烟尘飞,汉家大将西出师。”出处 出自 唐代 岑参 的《走马川行奉送出师西征...
杜甫古诗绝句意思 杜甫古诗绝句意思  《绝句》这首诗是杜甫在成都浣花溪草堂闲居时写的,共写绝句四首,接下来由小编整理了...
倚篷窗无寐,引杯孤酌 “倚篷窗无寐,引杯孤酌。”出处 出自 宋代 张元干 的《满江红·自豫章阻风吴城山作》“倚篷窗无寐,引...
海畔尖山似剑铓,秋来处处割愁... “海畔尖山似剑铓,秋来处处割愁肠。”出处 出自 唐代 柳宗元 的《与浩初上人同看山寄京华亲故》“海畔...
于秋的诗句 有关于秋的诗句有关于秋的诗句1  1、惟有河边雁,秋来南向飞。庾信《重别周尚书》  2、戛戛秋蝉响似...
七夕的经典诗句 七夕的经典诗句  在日常的学习、工作、生活中,大家一定没少看到经典的诗句吧,不同的`诗句,其语言艺术...
李白的慈悲诗句 李白的慈悲诗句  “白也诗无敌,飘然思不群”……  一提起李白,人们首先会想起俊逸、潇洒,这些形象,...