Autor |
Beitrag |
Whynot
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 10.08.11 12:44
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
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 10.08.11 13:01
Ich hätte jetzt vermutet, dass die ShellAPI nur bei Windows funktioniert
Weiter unten habe ich diesen Link gefunden:
wiki.lazarus.freepas...ng_External_Programs
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Whynot
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Mi 10.08.11 14:31
Die Doku dazu:
www.freepascal.org/d.../executeprocess.html
Da ich keine Ahnung von Linux und wenig Ahnung von Lazarus hab, kann ich zu dem Fehler nur raten:
Es ist der in der Doku angegebene Fehler (also ein Betriebssystem-Fehlercode).
Du hast die SysUtils nicht eingebunden
Du musst \ statt / verwenden.
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
LexXis
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: Mi 10.08.11 22:02
Hallo Whynot und 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
Hält's aus hier
Beiträge: 4
|
Verfasst: Mi 10.08.11 22:08
Hmm komisch ... ich kann .jar files oder vorkompillierte dateien damit starten : Shell nicht ?!
|
|
LexXis
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: 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
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: 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
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: 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.
|
|
LexXis
Beiträge: 170
Erhaltene Danke: 3
|
Verfasst: So 14.08.11 11:15
Na jetzt rate mal, was bei meinen Test-scripts immer gefehlt hat.. Mit vorausgehendem shebang klappt´s ohne Probleme
|
|
Jakob_Ullmann
Beiträge: 1747
Erhaltene Danke: 15
Win 7, *Ubuntu GNU/Linux*
*Anjuta* (C, C++, Python), Geany (Vala), Lazarus (Pascal), Eclipse (Java)
|
Verfasst: So 14.08.11 18:20
Und ich hab schon gedacht, evtl. liegts am vergessenen chmod u+x.
|
|
Whynot
Hält's aus hier
Beiträge: 4
|
Verfasst: 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
Hält's aus hier
Beiträge: 8
|
Verfasst: Mi 24.10.12 10:50
Bin leider auch nicht ganz der Linuxinsider, aber wenn ich mal nicht weiterkomme dann schau ich hier: linuxwiki.de/LinuxProgrammierung- Vielleicht hilft es dir..Viel Erfolg jedenfalls
|
|