23442
Goto Top

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?

Content-Key: 44357

Url: https://administrator.de/contentid/44357

Printed on: April 18, 2024 at 16:04 o'clock

Member: wakko
wakko Nov 13, 2006 at 17:10:14 (UTC)
Goto Top
Moin

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"  
(oder so ähnlich)
Hoffe das hilft, habe so einen Aufruf nur in einem Uralt-Script...
Gruß,
Henrik
Member: Biber
Biber Nov 13, 2006 at 18:00:34 (UTC)
Goto Top
@wakko

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]
Mitglied: 16568
16568 Nov 13, 2006 at 18:38:41 (UTC)
Goto Top
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
Member: Biber
Biber Nov 13, 2006 at 19:12:36 (UTC)
Goto Top
@lsw
Ich habe mir mal aus Gründen der Übersichtlichkeit erlaubt,...
Guuuuuuuuter Mod..*tätschel*

Herzlichen Glückwünsch noch mal vom mir!!!!!!!
Und bleib so flauschig face-wink

Biber
Mitglied: 16568
16568 Nov 13, 2006 at 21:31:43 (UTC)
Goto Top
Ich geb' mein Bestes *rotwerd*


Lonesome Walker
Mitglied: 23442
23442 Nov 14, 2006 at 07:15:41 (UTC)
Goto Top
Erstmal: Hallo neuer Mod und viel Spaß mit so lästigen Usern wie mir ;-P

Lästig deshalb, weil das ganze nicht funktioniert... Ich sehe zwar bei beiden Versionen (auch mir "lpReserved2 As Byte") kurz ein schwarzes Komandozeilenfenster, das aber geich wieder verschwindet (so nach ner halben Sekunde). Wenn ich den Parameter (in unserem Fall das c:\Windows) weglasse, hab ich immernoch das selbe Problem...

Außerdem funktioniert das aufrufen der .cmd Datei ja, aber nur solange ich keinen Parameter (also wieder das c:\Windows) hinzufüge mit dem "normalen" Shell() Aufruf...
Mitglied: 16568
16568 Nov 14, 2006 at 10:26:52 (UTC)
Goto Top
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 face-wink )

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 face-wink
Mitglied: 23442
23442 Nov 15, 2006 at 12:32:41 (UTC)
Goto Top
Hallo,

ja, ich möchte was in die Registry schreiben, allerdings nicht in die des aktuellen Systems! Das ganze wird von Windows PE (startet von CD) gestartet und muss nicht auf die HDD zugreifen. Wenn es dir weiterhilft, hier der Inhalt der .cmd Datei:

@echo offset ROOTPATH=%1reg load HKLM\LocalSys %ROOTPATH%\System32\config\systemreg import mergeide.regreg unload HKLM\LocalSys

Rootpath ist in dem Fall das c:\Windows, welches übergeben wird. in der Datei mergeide.reg stehen dann die Schlüssel, Werte etc.
Mitglied: 23442
23442 Nov 23, 2006 at 08:24:32 (UTC)
Goto Top
Keiner ne Ahnung?
Mitglied: 16568
16568 Nov 23, 2006 at 16:42:36 (UTC)
Goto Top
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
Mitglied: 23442
23442 Dec 11, 2006 at 08:21:51 (UTC)
Goto Top
Ah, im ActiveVB Forum hatte wer ne Lösung parat:

Ich hab einfach die Zeilen aus der .cmd Datei in einen Shell Befehl im VB Program eingebaut:

Shell "reg load HKLM\LocalSys " & winpfad & "\System32\config\system"
Shell "reg import " & App.path & "\" & arbeitsordner & "\mergeide.reg"
Shell "reg unload HKLM\LocalSys"

thx @ all für die Hilfe