方式一:下面代码我在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(0, '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.
方法2:
program myls;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
Posix.Base,
Posix.Fcntl;
type
TStreamHandle = pointer;
///
/// Man Page: http://man7.org/linux/man-pages/man3/popen.3.html
///
function popen(const command: MarshaledAString; const _type: MarshaledAString): TStreamHandle; cdecl; external libc name _PU + 'popen';
///
/// Man Page: http://man7.org/linux/man-pages/man3/pclose.3p.html
///
function pclose(filehandle: TStreamHandle): int32; cdecl; external libc name _PU + 'pclose';
///
/// Man Page: http://man7.org/linux/man-pages/man3/fgets.3p.html
///
function fgets(buffer: pointer; size: int32; Stream: TStreamHAndle): pointer; cdecl; external libc name _PU + 'fgets';
///
/// Utility function to return a buffer of ASCII-Z data as a string.
///
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)
Result := Result + chr(cursor^);
cursor := pointer( succ(NativeUInt(cursor)) );
end;
end;
var
Handle: TStreamHandle;
Data: array[0..511] of uint8;
begin
try
Handle := popen('/bin/ls -lart','r');
try
while fgets(@data[0],Sizeof(Data),Handle)<>nil do begin
Write(BufferToString(@Data[0],sizeof(Data)));
end;
finally
pclose(Handle);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
方式二我还没有测试,但是应该是没有问题的,这个国外一个程序员写的代码,在他录制的视频中,就是这段代码,可以在linux下正常执行!方式二和方式一比较,一个不同点是能够获取到程序运行返回的信息!
参考:
https://www.youtube.com/watch?v=4gDPqq8H-xw
https://chapmanworld.com/2017/04/06/calling-linux-commands-from-delphi/
来源:https://www.cnblogs.com/sunylat/p/9855842.html
Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号
执行时间: 0.041691064834595 seconds