Delphi - 如何执行Windows、OSX、Linux的外部程序?
毫无疑问,几乎对所有Delphi程序员来说,不用说如何在Windows下如何执行外部程序了!目前Delphi,真的已经很棒了,Delphi有一套和VCL并驾齐驱的图形界面库,叫做"FireMonkey",如果你仅仅想编写Windows程序,而且要调用Windows平台的API,那么肯定VCL是首选,没有其它!但是,如果你想下定决心,跟随Delphi的脚步,进入更广阔的开发天地,那么你也没有第二种选择,只有选择Multi-Device Applications,它支持的平台:
PC:Windows、OSX、Linux
Mobile:Android、IOS
FireMokey跨平台开发英文版PDF格式图书下载 此图书为Embarcadero 2017年度MVP写的图书!
Multi-Device Applications的控制台程序,支持上述所有平台!!Multi-Device Applications的图形界面库只有一种,就是FireMonkey!!!开发Multi-Device Applications时候,Delphi的RTL库几乎全部都可以使用,大多数在system单元中!!
更多实际编程,需要自己去摸索了,我今天就是要说如何在Delphi中,执行Windows、OSX、Linux的外部程序?在Windows中通常都是shellExecute,在OSX和linux中,应该是有两种方式执行外部程序:
方式一:下面代码我在windows下测试完毕,由于最近比较忙,所以OSX和linux没有测试,但是应该没有什么问题,只要把程序前面的条件编译修改成对应操作系统,而且对应操作系统安装了PAServer,在Delphi里面配置好了,选择编译平台,编译运行就可以了!
program Project1; {$APPTYPE CONSOLE}
{$R *.res} //通过此条件编译指令,分别执行哪个操作系统代码
{$DEFINE MSWINDOWS} uses
System.SysUtils,
{$IF DEFINED (LINUX) or DEFINED (MACOS)}
POSIX.Stdlib,
{$ENDIF}
{$IFDEF MSWINDOWS}
Windows,
ShellApi;
{$ENDIF} {
运行程序方法
prog:要运行程序全路径名称
} procedure RunProg(prog: string);
begin // windows条件编译
{$IFDEF MSWINDOWS}
ShellExecute(, 'open', Pchar(prog), nil, nil, SW_SHOWNORMAL);
{$ENDIF}
// OSX条件编译
{$IFDEF MACOS}
_system(PAnsiChar('open ' + AnsiString(prog)));
{$ENDIF}
// linux条件编译
{$IFDEF LINUX}
_system(MarshaledAString(UTF8String(prog)));
{$ENDIF}
end; var
runExe: string; // 要执行程序变量 begin
try
// 提示信息
writeln('请输入要执行程序全路径名称:'); // 读取要执行程序全路径名称
readln(runExe); // 运行输入的程序
RunProg(runExe); except
on E: Exception do
writeln(E.ClassName, ': ', E.Message);
end; end.
方式二:
program myls;
{$APPTYPE CONSOLE}
{$R *.res} uses
System.SysUtils,
Posix.Base,
Posix.Fcntl; type
TStreamHandle = pointer; /// <summary>
/// Man Page: http://man7.org/linux/man-pages/man3/popen.3.html
/// </summary>
function popen(const command: MarshaledAString; const _type: MarshaledAString): TStreamHandle; cdecl; external libc name _PU + 'popen'; /// <summary>
/// Man Page: http://man7.org/linux/man-pages/man3/pclose.3p.html
/// </summary>
function pclose(filehandle: TStreamHandle): int32; cdecl; external libc name _PU + 'pclose'; /// <summary>
/// Man Page: http://man7.org/linux/man-pages/man3/fgets.3p.html
/// </summary>
function fgets(buffer: pointer; size: int32; Stream: TStreamHAndle): pointer; cdecl; external libc name _PU + 'fgets'; /// <summary>
/// Utility function to return a buffer of ASCII-Z data as a string.
/// </summary>
function BufferToString( Buffer: pointer; MaxSize: uint32 ): string;
var
cursor: ^uint8;
EndOfBuffer: nativeuint;
begin
Result := '';
if not assigned(Buffer) then begin
exit;
end;
cursor := Buffer;
EndOfBuffer := NativeUint(cursor) + MaxSize;
while (NativeUint(cursor)<EndOfBuffer) and (cursor^<>) do begin
Result := Result + chr(cursor^);
cursor := pointer( succ(NativeUInt(cursor)) );
end;
end; var
Handle: TStreamHandle;
Data: array[..] of uint8; begin
try
Handle := popen('/bin/ls -lart','r');
try
while fgets(@data[],Sizeof(Data),Handle)<>nil do begin
Write(BufferToString(@Data[],sizeof(Data)));
end;
finally
pclose(Handle);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
方式二我还没有测试,但是应该是没有问题的,这个国外一个程序员写的代码,在他录制的视频中,就是这段代码,可以在linux下正常执行!方式二和方式一比较,一个不同点是能够获取到程序运行返回的信息!
完整工程源码:https://download.csdn.net/download/sunylat/10746054
参考:
https://www.youtube.com/watch?v=4gDPqq8H-xw
https://chapmanworld.com/2017/04/06/calling-linux-commands-from-delphi/
Delphi - 如何执行Windows、OSX、Linux的外部程序?的更多相关文章
- windows和linux执行class
windows java -classpath .;lib/* com.Test linux java -classpath .:ib/* com.Test "."代表当前路径,这 ...
- 新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows)
原文出处:新成员!Visual Studio Code --跨平台的开发工具(支持OSX, Linux 和 Windows) 这是我的文章备份 http://www.dotblogs.com.tw/ ...
- 安装在Linux下的jenkins执行windows下的bat命令
launch method里面没有 launch agent via java web start 默认是disable 需要改成random 转载自: http://blog.csdn.net/so ...
- Linux远程执行Windows机器任务
Linux远程执行Windows机器任务 近期测试人员提出需求需要在Linux下调用Windows系统下的cmd的命令完成自动构建和测试并生成测试报告. 环境: Windows Server2 ...
- .Net Core 跨平台:一个简单程序的多平台(windows、Linux、osx)发布
.Net Core 跨平台:一个简单程序的多平台(windows.Linux.osx)发布 .Net Core 3.0 已于2019年9月23日发布了,包含了一些新特性,具体参见Announcing ...
- 转:socket编程在windows和linux下的区别
如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...
- socket编程在windows和linux下的区别
如无其它说明,本文所指Linux均表示2.6内核Linux,GCC编译器,Windows均表示Windows XP系统,Visual Studio 2005 sp1编译环境. 下面大概分几个方面进行罗 ...
- dotnet core多平台开发体验(mac os x 、windows、linux)
前言 随着net core rc2的发布,园子里面关于net core的入门文章也也多了起来,但是大多数都是在一个平台上面来写几个简单的例子,或者是在解释代码本身,并没有体现说在一个平台上面创建一个项 ...
- 【转】windows和linux中搭建python集成开发环境IDE
本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...
随机推荐
- web前端js 实现打印操作
转载来源:https://www.cnblogs.com/potatog/p/7412905.html 一.打印当前页面指定元素中的内容 方式一:直接使用window.print(); (1)首先获得 ...
- linux下xampp(apache)中配置域名访问,以及遇到的问题
xampp中apache使用域名访问 一.首先找到/opt/lampp/etc/httpd.conf: # Virtual hosts Include etc/extra/httpd-vhosts.c ...
- c:param 标签后不要写 注释 。否则报错 Encountered illegal body of tag "c:import" tag, given its attributes
c:param 标签后不要写 注释 .否则报错 Encountered illegal body of tag "c:import" tag, given its attribu ...
- struts2 的 ServletActionContext 和 actionContext,服务器代码测试, redirect 、dispatcher、chain、redirectAction
一.ServletActionContext 和 actionContext HttpServletRequest request=ServletActionContext.getRequest() ...
- 2018.09.28 hdu5434 Peace small elephant(状压dp+矩阵快速幂)
传送门 看到n的范围的时候吓了一跳,然后发现可以矩阵快速幂优化. 我们用类似于状压dp的方法构造(1(1(1<<m)∗(1m)*(1m)∗(1<<m)m)m)大小的矩阵. 然后 ...
- 2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
传送门 显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号. 所以如何求出所有边被经过的期望次数? 显然这只跟边连接的两个点有关. 于是我们只需要求出两个点被经过的期望次数. 对于 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- IntelliJ IDEA 2017版 SpringBoot的核心配置详解
Spring Boot的核心 (1)Spring Boot的项目一般都会有*Application的入口类,入口类中会有main方法,这是一个标准的Java应用程序的入口方法. (2)@Spri ...
- struts2 file
JavaBean 中: private File[] pic; private String[] picContentType; private String [] picFileName; sett ...
- Android线程和线程Handler基础一览
线程概览 线程是任何多任务系统的基石.可以被认为是一个主进程的多个子进程.这样做的目的就是了增加应用的性能. 应用主线程 当一个Android应用被打开的时候,系统会默认开辟一个线程.这个线程就被叫做 ...