AES Опубликовано 13 декабря, 2019 Поделиться Опубликовано 13 декабря, 2019 (изменено) как это осуществить? POPEN видел, не то немного... Так как родитель может быть закрыт раньше потомка что его подвешивает до закрытия потомка... Изменено 13 декабря, 2019 пользователем AES Цитата Ссылка на комментарий
0 Алиса Романец Опубликовано 20 декабря, 2019 Поделиться Опубликовано 20 декабря, 2019 Добавляешь в проект POSIX uses Posix.Stdlib, Posix.Unistd; После, в нужном тебе событии вызываешь __system(PAnsiChar('/путь/к/приложению & disown')) Команда в PAnsiChar зависит от дистрибутива. Но принцип работы такой, что POSIX отправляет в Терминал команду. Так что, можно отправить в Терминал команду на открытие сторонней программы и методом & disown открепить её от процесса Терминала. AES 1 Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 11 марта, 2020 Поделиться Опубликовано 11 марта, 2020 Отсюда https://chapmanworld.com/2017/04/06/calling-linux-commands-from-delphi/ 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^<>0) do begin 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. Цитата Ссылка на комментарий
0 Евгений Корепов Опубликовано 11 марта, 2020 Поделиться Опубликовано 11 марта, 2020 И еще вариант похожий, источник https://stackoverflow.com/questions/44415054/execute-external-program-from-linux-delphi-10-2-console-application uses ... System.SysUtils, Posix.Base, Posix.Fcntl, ...; type TStreamHandle = pointer; function popen(const command: MarshaledAString; const _type: MarshaledAString): TStreamHandle; cdecl; external libc name _PU + 'popen'; function pclose(filehandle: TStreamHandle): int32; cdecl; external libc name _PU + 'pclose'; function fgets(buffer: pointer; size: int32; Stream: TStreamHandle): pointer; cdecl; external libc name _PU + 'fgets'; function runCommand(const acommand: MarshaledAString): String; // run a linux shell command and return output // Adapted from http://chapmanworld.com/2017/04/06/calling-linux-commands-from-delphi/ var handle: TStreamHandle; data: array [0 .. 511] of uint8; function bufferToString(buffer: pointer; maxSize: uint32): string; var cursor: ^uint8; endOfBuffer: nativeuint; begin if not assigned(buffer) then exit; cursor := buffer; endOfBuffer := nativeuint(cursor) + maxSize; while (nativeuint(cursor) < endOfBuffer) and (cursor^ <> 0) do begin result := result + chr(cursor^); cursor := pointer(succ(nativeuint(cursor))); end; end; begin result := ''; handle := popen(acommand, 'r'); try while fgets(@data[0], sizeof(data), handle) <> nil do begin result := result + bufferToString(@data[0], sizeof(data)); end; finally pclose(handle); end; end; function createQRCode(id, fn: string): string; // Create qr-code using qrencode package begin deletefile(fn); if fileExists(fn) then raise Exception.create('Old file not deleted!'); // I am targeting rhel for now, so I know the path for sure result := runCommand(MarshaledAString(UTF8STring('/usr/bin/qrencode -o ' + fn + ' ''' + id + ''''))); if not fileExists(fn) then raise Exception.create('New file not created!'); end; function testqr: String; // Test QR Code creation with error handling // QREncode does not output anything but who knows ;-) begin try result := createQRCode('08154711', '/tmp/myqrcode.png'); except on e: Exception do begin result := 'Error: ' + e.message; end; end; end; Цитата Ссылка на комментарий
Вопрос
AES
как это осуществить? POPEN видел, не то немного...
Так как родитель может быть закрыт раньше потомка что его подвешивает до закрытия потомка...
Изменено пользователем AESСсылка на комментарий
3 ответа на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.