Eigenes Programm mit Parametern starten
Heute gehts darum das eigene Programm um eine sehr sinnvolle Funktion zu erweitern, nämlich um die Nutzung der übergebenen Parameter.
Dies ist besonders nützlich wenn eine Anwendung Informationen verarbeiten soll, die erst nach dem Öffnen des Programms eingegeben werden sollen oder wenn das Programm (ähnlich wie paint oder notepad) ein Dokument duech ainen Doppelklick öffnen soll.
Wenn ihr auf eine Datei doppeltklickt sucht das Betriebssystem erstmal nach einem Programm, das diesen Dateityp verarbeiten kann, das sogenannte Standardprogramm. Ist das gefunden, wird es gestartet und der Pfad zu der von euch doppeltgeklickten Datei als Parameter übergeben.
Dabei wird ein Befehl erzeugt, der ca so ausschaut: notepad.exe "C:\Ordner\datei.txt" dadurch wird notepad.exe gestartet und der Parameter, der hier aus dem Dateipfad besteht übergeben. So weis Notepad, dass eine Datei geöffnet werden soll und versucht dies zu tun.
Also besteht unsere Aufgabe darin, diesen Parameter auszulesen, und dafür stellen die Programmiersprachen freundlicherweise Funktionen bereit. Ich werde hier auf ein Beispiel in Java und VB.NET eingehen.
Fangen wir mit Visual Basic an. Alle Parameter, die dem Programm übergeben werden werden in der Variable Command in Anführungszeichen gespeichert. Diese muss weder importiert noch deklariert werden und ist sofort verfügbar!
Public Class Form1
Private Sub Form1_Loaed() Handles MyBase.Load
TextBox1.Text = Command()
End Sub
End Class
Mit dem obenstehenden Code werden alle übergebenen Parameter in Textbox1 Dargestellt. Wenn wir zB. wollen, dass wenn man eine Datei auf das Symbol unserer Anwendung zieht, diese dann in der TextBox2 der Anwendung geöffnet wird müssen wir so vorgehen:
Public Class Form1
Private Sub Form1_Loaed() Handles MyBase.Load
TextBox1.Text = Command()
'Prüfen, ob überhaupt etwas übergeben wird
If Command() <> "" Then
Try
'Inhalt der Übergebenen Datei auslesen
'und die Anführungszeichen aus dem Parameter filtern
TextBox2.Lines = System.IO.File.ReadAllLines( _
Command().Replace("""", "") _
)
Catch ex As Exception
'Einen Fehler anzeigen falls die übergebenen Parameter kein Dateipfad sind
MessageBox.Show("Die übergebenen Parameter verweisen auf keine Datei!" _
& vbNewLine & ex.Message)
End Try
End If
End Sub
End Class
Es kann natürlich auch vorkommen, dass man mehr als eine Datei öffnen will (zB. ein ganzen Haufen mp3s) man markiert also mehrere Dateien und zieht sie dann auf unsere Anwendung. In diesem Fall ahben wir pech gehabt, denn Windows sendet die Parameter dann so: notepad.exe "C:\Ordner\datei1.txt" "C:\Ordner\datei2.txt" "C:\Ordner\datei3.txt"
Nun haben wir 3 Dateinamen im Parameter die wir erst einmal isolieren müssen:
Public Class Form1
Private Sub Form1_Loaed() Handles MyBase.Load
TextBox1.Text = Command()
'Prüfen, ob überhaupt etwas übergeben wird
If Command() <> "" Then
Try
'Die Parameter Splitten nach jedem >" "<
Dim Dateien() As String = Command().Split(""" """)
For Each s As String In Dateien
'Alle Parameter in Textbox2 Schreiben
TextBox2.Text = TextBox2.Text & vbNewLine & s
Next
Catch ex As Exception
'Einen Fehler anzeigen falls die übergebenen Parameter kein Dateipfad sind
MessageBox.Show("Die übergebenen Parameter verweisen auf keine Datei!" _
& vbNewLine & ex.Message)
End Try
End If
End Sub
End Class
Falls ihr euch fragt, warum überhaupt die Anführungszeichen mitgesendet werden und nicht nur ein Leerzeichen verwendet wird, so gibts dafür eine sehr einfache Erklärung. Denn nur so lässt sich feststellen wann ein Befehlt anfängt und wann er aufhört!
Übrigens bietet das .NET Framework auch eine sehr mächtige Klasse extra für das auslesen der Parameter an: My.Application.CommandLineArgs hier gibt es ein paar Funktionen die für euch ein paar Dinge übernehmen, wie zb das Zählen der übergebenen Parameter! Command() ist eigentlich ein Überbleibsel aus der VB6 Zeit, der wegen der Abwärtskomperbilität noch übernommen wurde. Auf die My.Application.CommandLineArgs Klasse werde ich später noch zu Sprechen kommen!
Sehen wir uns doch mal an wie Java die Parameter handelt:
package commandtest;
/**
*
* @author Sebastian Gross || http://blog.bogbasti.com
*/
public class Main {
public static void main(String[] args) {
}
}
In Java wird die Variable, die die Start Parameter die Command Line Arguments enthällt vom Benutzer mit deklarert! Hier trägt Sie den namen args und ist immer im der Main-Methode einer jeden Klasse deklariert.
Desweteren können wir erkennen, dass diese Varibale ein Array ist, das heißt wir können uns hier das Splitten der Befehle sparen! Alles andere Funktioniert aber genauso wie bei VB:
package commandtest;
/**
*
* @author Sebastian Gross || http://blog.bogbasti.com
*/
public class Main {
public static void main(String[] args) {
System.out.println("Die Parameter:");
for(String s : args){
System.out.println(s);
}
}
}
Man bedarf also nur einer simplen For-Each Schleife um alle Übergebenen Parameter auszulesen und dann gegebenenfalls weiter zuverarbeiten.
Hulu.com blockt Hotspot Shield
Nun ist es doch passiert, der beliebte Videodienst hulu.com blockt nun alle Hospot Shield Nutzer.
Hulu ist ein Amerikanisches Video Portal, dass im Gegensatz zu YouTube ganze Serien anbietet, die fast zeitgleich im Netz wie im Fernsehen auftauchen. Dieser Dienst wird mit Werbung finanziert!
Leider ist dieser Dienst aber nciht in Deutshland verfügber, sondern nur für US-Bürger! Dies kann man mit Proxys ganz einfach umgehen. Der beliebteste war hier der Hotspot Shield! (ich habe darüber auch geshrieben) So konnte man auch aus Deutschland bequem die Serien gucken! - Doch leider wird dies nun geblockt und es erscheint nurnoch folgende Melsung:
Wer auf hulu nicht verzichten kann muss sich einen anderen Proxy oder VPN Dienst suchen. Wobei die kostenlosen Dienste oft überladen sind und ein gescheites gucken ist nicht möglich. Eine Brauchbare Alternative ist ein bezahlter VPN Tunnel wie UKiPVN die einen eigenen VPN Dienst anbieten, der sowohl auf Mac Windows und sogar iPhone läuft!
VB.NET: DNS Namen in IPs auflösen
In diesem Beitrag möchte ich euch zeigen, wie einfach es ist in VB.NET einen DNS Namen in eine oder mehrere IPs umzuwandeln.
Um dies zu verwirklichen stellt uns .NET das namespace System.Net zur Verfügung, das die nötigen Funktionen enthällt!
Erstellt ein neues Formular mit folgendem Form_Load() Event:
Private Sub Form1_Load() Handles MyBase.Load
Dim adressen As String = ""
Try
Dim hostInfo As IPHostEntry = Dns.Resolve(InputBox("DNS"))
Dim address As IPAddress() = hostInfo.AddressList
For index = 0 To address.Length - 1
adressen = adressen & address(index).ToString & vbNewLine
Next index
Catch
End Try
MessageBox.Show(adressen)
End
End Sub
Hier wird nichts anderes gemacht, als zu Beginn nach einer Eingabe zu fragem (InputBox) die dann in in eine IP umgewandelt wird. Dann erstellen wir einen IPAdress Array und speichern die Ergebnisse dort.
Anschließend werden alle IPAdressen in einem String gespeichert und in einer MessageBox ausgegeben!
Den Office Lizenzschlüssel aus der Registry auslesen
Bei einem Praktikum hat man mir mal die Aufgabe gestellt alle Office (und noch andere) Schlüssel zu Katalogisieren, um zu sehen ob irgendwelche Schlüssel doppelt verwendet werden und ob noch weitere Lizenzen von Nöten sind!
Diese Aufgabe würde sich als sehr Zeitaufwendig herausstellen, da es mehr als 100 Rechner inklusive Laptops in der Firma gibt. Alle aufzufinden, inbesondere die Leptops war dann nicht mehr ganz einfach!
Deswegen habe ich mich dafür entschieden ein kleines Programm zu erstellen, dass für mich den KEY ausließt und ihn für mich Lokal auf einem Freigegebenen Laufwerk speichert! Dabei habe ich die Startscripts auf dem Server so modifiziert, dass mein Programm bei den Start von Windows einmal ausgeführt wird und nach installierten Office Version sucht!
So muss ich nicht durch die ganze Firma rennen und die Leute belästigen und habe gleich eine gute Übersicht!
Wo ist der Schlüssel eigentlich gespeichert? Wie so ziemlich alles bei Wondows in der Registry, nämlich hier:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration
Der Ordner Registration teilt sich dann jeh nach Installation in noch mehrere Unterordner auf, die aus einer ID der Installation bestehen. In diesen ordnern gibt es den Schlüssel "DigitalProductID" die die Seriennummer enthällt!
Doch leider ist diese Seriennummer nicht im Klartext gespeichert, sondern im Hexadedimalen Zahlensystem, weswegen wir das ersteinmal umwandeln müssen!
Übrigens in dem oben angegebenen Registry Pfad steht die 12.0 für die Office version in diesem Fall ist es Office 2007. 2003 hätte dann entsprechend eine 11 dort stehen usw...
Diese Funktion wird für uns die Konvertierung vornehmen. Ich werde diese jetzt nicht auseinandernehmen, da sie im grunde ein Zahlensystem in ein anderes konvertiert. Das besondere Hier ist, dass es in den Office Keys immer nur die gleichen paar buchstaben gibt! Nämlich: B, D, D, F, G, H, J, K, M, P, Q, R, T, V, W X und die Zahlen 2, 3, 4, 6, 7, 8, 9. Warum das so ist weis ich leider auch nicht, darauf muss man bei der Konvertirung aber achten!
Function Reg(ByVal hexbuf() As Byte)
Dim tmp As String
For l = LBound(hexbuf) To UBound(hexbuf)
tmp = tmp &amp;amp;amp;amp;amp; " " &amp;amp;amp;amp;amp; Hex(hexbuf(l))
Next
Dim StartOffset As Integer = 52
Dim EndOffset As Integer = 67
Dim Digits(24)
Digits(0) = "B" : Digits(1) = "C" : Digits(2) = "D" : Digits(3) = "F"
Digits(4) = "G" : Digits(5) = "H" : Digits(6) = "J" : Digits(7) = "K"
Digits(8) = "M" : Digits(9) = "P" : Digits(10) = "Q" : Digits(11) = "R"
Digits(12) = "T" : Digits(13) = "V" : Digits(14) = "W" : Digits(15) = "X"
Digits(16) = "Y" : Digits(17) = "2" : Digits(18) = "3" : Digits(19) = "4"
Digits(20) = "6" : Digits(21) = "7" : Digits(22) = "8" : Digits(23) = "9"
Dim dLen As Integer = 29
Dim sLen As Integer = 15
Dim HexDigitalPID(15)
Dim Des(30)
Dim tmp2 As String
Dim HN As Integer
Dim Value As Integer
Dim KEYSTRING2 As String
For i As Integer = StartOffset To EndOffset
HexDigitalPID(i - StartOffset) = hexbuf(i)
tmp2 = tmp2 &amp;amp;amp;amp;amp; " " &amp;amp;amp;amp;amp; Hex(HexDigitalPID(i - StartOffset))
Next
Dim KEYSTRING As String = ""
For i = dLen - 1 To 0 Step -1
If ((i + 1) Mod 6) = 0 Then
Des(i) = "-"
KEYSTRING = KEYSTRING &amp;amp;amp;amp;amp; "-"
Else
HN = 0
For N As Integer = (sLen - 1) To 0 Step -1
Value = ((HN * 2 ^ 8 ) Or HexDigitalPID(N))
HexDigitalPID(N) = Value \ 24
HN = (Value Mod 24)
Next
Des(i) = Digits(HN)
KEYSTRING = KEYSTRING &amp;amp;amp;amp;amp; Digits(HN)
End If
Next
KEYSTRING2 = StrReverse(KEYSTRING)
Return KEYSTRING2
End Function
Diese Funktion erwartet einen Parameter zur ausführung, nämlich hexbuf() as Byte also einen Byte Array! den bekommen wir in dem wir einen Wert aus der Registry auslesen, undzwar einen REG_BINARY Wert!
Diese Funktion stammt nicht von mir, ich habe sie vor einer Weile im Netz gefunden und in VB.NET umgeschrieben.
Einen Wert aus der Registry auszulesen ist mit .NET relativ einfach:
Dim Value() As Byte = My.Computer.Registry.GetValue_
("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\12.0\Registration\...", "DigitalProductID", "")
Alle dazu benötigten Funktionen stellt uns der My-Namespace zur Verfügung!
Im Großen und Ganzen wars das schon gewesen! Ich habe diesbezüglich ein kleines Demo - Projekt angefertigt, dass ihr hier herunterladen könnt! In dem Projekt werden alle eure Office Keys ausgelesen, da oftmalls Outlook einen anderen KEY hat als der Rest usw... Das kann man daran erkennen, dass in dem Ordner Registration mehrere Unterordner gibt, die aus einer langen Zahl bestehen, welche auf jedem Computer anders ist! - Ihr müsst ledeglich die Version anpassen, im meinem Beispiel wird der KEY von Office 2007 ausgelesen. Also Version 12!
Hat dieser Beitrag dir geholfen? Hattest du Probleme oder hast du Anregungen? Schreib dann bitte einen Kommentar.
Hier gibts das Demo-Projekt: Office Key Finder - Demo Projekt
Hier könnt ihr euch das komplette kostenlose Programm zum auslesen vom Windows & Office Key herunterladen. (English & Deutsch)
