
23442
13.11.2006, aktualisiert am 11.12.2006
Parameter mit VB6 übergeben...
...mit dem Shell Befehl
Hallo,
wie kann ich in Visual Basic eine Datei mit Parameter aufrufen? Ich habe folgende Situation:
regedit.cmd > Hinter der Datei soll ein Pfad übergeben werden, den die Datei verarbeitet
Trouble.exe > Hier wird die regedit.cmd aufgerufen
Mein bisheriger Aufruf der .cmd Datei sieht so aus:
Shell (App.Path & "\regedit.cmd")
Das funktioniert auch, aber wenn ich den Parameter hinzufüge:
Shell (App.Path & "\regedit.cmd c:\Windows")
ruft er mir die Datei nicht mehr auf... Wenn ich aber in der Konsole
regedit.cmd c:\Windows
eingebe, dann funktioniert es!!
Wie muss also der Befehl in Visual Basic 6 heißen?
Hallo,
wie kann ich in Visual Basic eine Datei mit Parameter aufrufen? Ich habe folgende Situation:
regedit.cmd > Hinter der Datei soll ein Pfad übergeben werden, den die Datei verarbeitet
Trouble.exe > Hier wird die regedit.cmd aufgerufen
Mein bisheriger Aufruf der .cmd Datei sieht so aus:
Shell (App.Path & "\regedit.cmd")
Das funktioniert auch, aber wenn ich den Parameter hinzufüge:
Shell (App.Path & "\regedit.cmd c:\Windows")
ruft er mir die Datei nicht mehr auf... Wenn ich aber in der Konsole
regedit.cmd c:\Windows
eingebe, dann funktioniert es!!
Wie muss also der Befehl in Visual Basic 6 heißen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 44357
Url: https://administrator.de/forum/parameter-mit-vb6-uebergeben-44357.html
Ausgedruckt am: 10.04.2025 um 14:04 Uhr
11 Kommentare
Neuester Kommentar
Moin
okay, erstmal die ShellandWait-Funktion:
Aufruf dann so:
(oder so ähnlich)
Hoffe das hilft, habe so einen Aufruf nur in einem Uralt-Script...
Gruß,
Henrik
okay, erstmal die ShellandWait-Funktion:
Option Explicit
Private Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Private Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessID As Long
dwThreadID As Long
End Type
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Const INFINITE = -1&
Private Declare Function CreateProcessA Lib "kernel32" (ByVal lpApplicationName As Long, _
ByVal lpCommandLine As String, ByVal lpProcessAttributes As Long, _
ByVal lpThreadAttributes As Long, ByVal bInheritHandles As Long, _
ByVal dwCreationFlags As Long, ByVal lpEnvironment As Long, _
ByVal lpCurrentDirectory As Long, lpStartupInfo As STARTUPINFO, _
lpProcessInformation As PROCESS_INFORMATION) As Long
Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Sub ShellAndWait(ByVal Filename As String)
Dim RetVal As Long
Dim proc As PROCESS_INFORMATION
Dim StartInf As STARTUPINFO
StartInf.cb = Len(StartInf)
'Angegebenes Programm starten
RetVal = CreateProcessA(0&, Filename, 0&, 0&, 1&, NORMAL_PRIORITY_CLASS, 0&, 0&, StartInf, proc)
'Das eigene Programm anhalten, bis das fremde beendet wurde
RetVal = WaitForSingleObject(proc.hProcess, INFINITE)
RetVal = CloseHandle(proc.hProcess)
End Sub
Aufruf dann so:
ShellAndWait "cmd.exe /c c:\windows\system32\regedit.cmd c:\Windows"
Hoffe das hilft, habe so einen Aufruf nur in einem Uralt-Script...
Gruß,
Henrik
@wakko
Im Prinzip ja, aber...
wenn es nur für eine einmalige Aktion gebraucht wird, wäre das kleinere Übel (vom Tippaufwand her):
@23442
Intern wird in der Tat, wenn Shell() oder ShellExec() aufgerufen werden, "ein Prozess gestartet" - sprich: die CreateProcessA() aus der kernel32.dll aufgerufen.
Aber der Klemmer war ein anderer: Du hast ja keine "allein" ausführbare Datei aufgerufen, sondern eine Datei mit der Extension "*.cmd".
In den unergründlichen Tiefen der Registry steht natürlich irgendwo, dass zum Interpretieren dieser Datei(endung) der Befehlsinterpreter command.com oder CMD.exe benötigt wird.
Aber dieses implizite Starten einer Anwendung über den Aufruf einer bestimmten Extension klappt eben nur bei ShellExec().
Wenn Du Shell() aufrufst, musst/solltest Du auch explizit den aktuellen Command-Interpreter aufrufen.
Und der steht in der Umgebungsvariablen %COMSPEC%.
Gruß
Biber
[Edit] P.S.
IMHO ist in der "Type STARTUPINFO" die Deklaration von lpReserved2 nicht "long", sondern:
lpReserved2 As Byte
[/Edit]
Im Prinzip ja, aber...
wenn es nur für eine einmalige Aktion gebraucht wird, wäre das kleinere Übel (vom Tippaufwand her):
Shell Environ$("COMSPEC") & " /c x:\mypfad\regedit.cmd c:\windows"
@23442
Intern wird in der Tat, wenn Shell() oder ShellExec() aufgerufen werden, "ein Prozess gestartet" - sprich: die CreateProcessA() aus der kernel32.dll aufgerufen.
Aber der Klemmer war ein anderer: Du hast ja keine "allein" ausführbare Datei aufgerufen, sondern eine Datei mit der Extension "*.cmd".
In den unergründlichen Tiefen der Registry steht natürlich irgendwo, dass zum Interpretieren dieser Datei(endung) der Befehlsinterpreter command.com oder CMD.exe benötigt wird.
Aber dieses implizite Starten einer Anwendung über den Aufruf einer bestimmten Extension klappt eben nur bei ShellExec().
Wenn Du Shell() aufrufst, musst/solltest Du auch explizit den aktuellen Command-Interpreter aufrufen.
Und der steht in der Umgebungsvariablen %COMSPEC%.
Gruß
Biber
[Edit] P.S.
IMHO ist in der "Type STARTUPINFO" die Deklaration von lpReserved2 nicht "long", sondern:
lpReserved2 As Byte
[/Edit]

Ich habe mir mal aus Gründen der Übersichtlichkeit erlaubt, ein paar Unterstriche an den nötigen Stellen einzufügen...
(sonst wird das Code-Element im Browser zu lange ausgegeben...)
Lonesome Walker
(sonst wird das Code-Element im Browser zu lange ausgegeben...)
Lonesome Walker

Ich geb' mein Bestes *rotwerd*
Lonesome Walker
Lonesome Walker

Moinmoin chicken ^^
och, lästig wirst Du erst, wenn wir Dir antworten, Du es aber nicht verstehst...
(somit bist Du noch weit davon entfernt, uns zu nerven
)
Fragen wir mal anders rum:
In VB gibt es zig Möglichkeiten, ein Problem zu lösen.
Was willst Du mit dem Shell-Aufruf erreichen?
Einträge in die Registry schreiben?
Das macht man anders. Außerdem geht dann ja immer so ein Shell-Fenster auf, sieht unschön aus.
Wie schreibe ich Werte in die Registry:
http://www.activevb.de/cgi-bin/suche/search.pl
Hier als Suchbegriff "Registry eingeben, noch die Felder FAQ, Tutorials, Projekte, Klassen, Tipps anhaken, auf Suche, fertig.
Besser, direkt in die Registry schreiben, geht auch schneller, und man kriegt keine häßliche Abfrage mehr zu sehen.
Lonesome Walker
PS: Ich könnte hier ja auch ein Tutorial über VB und Registry schreiben; aber wozu das Rad neu erfinden
och, lästig wirst Du erst, wenn wir Dir antworten, Du es aber nicht verstehst...
(somit bist Du noch weit davon entfernt, uns zu nerven
Fragen wir mal anders rum:
In VB gibt es zig Möglichkeiten, ein Problem zu lösen.
Was willst Du mit dem Shell-Aufruf erreichen?
Einträge in die Registry schreiben?
Das macht man anders. Außerdem geht dann ja immer so ein Shell-Fenster auf, sieht unschön aus.
Wie schreibe ich Werte in die Registry:
http://www.activevb.de/cgi-bin/suche/search.pl
Hier als Suchbegriff "Registry eingeben, noch die Felder FAQ, Tutorials, Projekte, Klassen, Tipps anhaken, auf Suche, fertig.
Besser, direkt in die Registry schreiben, geht auch schneller, und man kriegt keine häßliche Abfrage mehr zu sehen.
Lonesome Walker
PS: Ich könnte hier ja auch ein Tutorial über VB und Registry schreiben; aber wozu das Rad neu erfinden

Wie Du schon sagtest, etwas komplizierter, aber ich denke, Du solltest simultan hierzu auch mal einen Thread im BartsPE-Forum starten...
Ich grübel ja schon nebenbei, vielleicht macht's ja noch mal klick, denn besser wäre es, das ganze per VBS in die Registry zu patchen...
Lonesome Walker
Ich grübel ja schon nebenbei, vielleicht macht's ja noch mal klick, denn besser wäre es, das ganze per VBS in die Registry zu patchen...
Lonesome Walker