Auswerten und Testen der Kommandozeile ohne Anwendungsframework

01/12/2009 - 17:07 von Diego Wegner | Report spam
Hallo!

Ich habe ein Programm in VB .net (Express Edition) geschrieben, das mit
einer Sub Main statt mit dem Hauptformular startet. Damit das überhaupt
möglich ist, musste ich das Anwendungsframework deaktivieren.

Ziel ist es, Kommandozeilenparameter auszulesen. Damit kann das Programm
fallweise arbeiten, ohne eine Benutzeroberflàche anzeigen zu müssen
(z.B. um ein Netzlaufwerk gemàß vorkonfigurierter und aus einer INI
auszulesender Parameter mit einem lokalen Laufwerkbuchstaben zu
verbinden). Deshalb die Idee mit dem Start über Sub Main.

Im Netz habe ich einige Beispiele für die Auswertung der Kommandozeile
gefunden. Diese funktionieren jedoch sàmtlich nicht, so auch nachfolgende:

**********************************************************************************

Sub Main(ByVal args() As String)


' Ordner zum Speichern von Anwendungsdaten erstellen
If Dateihandling.OrdnerFürAnwendungsdatenPrüfenErstellen() False Then
Exit Sub 'Programm beenden, falls fehlgeschlagen
End If

'Grundlegene Startaufgaben erledigen


If args.Length > 0 Then
MsgBox("Test")
For n As Integer = 0 To
Environment.GetCommandLineArgs().Length - 1
Try
If n = 1 Then
Dim Filename As String = args(0)
Process.Start(Filename)
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Next
Else
MessageBox.Show("Benoetigte Uebergabeparameter fehlen...",
"Info")
End If
**********************************************************************************

In einer àlteren Anwendung, die mit der Hauptform startet, klappt die
Verwendung von Environment.GetCommandLineArgs() dagegen -- dort benutze
ich sie, um per Doppelklick geöffnete Dateien in eine RTF-Box zu laden.
Dort ist das Anwendungsframework auch ativiert, weil dieses Programm
keine Tàtigkeiten "still" (ohne Benutzerobeflàche) verrichten kann.

Deshalb vermute ich nun, dass das Anwendungsframework für das Auswerten
der Kommandozeile erforderlich ist (für weitegehende intensive Tests
fehlt mir jetzt leider die Zeit, muss morgen früh wieder arbeiten). Ist
diese Vermutung richtig?

Wenn nicht, wie bekommt man es hin, dass ich ohne Anwendungsframework in
der Sub Main bzw. in einer von dort aufgerufenen Prozedur (das Modul
heißt "Programmstart" und beinhaltet u.a. die Sub Main) an die
Kommandozeilen-Infos konmt?

Wenn das ohne Awendungsframework nicht geht, wie bekomme ich eine
komplett ohne Benutzeroberflàche arbeitende Funktion hin, wenn ich mit
der Hauptform (odwer einer anderen Form) starten muss?

Mit der oben dargestellten Variante und den anderen im Netz gefundenen
Möglichkeiten zur Kommandozeilenauswertung passiert nach dem Doppleklick
auf eine Datei und der Auswahl meines Programms zum Öffnen ("Öffnen
mit"-Funktion im Windows Explorer) gar nichts. Auch die Test-Messagebox
wird nicht angezeigt. Es sieht aus als ob das Programm sofort wieder
entladen wird.

Noch eine Frage: Wie kann ich die Kommandozeilen-Funktion im Debug-Modus
testen? Wenn die hauptform gestartet wird, kann ich Haltepunkte setzen,
Einzelschritt (F8) durchführen und anderes, um Programmfehler
aufzuspüren. Wie macht man sowas, um die Kommandozeile (z.B. nach
Dopplelklick auf eine Datei bzw. Verknüpfung mit Parametern im Explorer)
zu testen?

Für Hilfe vorab herzlichen Dank!

Gruß
Diego Wegner
 

Lesen sie die antworten

#1 Armin Zingler
01/12/2009 - 18:25 | Warnen spam
Diego Wegner schrieb:
Ziel ist es, Kommandozeilenparameter auszulesen. Damit kann das Programm
fallweise arbeiten, ohne eine Benutzeroberflàche anzeigen zu müssen
(z.B. um ein Netzlaufwerk gemàß vorkonfigurierter und aus einer INI
auszulesender Parameter mit einem lokalen Laufwerkbuchstaben zu
verbinden). Deshalb die Idee mit dem Start über Sub Main.

Im Netz habe ich einige Beispiele für die Auswertung der Kommandozeile
gefunden. Diese funktionieren jedoch sàmtlich nicht, so auch nachfolgende:

**********************************************************************************

Sub Main(ByVal args() As String)


' Ordner zum Speichern von Anwendungsdaten erstellen
If Dateihandling.OrdnerFürAnwendungsdatenPrüfenErstellen() > False Then
Exit Sub 'Programm beenden, falls fehlgeschlagen
End If

'Grundlegene Startaufgaben erledigen


If args.Length > 0 Then
MsgBox("Test")
For n As Integer = 0 To
Environment.GetCommandLineArgs().Length - 1
Try
If n = 1 Then
Dim Filename As String = args(0)
Process.Start(Filename)
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Next
Else
MessageBox.Show("Benoetigte Uebergabeparameter fehlen...",
"Info")
End If
**********************************************************************************



Du greifst einmal auf args.length zu, greifst dann aber nicht direkt wieder
auf args sondern Environment.GetCommandLineArgs zu. Warum nicht nur args?
Environment.GetCommandLineArgs und args unterscheiden sich insofern, dass
ersteres als erstes Item (Index 0) auch den Pfad der Exe enthàlt.

Den Sinn der Schleife verstehe ich nicht. Es wird eh nur etwas bei n=1 getan.

Du hast obige Sub Main auch tatsàchlich als Startobjekt gesetzt? (man kann
ja mal fragen. ;) )

Bei mir funktioniert Environment.GetCommandLineArgs auch mit einer Sub Main, also
auch ohne Anwendungsframework, und ohne Formular.

Dieses Programmm...

Public Class Main
Shared Sub Main(ByVal args As String())

For Each arg In Environment.GetCommandLineArgs
MsgBox("env: " & arg)
Next

For Each arg In args
MsgBox("args: " & arg)
Next

End Sub
End Class


...liefert unter Verwendung des "Öffnet mit"-Dialogs diese Meldungen:

env: c:\bla\azdefault1.exe
env: c:\bla\azdefault1.xml (die im Explorer ausgewàhlte Datei)
args: c:\bla\azdefault1.xml (die im Explorer ausgewàhlte Datei)

Also alles wie erwartet.



In einer àlteren Anwendung, die mit der Hauptform startet, klappt die
Verwendung von Environment.GetCommandLineArgs() dagegen -- dort benutze
ich sie, um per Doppelklick geöffnete Dateien in eine RTF-Box zu laden.



Von wem geöffnet?

Wenn du deine eigene Exe per Doppelklick startest, woher bekommt sie dann die Kommandozeilenargumente?

Deshalb vermute ich nun, dass das Anwendungsframework für das Auswerten
der Kommandozeile erforderlich ist (für weitegehende intensive Tests
fehlt mir jetzt leider die Zeit, muss morgen früh wieder arbeiten). Ist
diese Vermutung richtig?



Welche Auswertung der Kommandozeile? Meinst du die Rückgabe von
Environment.GetCommandLineArgs()? Das hat meines Wissens nichts damit zu tun.
Obiger Test bestàtigt das auch.

Wenn nicht, wie bekommt man es hin, dass ich ohne Anwendungsframework in
der Sub Main bzw. in einer von dort aufgerufenen Prozedur (das Modul
heißt "Programmstart" und beinhaltet u.a. die Sub Main) an die
Kommandozeilen-Infos konmt?



s. Beispiel oben

Mit der oben dargestellten Variante und den anderen im Netz gefundenen
Möglichkeiten zur Kommandozeilenauswertung passiert nach dem Doppleklick
auf eine Datei und der Auswahl meines Programms zum Öffnen ("Öffnen
mit"-Funktion im Windows Explorer) gar nichts. Auch die Test-Messagebox
wird nicht angezeigt. Es sieht aus als ob das Programm sofort wieder
entladen wird.



Das kann nicht an "Dateihandling.OrdnerFürAnwendungsdatenPrüfenErstellen"
liegen? Prüfe die Werte direkt zu Beginn der Sub Main.

Noch eine Frage: Wie kann ich die Kommandozeilen-Funktion im Debug-Modus
testen? Wenn die hauptform gestartet wird, kann ich Haltepunkte setzen,
Einzelschritt (F8) durchführen und anderes, um Programmfehler
aufzuspüren. Wie macht man sowas, um die Kommandozeile (z.B. nach
Dopplelklick auf eine Datei bzw. Verknüpfung mit Parametern im Explorer)
zu testen?



Wenn ich's richtig verstehe, sind das zwei getrennte Fragen:

- Du kannst schrittweise in der IDE testen, indem du in den Projekteigenschaften
auf dem Reiter "Debuggen" Startparameter eingibst.

- Zum Debuggen beim Start der Exe vom Explorer aus, setzte eine unbedingte Msgbox
an den Anfang der Sub Main. Wenn sie angezeigt wird, verwende im Menü
Extras -> An den Prozess anhàngen
Das geht jedoch nicht in der Express-Version.


Armin

Ähnliche fragen