Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ShellExecute (https://www.delphipraxis.net/100774-shellexecute.html)

JB-1990 3. Okt 2007 19:19


ShellExecute
 
Hey ho Leuz,
ich hab mich vor einiger Zeit schon an ein Programm gesetzt, was einen Befehlgeneriert, den man dann bei "Start"-->"Ausführen" einfügen kann...bis jetzt muss man wie gesagt den Befehl selbst eintragen. Irgendwann hab ich etwas von ShellExecute gelesen und mich ran gemacht, ist auch nicht so schwer zu verstehen der Befehl, 5min. kann man ihn schon für einfache Sachen verwenden.
Mein Programm soll den Befehl jetzt mittels ShellExecute automatisch eintragen. Da das Programm aber Zeit berechnet und diese bis jetzt immer in einem Memo ausgegeben hat:

Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var S1,S2,M1,M2,SE1,SE2,e,x,y,z :double;
 begin
  {Variablen}
  S1:=StrToFloat(Combobox1.Text);
  M1:=StrToFloat(Combobox2.Text);
  SE1:=StrToFloat(Combobox3.Text);
  S2:=StrToFloat(Combobox4.Text);
  M2:=StrToFloat(Combobox5.Text);
  SE2:=StrToFloat(Combobox6.Text);
  x:=0;
  y:=0;
  z:=0;
  {Programm}
...
IF S1<S2 THEN BEGIN
   IF M1=M2 THEN BEGIN
    IF SE1=SE2 THEN BEGIN                     // std "<" min "=" sec. "="
     WHILE S1<>S2 DO BEGIN
      S1:=S1+1;
       z:=z+1;
     end;
     e:=z*3600;
     Memo1.Text:='shutdown -s -f -t '+FloatToStr(e)+' ' //Ausgabe im Memofeld XD
    end;
    IF SE1<SE2 THEN BEGIN                     // std "<" min "=" sec. "<"
     WHILE S1<>S2 DO BEGIN
      S1:=S1+1;
       z:=z+1;
     end;
     WHILE SE1<>SE2 DO BEGIN
      SE1:=SE1+1;
        x:=x+1;
     end;
     e:=z*3600+x;                                            //z*3600, denn 1h hat 3600sekunden
     Memo1.Text:='shutdown -s -f -t '+FloatToStr(e)+' '      // Befehl funktioniert nur mit Sekunden
     end;
    IF SE1<>SE2 THEN BEGIN                    // std "<" min "=" sec. ">"
     WHILE SE1<>60 DO BEGIN
      SE1:=SE1+1;
        x:=x+1;
     end;
     SE1:=SE1*0;
     WHILE SE1<SE2 DO BEGIN
      SE1:=SE1+1;
        x:=x+1;
     end;
     M1:=M1+1;
     WHILE M1<>60 DO BEGIN
      M1:=M1+1;
       y:=y+1;
     end;
     M1:=M1*0;
     WHILE M1<>M2 DO BEGIN
      M1:=M1+1;
       y:=y+1;
     end;
     S1:=S1+1;
     WHILE S1<>S2 DO BEGIN
      S1:=S1+1;
       z:=z+1;
     end;
     e:=z*3600+y*60+x;                                       //y*60 (1min=60sec.)
     Memo1.Text:='shutdown -s -f -t '+FloatToStr(e)+' ';
    end;
   end;
...
end.
e= Zeit in Sekunden
x= Zählvariable für Sekunden
y= Zählvariable für Minuten
z= Zählvariable für Stunden

Wie aus dem Auszug meines Quelltextes zu entnehmen ist, wird "e" aus verschiedenen Faktoren berechnet, also variabel ist.
Also hab ich versucht das Programm via ShellExecute so zu gesatlten, dass man nurnoch Buttons drücken muss:

Delphi-Quellcode:
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',('/c shutdown -a'),nil,1)
/c = führt den Befehl aus und schließt "cmd.exe"

Der Befehl oben funktioniert einwandfrei.

JETZT kommen wir zum eigentlichen Problem:

"e" ist variabel, somit ist der Befehl immer anders. Diesen muss ich jedoch in den 4. Parameter reinschreiben.
Das Problem ist, die Parameter von ShellExecute sind vom Typ char. aber ich arbeite hier mit Strings, gibt es irgendwie eine Möglichkeit, wie ich einen Befehl, der generiert werden muss, in diesen 4. Parameter bekomme?

z.B.:

In welcher Zeit soll der PC heruntergefahren werden?: xx Stunden xx Minuten xx Sekunden

xx = Anzahl der Stunden/Minuten/Sekunden, die durch den Benuzter eingetragen werden.


DANKE im Voraus.

DeddyH 3. Okt 2007 19:22

Re: ShellExecute
 
Hallo, Du kannst Strings direkt nach PChar casten. Wenn also Deine Variable e dem '/c shutdown -a' entspricht:
Delphi-Quellcode:
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',PChar(e),nil,1);
P.S.: Willkommen in der DP :dp:

[edit] Quatsch, e ist ja eine Double, also müsstest Du den 4. Parameter erst formatieren. [/edit]

LAWn-M0W3R 3. Okt 2007 19:28

Re: ShellExecute
 
Hallo,
überhaupt kein Problem:
Delphi-Quellcode:
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',('/c shutdown -a'),PChar([ZeitVar: string]),SW_Hide)
Such dir aber lieber mal ne andere Methode zum runterfahren. Hab gerade keine da, aber da gibts auf jeden Fall noch andere Möglichkeiten. So kannst du das runterfahren schwer stoppen, falls noch irgendetwas sein sollte. Such dir lieber ne Methode zum direkten runterfahren, ohne dieses komische Fenster, und lass dein Prog die Zeit zählen!

Viel Glück
Max

hathor 4. Okt 2007 12:23

Re: ShellExecute
 
Nimm doch gleich shutdown.exe, was bei WINDOWS dabei ist.
Mit shutdown.exe /? kannst Du Dir die Parameter anzeigen lassen.

z.B.:
Delphi-Quellcode:
If FileExists('shutdown.exe') then
    WinExec('shutdown.exe -i -s -f -t 10 -c "SHUTDOWN in 10 Seconds"', SW_SHOW);

Nuclear-Ping 4. Okt 2007 12:38

Re: ShellExecute
 
Das was du in die Memo schreibst, kannst du gleich so ausführen lassen -> ShellExecute (Handle, 'open', 'cmd.exe', PChar ('/c ' + Memo1.Text), nil, SW_SHOW); Allerdings sollte man hier nicht "Memo1.Text" nehmen, da du nicht immer 'nen Memo in deinen Anwendungen rumschleppen wirst. Daher am besten in ne String-Variable ablegen, die in der Klasse (private) deklariert ist und diese statt Memo1.Text verwenden.

Ich würde aber auch nicht "ShellExecute" nehmen, da diese Funktion eigentlich dazu gedacht ist, um mit der Win-Shell verknüpfte Dateien zu öffnen, z.B. .doc, .jpg, ... Damit Programme damit zu starten ist eigentlich ein Missbrauch der Funktion. Schau dir hierzu lieber mal "WinExec" oder "CreateProcess" an.

DeddyH 4. Okt 2007 12:53

Re: ShellExecute
 
WinExec gilt schon seit Delphi 2 als veraltet ;)

Nuclear-Ping 4. Okt 2007 13:00

Re: ShellExecute
 
Funzt aber trotzdem noch gut ... ^^

LAWn-M0W3R 9. Okt 2007 20:12

Re: ShellExecute
 
@hathor: Du machst im Prinzip genau dasselbe wie ich! :roteyes:

RWarnecke 9. Okt 2007 21:24

Re: ShellExecute
 
Hier mal zwei andere Möglichkeiten den Rechner herunterzufahren :

Link 1
Link 2

SirThornberry 9. Okt 2007 21:30

Re: ShellExecute
 
Zitat:

Zitat von Nuclear-Ping
Funzt aber trotzdem noch gut ... ^^

unter Vista auch noch? :wink: Und bei der nächsten Windowsversion auch noch? Irgendwann wird es weg rationalisiert und man ist gut beraten wenn man die Funktion dann nicht verwendet hat.

Nuclear-Ping 10. Okt 2007 12:29

Re: ShellExecute
 
Unter Vista funzt es noch, gerade getestet.

Was passiert denn dann mit Anwendungen, die noch WinExec verwenden? Passiert dann an entsprechender Stelle garnix mehr ...? :P Ich bin da mal optimistisch und würde sagen, solange Win32-Anwendungen unter Windows laufen, wird auch noch WinExec funktionieren.

JB-1990 14. Nov 2007 16:04

Re: ShellExecute
 
thx @ all, hab dann die Lösung genommen:

PChar(e) genommen, ging am einfachsten ^^

SirThornberry 14. Nov 2007 16:09

Re: ShellExecute
 
Zitat:

Zitat von Nuclear-Ping
Unter Vista funzt es noch, gerade getestet.

Was passiert denn dann mit Anwendungen, die noch WinExec verwenden? Passiert dann an entsprechender Stelle garnix mehr ...? :P Ich bin da mal optimistisch und würde sagen, solange Win32-Anwendungen unter Windows laufen, wird auch noch WinExec funktionieren.

ich bin da nicht optimistisch. Beim wechsel von Win98 zu WinXP sind auch Funktionen weg gefallen und dann kommt beim Start die tolle Meldung das der entsprechende Procedure-Einstiegspunkt nicht gefunden wird und das Programm startet gar nicht erst weiter.

JB-1990 1. Dez 2007 18:24

Re: ShellExecute
 
Zitat:

Zitat von SirThornberry
ich bin da nicht optimistisch. Beim wechsel von Win98 zu WinXP sind auch Funktionen weg gefallen und dann kommt beim Start die tolle Meldung das der entsprechende Procedure-Einstiegspunkt nicht gefunden wird und das Programm startet gar nicht erst weiter.

ahh ich dachte schon ich bin zu inkompetent, denn genau diese Meldung kam bei mir ^^

JB-1990 23. Okt 2008 01:46

ShellExecute will nicht
 
Hey ho Delphianer,
hab seit langem mal wieder das ShellExc ausgegraben...bis jetzt brauchte ich es nicht weiter aber seit einer weile will mein Laptop nicht mehr mit einer dynamischen IP sich mit unserer FritzBox verbinden, bzw. nur stoßweise...eine .bat hab ich schon...jetzt kam ein Freund an und fragte ob ich nicht ein Prog dafür schreiben könnte. Der Grund: Da er oft von Leuten angesprochen wird, bei denen der Chat geht aber der Browser nix mehr zeigt und er denen erklären muss, wie sie das denn einstellen. Also schnell hingesetzt und gebastelt, hatte ja noch im Kopf wie der Befehl auszusehen hat und welche Unit (ShellApi) ich nehmen musste. Kurzer test mit IE und www.google.de und es ging, befehl war richtig. Nun kommts:
der Befehl: netsh interface ip set address "<<Netzwerkname>>" static <<IP>> <<Netzmaske>> <<Gateway>> <<Metrik>> (für statische IP)
Hab das Prog ma mit meinen Daten gefüttert und mir via showmessage() den Befehl anzeigen lassen. Es gab auch keine Abweichungen von dem was in meiner .bat steht. Aber aus irgend einem grund schreibt es mir den befehl nicht ins cmd fenster (einfach den letzten Parameter auf 1 gestellt um zu gucken was denn da drin steht). Hab dann das ganze mit einem bekannten unvariablen befehl gemacht: einfach 'shutdown /s /f /t 30' (seit vista keine "-" sondern "/") und wieder nix -.- liegt das irgendwie an Vista, dass der ShellExc ni so will wie ich?
LG JB-1990

Luckie 23. Okt 2008 08:16

Re: ShellExecute
 
Die shutdown.exe lässt sich nur als Administrator auführen.

JB-1990 23. Okt 2008 14:40

Re: ShellExecute
 
Admin bin ich. Geht ja auch nicht um shutdown sondern darum:
netsh interface ip set address "<<Netzwerkname>>" static <<IP>> <<Netzmaske>> <<Gateway>> <<Metrik>> (für statische IP) und, dass mir ShellExc nix ins cmdfenster schreibt, nicht einmal ping.

DeddyH 23. Okt 2008 14:44

Re: ShellExecute
 
Und so?
Delphi-Quellcode:
ShellExecute(Handle,'open','cmd.exe','/c netsh interface ip set address...',nil,SW_SHOW);
[edit] Schon Sch**e, wenn man aus dem Kopf proggt :tongue: [/edit]

Fussball-Robby 23. Okt 2008 14:49

Re: ShellExecute
 
Zitat:

Zitat von DeddyH
Delphi-Quellcode:
ShellExecute(Handle,'open','cmd.exe','/c netsh interface ip set address...',nil,nil,SW_SHOW);

Zitat:

[Error] Unit1.pas(27): Incompatible types: 'Integer' and 'Pointer'
[Ironie on]Hilfe ich komm nicht weiter :mrgreen: [Ironie off]
Da ist wohl ein nil zu viel (oh, reimen kann ich auch noch :wink: )

JB-1990 5. Nov 2008 21:58

Re: ShellExecute
 
Zitat:

Zitat von DeddyH
Und so?
Delphi-Quellcode:
ShellExecute(Handle,'open','cmd.exe','/c netsh interface ip set address...',nil,SW_SHOW);
[edit] Schon Sch**e, wenn man aus dem Kopf proggt :tongue: [/edit]

Warum hat es dann bei IEXPLORE.EXE funktioniert? Hab den befehl noch nie anders benutzt, als ich ihn hier benutzt hatte hab auch noch mit anderen funktionierenden Programmen von mir verglichen...

JB-1990 1. Dez 2008 20:34

Re: ShellExecute
 
keiner ne idee?

mkinzler 1. Dez 2008 20:39

Re: ShellExecute
 
Bei welchem Parameter?

JB-1990 1. Dez 2008 22:19

Re: ShellExecute
 
das ding is, dass der Befehl ShellExec so weit funzt (probiert mit IEXPLORE.EXE)
sobald es jedoch um CMD.EXE geht, trägt er meinen Befehl nicht ein, ob ipconfig oder dem zuvor erwähnten Befehl zum ändern der localen IP
LG

mkinzler 1. Dez 2008 22:22

Re: ShellExecute
 
Und welchen der Paramter mahnt er nun an?

JB-1990 1. Dez 2008 22:51

Re: ShellExecute
 
keinen, er macht es einfach nicht, Programm läuft, macht aber nicht, was es soll

mkinzler 1. Dez 2008 22:57

Re: ShellExecute
 
Was hast du als Pfad angegeben?
Was für ein Code wird zurückgeliefert?

JB-1990 1. Dez 2008 23:03

Re: ShellExecute
 
so sieht das ding aus:
Delphi-Quellcode:
procedure TFIP.BChangeClick(Sender: TObject);
 var netzname,ip,nm,dns,befehl :string;
begin
 netzname :=EName.Text;
 ip      :=EIP1.Text+'.'+EIP2.Text+'.'+EIP3.Text+'.'+EIP4.Text;
 nm      :=ENM1.Text+'.'+ENM2.Text+'.'+ENM3.Text+'.'+ENM4.Text;
 dns     :=EDNS1.Text+'.'+EDNS2.Text+'.'+EDNS3.Text+'.'+EDNS4.Text;
 befehl  :='netsh interface ip set address "'+netzname+'" static '+ip+' '+nm+' '+dns+' 1';
 ShellExecute(handle,nil,'cmd.exe',PChar(befehl),nil,0);
end;

mkinzler 1. Dez 2008 23:09

Re: ShellExecute
 
Versuch mal
Delphi-Quellcode:
befehl  :='interface ip set address "'+netzname+'" static '+ip+' '+nm+' '+dns+' 1';
ShellExecute(handle,'open', 'netsh',PChar(befehl),nil,0);

JB-1990 1. Dez 2008 23:20

Re: ShellExecute
 
nix -.-

Fussball-Robby 1. Dez 2008 23:33

Re: ShellExecute
 
Zitat:

Zitat von JB-1990
nix -.-

Heißt? Konsole geht garnicht auf? Oder wird der Befehl nicht ausgeführt?
Im ersten Fall hilft es eventuell den letzten Parameter von 0 (entspricht dort SW_HIDE, also versteckt) in SW_SHOWNORMAL oder SW_SHOW zu ändern. Ansonsten mal ein '/K' vor den Befehl setzen, das bewirkt manchmal Wunder...

JB-1990 4. Dez 2008 20:01

Re: ShellExecute
 
sorry, bissl sehr unpräzise von mir geschrieben...
Fenster hats geöffnet, aber nix weiter gemacht...werd das mit dem /K ma ausprobieren und asap schreiben, obs geklappt hat
THX für die Hilfe
LG


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz