Entwickler-Ecke

Windows API - brauche f1, scheiter an variablen


kens - Mo 09.07.07 15:23
Titel: brauche f1, scheiter an variablen
hi,
ich bau mir nen kleines programm um meinen pc nach eingestellter zeit runterzufahren,
doch die variablen sind in integer und sollen als pointer eingegeben werden, guckt am besten selbst:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : integer;
begin
a :=  StrToInt(edit1.text);
b :=  StrToInt(edit2.text);
c := a*3600+b*60;
ShellExecute(0Nil,'C:\WINDOWS\system32\shutdown.exe''-s -t',pchar(c) , nil, SW_NORMAL);
end;


es soll C:\WINDOWS\system32\shutdown.exe -s -t 21 ausgeführt werden und als 21 soll die variable c eingesetzt werden

vielen dank

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus Dateizugriff verschoben am Mo 16.07.2007 um 20:06


ZeitGeist87 - Mo 09.07.07 15:26

Hallo!

Täusch ich mich, oder sind die Argumente für Shellexecute falsch.. :gruebel:


Dunkel - Mo 09.07.07 15:29

Hallo!


Delphi-Quelltext
1:
ShellExecute(0nil, PChar('C:\WINDOWS\system32\shutdown.exe -s -t'+IntToStr(c)), nil , nil, SW_NORMAL);                    


könnte funktionieren.


ZeitGeist87 - Mo 09.07.07 15:35

user profile iconDunkel hat folgendes geschrieben:
Hallo!


Delphi-Quelltext
1:
ShellExecute(0, open, PChar('C:\WINDOWS\system32\shutdown.exe -s -tspace'+IntToStr(c)), nil , nil, SW_NORMAL);                    


könnte funktionieren.


Space = Leerzeichen :wink:


kens - Mo 09.07.07 15:51

@zeitgeist: da stürzt das programm ab, aber ich kann compilieren
@dunkel: da passiert nix, aber ich kann compilieren


ZeitGeist87 - Mo 09.07.07 15:58

Shutdown funktioniert erst ab W2K!!!


Delphi-Quelltext
1:
shellExecute(handle, pchar('command'), pchar('shutdown.exe -s -t ' + inttostr(c)), nil, pchar(''), sw_ShowNormal);                    


LG
Stefan


kens - Mo 09.07.07 16:02

das funktioniert auchnich und ich hab xp und schonmal ohne variablen getestet,das funktioniert

wenn ich jezz nochmal teste stüzt das programm mit folgender meldung ab: project1.exe raised exception class EConvertError with message ""std" is not a valid integer value. process stopped. use step or run to continue, also könnte das von dunkel doch funktioneren, muss nurma neustarten oder so


ZeitGeist87 - Mo 09.07.07 16:06

user profile iconkens hat folgendes geschrieben:
das funktioniert auchnich und ich hab xp und schonmal ohne variablen getestet,das funktioniert



Delphi-Quelltext
1:
ShellExecute(0'open', PChar('C:\WINDOWS\system32\shutdown.exe -s -t '+IntToStr(c)), nil , nil, SW_NORMAL);                    


kens - Mo 09.07.07 16:10

da passiert garnix, geht das bei dir??

ich mein wenn am anfang dieses open steht gehts nich und wenn ich das pchar vor alles setzte stürzt das programm mit dem fehler ab


ZeitGeist87 - Mo 09.07.07 16:14

bin gleich daheim..dann probier ichs..


kens - Mo 09.07.07 16:26

vergiss nich mit start -> ausführen -> shutdown -a das abzubrechen


ZeitGeist87 - Mo 09.07.07 16:30

ich kenn den befehl sehr gut, trotzdem danke :wink:

ich würde in den befehl noch ein -f (Force) einbauen, denn sonst bekommst du probleme wenn du zum bleistift ein word-dokument offen hast..dann schließt er es nicht und der pc fährt herunter :)

LG
Stefan


BenBE - Mo 09.07.07 16:30

Warum so umständlich ??? Hier im Forum gibt's ne Anleitung, wie das ganze mit InitiateSystemShutdown viel einfacher geht ... Man müsste halt mal suchen ...

Ach ja: F1 findest Du in der obersten Reihe, 2. Taste von Links ...


kens - Mo 09.07.07 16:42

ne ich würds gern übern die shutdown.exe machen

und ich such keine taste sondern hilfe, is doch die f1 funktion :)


Timosch - Mo 09.07.07 16:53

Was hast du den gegen ExitWindowsEx:
http://www.delphi-library.de/topic_Windows+beendenneustarten_8272.html
Ein externes Programm aufzurufen ist die schlechteste Möglichkeit, so was zu machen. Ich hab selbst unter Win2k komischerweise keine shutdown.exe (Oh, im Resource Kit ist eine...). Wenn es API-Funktionen gibt, dann benutzt man API-Funktionen.


kens - Mo 09.07.07 21:26

naja ich wollt das nur ganz einfach machen, da ich das sonst unter start ausführen selbst in sekunden eingebe, kann ja nich so schwer sein ;)


Martin1966 - Do 12.07.07 11:48

user profile iconkens hat folgendes geschrieben:
kann ja nich so schwer sein ;)

So wie es aussieht scheint es für Dich ja schon etwas schwerer zu sein. ;-)

Also probiere jetzt bitte mal den Sourcecode von hier:

http://www.delphi-library.de/topic_Windows+beendenneustarten_8272.html


Calculon - Do 12.07.07 12:28

Um mal zu deinem ursprünglichen Code zurückzukommen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button1Click(Sender: TObject); 
var a,b,c : integer;
str: string; 
begin 
a :=  StrToInt(edit1.text); 
b :=  StrToInt(edit2.text); 
c := a*3600+b*60;
str := '-s -t ' + inttostr(c);
ShellExecute(0Nil,'C:\WINDOWS\system32\shutdown.exe'PChar(str)nil, SW_NORMAL); 
end;


Gruß

Calculon
--


kens - So 15.07.07 12:50

dankeeeeeeeeeeeeeeeeeeeeee @ calculon :D

zu matin: hab ewig nicht mit delphi zu tun gehabt und dachte ich hab es hier mit profis zu tun die helfen und nich nerven (nich so böse gemeint wies klingt) ... in meinen augen sah das ganz einfach aus und aus fehlern lernt man ja, aber mich da durch ewige tutorials zu schlagen nur um eine funktion zu erstetzen die ich schon habe ist in meinen augen zeitverschwendung.


wenn mir jetzt noch jemand sagt, warum die exception nicht funktionert bin ich wunschlos glücklich :D


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : integer;
str: string;
begin
 try
  a :=  StrToInt(edit1.text);
  b :=  StrToInt(edit2.text);
  c := a*3600+b*60;
  if c <= 299 then
   begin
    str := '-s -t ' + inttostr(c);
    ShellExecute(0Nil,'C:\WINDOWS\system32\shutdown.exe', PChar(str), nil, SW_NORMAL);
   end
  else
   begin
    ShowMessage ('Wert ist zu klein! Mindestens 5 Minuten');
    edit1.Text := 'Stunden';
    edit2.Text := 'Minuten';
   end;
 except
    ShowMessage ('Keine erlaubte Eingabe!');
    edit1.Text := 'Stunden';
    edit2.Text := 'Minuten';
 end;
end;


ZeitGeist87 - Mo 16.07.07 16:14

user profile iconkens hat folgendes geschrieben:
dankeeeeeeeeeeeeeeeeeeeeee @ calculon :D

zu matin: hab ewig nicht mit delphi zu tun gehabt und dachte ich hab es hier mit profis zu tun die helfen und nich nerven (nich so böse gemeint wies klingt) ... in meinen augen sah das ganz einfach aus und aus fehlern lernt man ja, aber mich da durch ewige tutorials zu schlagen nur um eine funktion zu erstetzen die ich schon habe ist in meinen augen zeitverschwendung.


wenn mir jetzt noch jemand sagt, warum die exception nicht funktionert bin ich wunschlos glücklich :D


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c : integer;
str: string;
begin
 try
  a :=  StrToInt(edit1.text);
  b :=  StrToInt(edit2.text);
  c := a*3600+b*60;
  if c <= 299 then
   begin
    str := '-s -t ' + inttostr(c);
    ShellExecute(0Nil,'C:\WINDOWS\system32\shutdown.exe', PChar(str), nil, SW_NORMAL);
   end
  else
   begin
    ShowMessage ('Wert ist zu klein! Mindestens 5 Minuten');
    edit1.Text := 'Stunden';
    edit2.Text := 'Minuten';
   end;
 except
  on e: exception do
    begin

     ShowMessage ('Keine erlaubte Eingabe!');
     edit1.Text := 'Stunden';
     edit2.Text := 'Minuten';
   end;
 end;
end;


Delete - Mo 16.07.07 17:22

1. Exceptions sind nicht dafür gedacht fehlerhafte Eingaben abzufangen.

2. Benötigt shutdown.exe administrative Rechte.

3. Bist du damit zu Betriebssystem < Windows XP inkompatible.

Ich sehe da eigentlich nur Nachteile. Und ein Programierer, der zu faul ist eine gescheite Lösung zu implementieren...


Timosch - Mo 16.07.07 17:27

user profile iconLuckie hat folgendes geschrieben:
1. Exceptions sind nicht dafür gedacht fehlerhafte Eingaben abzufangen.

2. Benötigt shutdown.exe administrative Rechte.

3. Bist du damit zu Betriebssystem < Windows XP inkompatible.

Ich sehe da eigentlich nur Nachteile. Und ein Programierer, der zu faul ist eine gescheite Lösung zu implementieren...

Kann ich nur beipflichten. Man ruft keine exe auf, um eine Aktion durchzuführen, sondern verwendet die API-Funktionen des Betriebssystems, in dem Fall ExitWindowsEx. Wenn ich will, dass der Benutzer Text eingibt, rufe ich doch auch nicht über ShellExecute den Notepad auf, sondern lege ein TMemo auf mein Formular...