Autor |
Beitrag |
Trialtom
      
Beiträge: 38
|
Verfasst: Mo 23.12.02 01:43
wenn ich die eingabeaufforderung starte, z.b.:
Quelltext 1:
| ShellExecute(handle, nil, 'C:\WINDOWS\system32\cmd.exe',nil,nil, SW_SHOWNORMAL); |
möchte ich, einen von mir vorher im delphi programm eingebenen befehl, schon dort nach der pfadangabe eingetragen haben.
irgendwie finde ich nix dazu und hab schon so ziehmlich alles ausprobiert.
besser wäre sicher noch, das ich dann nicht mal mehr "enter" drücken müsste, d.h. das man nur in delphi, den normalerweise in der eingabeaufforderung einzugebenden befehl, z.b. in ein editfenster eingeben müsste. und auf button click, dann der befehl ausgeführt würde.
kann mir jemand helfen?
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 23.12.02 10:23
Quelltext 1:
| ShellExecute( 0, 'open', 'cmd', '/k cd /d d:\tmp & dir', Nil, SW_SHOW ); |
Hinweise:
- cmd muß (und sollte) nicht mit Pfad angegeben werden. Dein Code funktioniert z.B. bei mir nicht (Windowsinstallation auf d )
- cmd gibt es erst ab NT aufwärts
Parameter für cmd ganz allgemein:
/k Befehl & Befehl & Befehl ...
Gruß Tom
|
|
Trialtom 
      
Beiträge: 38
|
Verfasst: Mo 23.12.02 12:52
riesendank,
wow mit /k, wo bekommt man solche befehle her?
ich habe das nirgenswo gefunden, auf keiner platform, weder auf einer msdn cd, noch im internet. wenn es einer von einem anderen hat, woher hat der andere es es dann?
oder ich übersehe sowas einfach?!?
trotzdem nochmals vielen dank.
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 23.12.02 13:39
Gib im Dos-Fenster mal
cmd /?
ein.
Gruß Tom
|
|
Trialtom 
      
Beiträge: 38
|
Verfasst: Mo 23.12.02 14:12
ok, klar, daran hab ich nicht gedacht, egal, jedenfalls hab ich noch ein anderes problem:
ich will die eingabeauffrderung dann auch wieder schließen:
Quelltext 1:
| PostMessage(FindWindow(nil,pchar('cmd')),WM_CLOSE,0, 0); |
oder
Quelltext 1:
| PostMessage(FindWindow(nil,pchar('C:\WINDOWS\System32\cmd.exe')),WM_CLOSE,0, 0); |
geht bei mir nicht.
ich habe auch schon andere beiträge gelesen:
Befehle wie PostMessage(FindWindow(nil,pchar('rechner')),WM_CLOSE,0, 0); funktionieren,der rechner wird in diesem fall geschlossen, ganz klar. bei anderen prorammen geht es auch, aber nicht bei der eingabeaufforderung, warum nicht?
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mo 23.12.02 14:22
Trialtom hat folgendes geschrieben: | ich habe auch schon andere beiträge gelesen:
Befehle wie PostMessage(FindWindow(nil,pchar('rechner')),WM_CLOSE,0, 0); funktionieren,der rechner wird in diesem fall geschlossen, ganz klar. |
Das ist nicht "ganz klar". Denn bei einer englischen Windows Version heißt die Titelleiste des Taschenrechners "Calculator" und nicht "Rechner" und somit wird er auch nicht geschlossen.
FindWindow und WM_CLOSE sind, wenn man auf ShellExecute verzichtet auch unnötig. Mit CreateProcess bekommt man nämlich ein Prozess-Handle auf den neuen Prozess, den man dann mit TerminateProcess() abschießen kann.
Und zu ShellExecute: Diese Funktion ist für Viren sehr anfällig, da durch eine kleine Veränderung der Registry anstatt irgendeines Programms der Virus gestartet wird.
_________________ Ist Zeit wirklich Geld?
Zuletzt bearbeitet von AndyB am Mo 23.12.02 14:30, insgesamt 1-mal bearbeitet
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 23.12.02 14:28
Trialtom hat folgendes geschrieben: | ich will die eingabeauffrderung dann auch wieder schließen: |
Du denkst ziemlich kompliziert. Wie wäre es mit dem Parameter
/k ... & ... & Exit
Gruß Tom
|
|
Trialtom 
      
Beiträge: 38
|
Verfasst: Mo 23.12.02 14:37
oh mein gott
haha ich denke wirklich zu kompliziert.
danke nochmals
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mo 23.12.02 16:35
Tom denkt aber auch kompliziert.
Zumindest unter Win9x, also mit der command.com geht's noch einfacher, nämlich statt /k einfach /c nehmen, dann wird der Interpreter nach dem Ausführen der Befehle beendet.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Tom
Gast
Erhaltene Danke: 1
|
Verfasst: Mo 23.12.02 17:08
tommie-lie hat folgendes geschrieben: | Tom denkt aber auch kompliziert. |
Aber nur ein bißchen ...
Zitat: | nämlich statt /k einfach /c nehmen |
Geht auch mit der cmd.exe
Gruß Tom
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Di 31.12.02 03:12
Zuletzt bearbeitet von Leathl am So 16.08.09 14:00, insgesamt 1-mal bearbeitet
|
|
Brueggendiek
      
Beiträge: 304
Win 98, Win98SE, Win XP Home
D5 Std
|
Verfasst: Di 31.12.02 03:46
Hallo!
ShellExecute (und alle anderen API-Funktionen von Windows) erwarten C-kompatible Strings (Windows wurde in C geschrieben).
Strings in C sind immer Zeiger auf nullterminierte Strings, d.h. Zeichenfolgen, die mit #0 abgeschlossen werden. In Delphi nennt man sowas PChar.
Delphi stellt aus diesem Grund bei allen Strings noch ein in der Länge nicht mitgezähltes Nullbyte an das Ende.
Dadurch ist es mit einer einfachen Typumwandlung (die einfach nur die Adresse des ersten Stringbytes liefert) möglich, aus einem String einen PChar zu erzeugen.
Außerdem übergibst Du nicht den Inhalt von Edit1.Text, sondern die Zeichenfolge "/k 'Edit1.Text'" - sollte sogar einen Syntaxfehler ergeben wg. doppelten ' vor dem Komma!
Es muß also heißen (wie in anderen Beispielen bereits sinngemäß geschrieben):
Quelltext 1:
| ShellExecute( 0, 'open', 'cmd', PChar ('/k ' + Edit1.Text), Nil, SW_SHOW ); |
Du willst ja den Inhalt des Edit-Feldes und davor das '/k ' übergeben.
Gruß
Dietmar Brüggendiek
|
|
Leathl
      
Beiträge: 276
|
Verfasst: Di 31.12.02 04:00
|
|
|