![]() |
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:
e= Zeit in Sekunden
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. 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:
/c = führt den Befehl aus und schließt "cmd.exe"
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',('/c shutdown -a'),nil,1)
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. |
Re: ShellExecute
Hallo, Du kannst Strings direkt nach PChar casten. Wenn also Deine Variable e dem '/c shutdown -a' entspricht:
Delphi-Quellcode:
P.S.: Willkommen in der DP :dp:
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',PChar(e),nil,1);
[edit] Quatsch, e ist ja eine Double, also müsstest Du den 4. Parameter erst formatieren. [/edit] |
Re: ShellExecute
Hallo,
überhaupt kein Problem:
Delphi-Quellcode:
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!
ShellExecute(Handle,nil,'C:\Windows\system32\cmd.exe',('/c shutdown -a'),PChar([ZeitVar: string]),SW_Hide)
Viel Glück Max |
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); |
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. |
Re: ShellExecute
WinExec gilt schon seit Delphi 2 als veraltet ;)
|
Re: ShellExecute
Funzt aber trotzdem noch gut ... ^^
|
Re: ShellExecute
@hathor: Du machst im Prinzip genau dasselbe wie ich! :roteyes:
|
Re: ShellExecute
|
Re: ShellExecute
Zitat:
|
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. |
Re: ShellExecute
thx @ all, hab dann die Lösung genommen:
PChar(e) genommen, ging am einfachsten ^^ |
Re: ShellExecute
Zitat:
|
Re: ShellExecute
Zitat:
|
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 ![]() 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 |
Re: ShellExecute
Die shutdown.exe lässt sich nur als Administrator auführen.
|
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. |
Re: ShellExecute
Und so?
Delphi-Quellcode:
[edit] Schon Sch**e, wenn man aus dem Kopf proggt :tongue: [/edit]
ShellExecute(Handle,'open','cmd.exe','/c netsh interface ip set address...',nil,SW_SHOW);
|
Re: ShellExecute
Zitat:
Zitat:
Da ist wohl ein nil zu viel (oh, reimen kann ich auch noch :wink: ) |
Re: ShellExecute
Zitat:
|
Re: ShellExecute
keiner ne idee?
|
Re: ShellExecute
Bei welchem Parameter?
|
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 |
Re: ShellExecute
Und welchen der Paramter mahnt er nun an?
|
Re: ShellExecute
keinen, er macht es einfach nicht, Programm läuft, macht aber nicht, was es soll
|
Re: ShellExecute
Was hast du als Pfad angegeben?
Was für ein Code wird zurückgeliefert? |
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; |
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); |
Re: ShellExecute
nix -.-
|
Re: ShellExecute
Zitat:
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... |
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 23:52 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