BigBasti's Blog About Me & my Digital Lifestyle

18Mai/090

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.

9Mai/091

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:

bild-15

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!

4Mai/091

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

bild-14Hier 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.

bild-24Anschließend werden alle IPAdressen in einem String gespeichert und in einer MessageBox ausgegeben!

3Mai/0918

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

unbenanntDer 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;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;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;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;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)

   
Get Adobe Flash playerPlugin by wpburn.com wordpress themes