Entwickler-Ecke
Sonstiges (FPC / Lazarus) / Linux API - ShellApi einbinden ?!
Whynot - Mi 10.08.11 12:44
Titel: ShellApi einbinden ?!
So erstmal hallo :)
Ich habe mich jetzt in den letzten Tagen ein bisschen mit Delphi auseinandern gesetzt und habe schon Grundwissen von Python und Html ^^
Zudem benutze ich ein Ubuntu 11.04 mit Lazarus , was mit alles sehr gut gefällt ;)
Aber irgendwie haperts an der ShellApi mit dem zugehörigen Befehl Shellexecute . Irgendwie bekomme ich immer den Fehler :
unit1.pas(9,13) Fatal: Can't find unit ShellApi used by Unit1
das sagt mir irgendwie , dass er probleme hat die ShellApi lib oder wie das heißt einzubinden .
Aber mein eintrag lautet :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| unit Unit1;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, ShellApi; |
Was mache ich falsch ? Muss ich die Shellapi vllt erst nachinstallieren oder wie funktioniert das ?
Moderiert von Martok: Delphi-Tags hinzugefügt
Whynot - Mi 10.08.11 13:32
danke schonmal !
Dachte shellapi ist linux :)
So habe mal das exampel ding reingehauen
Delphi-Quelltext
1:
| SysUtils.ExecuteProcess( UTF8ToSys( '/full/path/to/binary'), '''' '', []); |
und zu :
Delphi-Quelltext
1:
| SysUtils.ExecuteProcess( UTF8ToSys( '/home/leon/Downloads/OpenSplit/split.sh'), '''' ); |
umgeändert.
In der shell steht eig. nur mkdir 'works' was auch funzt :)
Aber lazarus will nicht so recht , er spuckt mir nen Fehler 127 aus ?!
Moderiert von Martok: Delphi-Tags hinzugefügt
Moderiert von Martok: Fullquote des letzten Beitrags entfernt
Xion - Mi 10.08.11 14:31
Die Doku dazu:
http://www.freepascal.org/docs-html/rtl/sysutils/executeprocess.html
Da ich keine Ahnung von Linux und wenig Ahnung von Lazarus hab, kann ich zu dem Fehler nur raten:
:arrow: Es ist der in der Doku angegebene Fehler (also ein Betriebssystem-Fehlercode).
:arrow: Du hast die SysUtils nicht eingebunden
:arrow: Du musst \ statt / verwenden.
LexXis - Mi 10.08.11 22:02
Hallo Whynot und :welcome: im Delphiforum!
ExecuteProcess artet meistens in ziemliches Gefrickel aus. Tu dir selbst den Gefallen, für deine Zwecke
TProcess zu verwenden. Das ist IMHO einfacher zu handhaben und nötigenfalls auch cross platform ;)
Aber aufgepasst:
Zitat: |
Note: TProcess is not a terminal/shell! You cannot directly execute scripts or redirect output using operators like "|", ">", "<", "&" etc. It is possible to obtain the same results with TProcess using pascal, some examples are below..
Important: You must specify the full path to the executable. For example '/bin/cp' instead of 'cp'. If the program is in the standard PATH then you can use the function FindDefaultExecutablePath from the FileUtil unit of the LCL.
|
Ergo kannst du damit damit dein Shellscript nur über Umwege verwenden. Aber solange diese nicht vom Benutzer verändert werden, sollte das ja kein größeres Problem darstellen und du kannst die Befehle hardcoden.
Gruß
Whynot - Mi 10.08.11 22:08
Hmm komisch ... ich kann .jar files oder vorkompillierte dateien damit starten : Shell nicht ?!
LexXis - Mi 10.08.11 22:42
Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:
Quelltext
1:
| SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"'); |
Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.
Gruß
Jakob_Ullmann - Fr 12.08.11 15:54
LexXis hat folgendes geschrieben : |
Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet. |
Dann kann ich immer noch xterm statt gnome-terminal oder konsole verwenden. Das dürfte ja bei allen Desktops gehen... (vorausgesetzt, X.org wird verwendet)
Abgesehen davon: gnome-terminal/konsole/xterm sind doch nur die Emulatoren. Warum nicht einfach /usr/bin/sh zum Ausführen verwenden? (EDIT: afaik ein Link auf die eigentliche Shell wie /usr/bin/bash)
LexXis - Fr 12.08.11 20:09
Oh, fein! Funktioniert tatsächlich. Wieder was gelernt :)
Jakob_Ullmann hat folgendes geschrieben : |
afaik ein Link auf die eigentliche Shell wie /usr/bin/bash |
Kurz nachgeschaut: Korrekt.
Jakob_Ullmann - Sa 13.08.11 18:15
Ich finde es trotzdem verwunderlich, dass man Shellscripts nicht einfach so ausführen kann. Normalerweise sagt doch der Shebang am Anfang einer Datei, z. B.
Quelltext
1: 2: 3:
| #!/bin/bash -- oder -- #!/bin/python |
genau aus, mit welchem Programm es ausgeführt werden soll. :nixweiss:
LexXis - So 14.08.11 11:15
:oops:
Na jetzt rate mal, was bei meinen Test-scripts immer gefehlt hat.. Mit vorausgehendem shebang klappt´s ohne Probleme :roll:
Jakob_Ullmann - So 14.08.11 18:20
:angel:
Und ich hab schon gedacht, evtl. liegts am vergessenen chmod u+x.
Whynot - Do 18.08.11 12:38
LexXis hat folgendes geschrieben : |
Das interpretiere ich mal in das obige Zitat hinein ;)
Was geht (man beachte die Von-hinten-durch-die-Brust-ins-Auge-Methodik) wäre:
Quelltext 1:
| SysUtils.ExecuteProcess('/usr/bin/gnome-terminal', '-e "pfad/zum/shellscript.sh"'); |
Damit hätte sich dann allerdings cross platform erledigt, genauso wie jeder andere Linux-Nutzer der nicht Gnome verwendet.
Also sehr sehr unsauber, die ganze Geschichte.
Vieleicht erklärst du kurz, warum du unbedingt ein Shellscript öffnen möchtest? Evtl lässt sich ja noch eine andere Lösung finden.
Gruß |
Das mit Crossplatform ist mir bewusst :)
Bin aber nur Linux user und will für ein shell skript ein Gui mit delphi basteln , als "einsteiger projekt".
Dafür brauche ich einen Durchsuchen button bzw etw. in der art , wodurch dann der pfad in einer variable gespeichert wird und später dann mit dem execute command ausgeführt werden soll . Das heißt , ich müsste die variable in den execute process bekommen :) Schätze , das wird kompliziert o.O . Auf jeden fall schonmal ein großes danke , an alle die mir hier helfen ;) . Werde noch ein bisschen rumbasteln . Über hilfe freue ich mich natürlich weiter , der thread hier ist noch lange nicht tod ;)
Rocketeer - Mi 24.10.12 10:50
Bin leider auch nicht ganz der Linuxinsider, aber wenn ich mal nicht weiterkomme dann schau ich hier:
http://linuxwiki.de/LinuxProgrammierung- Vielleicht hilft es dir..Viel Erfolg jedenfalls
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!