
A mellékelt példa használatához a következő lépésekre van szükség: fordítsa le a programot, módosítsa a HexView.reg állományban található elérési útvonalat úgy, hogy az a lefordított HexView.exe-re mutasson, majd indítsa el a HexView.reg állományt, hogy a program regisztrációja megtörténjen. Ezt követően bármely állományon jobb egér gombbal kattint egy Intézőben, akkor megjelenik egy új menüpont Hex view... névvel. Ezt választva indítható el a mellékelt alkalmazás.
Nézzük, miként működik az egész és kezdjük először az alkalmazás fejlesztésével.
Amikor a programunk indul, akkor feltételezzük, hogy paraméterként már megkapja a betöltendő állomány nevét, valamilyen hasonló formában:
HexView.exe c:\mappa\file.txt
Erről a paraméterezésről majd az Intéző gondoskodik, ha megkérjük rá.
Public Sub New()
MyBase.New()
InitializeComponent()
Try
Most annyi a dolgunk, hogy ezt az első paramétert kiolvassuk és tároljuk a Form fejlécén.
Me.Text = Environment.GetCommandLineArgs()(1)
Következő lépésben meg is nyitjuk ezt az állományt olvasásra úgy, hogy közben engedélyezzük más alkalmazások számára is a hozzáférését.
Dim fs As New FileStream(Me.Text, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
A típusától függetlenül nekünk most az állomány tartalmára van szükségünk, méghozzá bájtonként elérve azt. Ebben segít egy BinaryReader osztály, melynek konstruktorában az imént létrehozott FileStream-et adjuk meg, ami alapján tudja majd kezelni a már megnyitott állományt.
Dim br As New BinaryReader(fs)
...
Most jöhet egy ciklus, mely végigmegy az állomány összes bájtján. Egy több MB-os állomány esetén ez a megoldás igen lassú eredményt hozna, így ha ilyen méretű állományokat is kezelnénk, akkor módosítani kell a programot, hogy ne egyszerre olvasson be mindent, hanem csak részenként.
Dim i As Integer
For i = 0 To fs.Length - 1
A BinaryReader osztály ReadByte függvényét meghívva beolvassuk a soron következő bájtot.
Mivel kétféle megjelenést kell biztosítanunk, ezért először e bájtnak az értékét hexadecimálissá alakítjuk és átmenetileg egy sztringbe tároljuk.
s1 += b.ToString("X2") + " "
A második esetben binárisan jelenítjük meg, melyet egy-egy karakter formájában helyezünk egy másik sztringbe. Itt tárolás előtt figyelnünk kell arra az esetre, ha a bájt értéke nulla. Mivel a nulla karakter lezárná a sztringünket, így ez hibás megjelenítéshez vezetne. Ezért a nulla karakter helyett egy pontkaraktert jelenítünk meg.
If b = 0 Then
b = CByte(".")
End If
s2 += ChrW(b).ToString()
A megjelenítést 16 bájtonként új sorban folytatjuk. Ha ennyi bájt összegyűlt a két átmeneti sztringünkbe, akkor ezeket megjelenítjük a ListBox következő sorába.
If c >= 15 Then
s0 = (i - 31).ToString("000000 ")
listBox1.Items.Add((s0 + s1 + s2))
s1 = ""
s2 = ""
c = 0
Else
c += 1
End If
Next i
A ciklus végeztével még előfordulhat, hogy van olyan nem megjelenített adat, mely még az állományhoz tartozik, de nem érte el a bájtok száma a 16-ot és így a ciklusmagon belül nem történt meg a megjelenítés, így ezt utólag meg kell tennünk.
If s1 <> "" Then
s0 = (i - 31).ToString("000000 ")
listBox1.Items.Add((s0 + s1 + s2))
End If
Végül már csak zárjuk az állományt és készen is vagyunk.
br.Close()
fs.Close()
Catch
End Try
End Sub
Hátra van még az Intéző rábeszélése arra, hogy legyen egy új menüpont a gyorsmenüjében, ami elindítja a mi alkalmazásunkat, ráadásul úgy, hogy paraméterként átadásra kerül a választott állomány elérési útvonala, neve is.
Ennek eléréséhez csupán a Windows regisztrációs adatbázisába kell néhány bejegyzést tennünk, az alábbi módon:
[HKEY_CLASSES_ROOT\*\shell\HexView]
@="Hex view..."
[HKEY_CLASSES_ROOT\*\shell\HexView\Command]
@="D:\\So\\Bso\\0112\\HexView\\HexView.exe \"%1\""
A megadott programunk után írt %1 helyére kerül automatikusan behelyettesítésre az állomány elérési útja és neve. A %1-et ne felejtsük el idézőjelek közé tenni, különben hibásan működhet a programunk olyan esetben, ha egy-egy mappanévbe szóköz is kerül.
Például a C:\Program Files\abc.txt idézőjel nélkül két paramétert eredményezne az alkalmazásunk GetCommandLineArgs függvényének hívásakor, mivel ez a függvény a szóköz mentén bontja fel a paramétereket, így az első paraméter ez esetben a C:\Program lenne, ami ugye nem igazán egy megnyitható állomány.