|
|
|
|
|
Wenn Sie für Ihren Eigenbedarf absolut eindeutige Kennungen für
irgendwelche Objekte oder Daten benötigen, ist es naheliegend, auf
bewährte Mechanismen zur Generierung solcher Kennungen
zurückzugreifen. Das Funktionieren des COM/OLE-Systems beruht auf
solchen eindeutigen Kennungen. Für alle derzeit und in Zukunft
darin vorkommenden Objekte, Schnittstellen, Klassen, Anwendungen und
mehr werden sogenannte "Globally Unique IDentifiers"
(abgekürzt "GUID"s) erzeugt. Das sind 128-Bit breite
Zahlen, deren Generierung auf einer Konvention der "Open
Software Foundation (OSF)" beruht. Die dafür verwendeten
Algorithmen sollen garantieren, dass diese Zahlen "in Raum und
Zeit", wie Microsoft immer wieder betont, absolut eindeutig
sind.
Neben der eindeutigen Generierung kommt es natürlich auch darauf
an, dass der Vorrat an möglichen Zahlen ausreichend groß ist. Als
Programmierer sind Ihnen die Dimensionen von 16- und 32-Bit breiten
Zahlen wahrscheinlich recht geläufig. Auch die nächste Stufe von
64 Bit, auf die sich die EDV-Welt derzeit vorzubereiten beginnt,
werden Sie sich vielleicht noch irgendwie vorstellen können.
Adressräume oder Busbreiten auf 64-Bit-Basis dürften wohl bis in
ferne Zukunft allen Wünschen genügen und selbst zur Darstellung
der Kapazität des menschlichen Gehirns würde diese Dimension nur
zu einem Bruchteil in Anspruch genommen. Was sich jedoch hinter
einer "bloßen" weiteren Verdoppelung auf 128 Bit
verbirgt, macht Kraig Brockschmidt (Autor des Buches "Inside
OLE", Microsoft Press) mit einem recht eindrucksvollen
Rechenexempel anschaulich:
Würde jeder derzeitige Erdenbewohner, das sind etwa 6 Milliarden
Menschen (Größenordnung 109), rund um die
Uhr 100 Billionen (1014) GUIDs pro Sekunde
erzeugen, würde es knapp 20 Millionen Jahre dauern, bis der
mögliche Vorrat von 3,4 x 1038 Zahlen
ausgeschöpft wäre!
Üblicherweise werden GUIDs in hexadezimaler Form in einer
bestimmten Formatierung dargestellt, beispielsweise würde ein
beliebiger GUID so aussehen:
{C1D11C25-45D2-11D0-B0E2-444553540000}
Die Gruppierungen in diesem Format sind für uns ohne Bedeutung,
auch dass die Darstellung hexadezimal erfolgt. Wir können einen
GUID in der Regel sowieso nur in String-Form verwenden - mit echten
128-Bit-Zahlen kann noch kein gebräuchlicher Prozessor direkt
umgehen. Und dafür in die programmmiertechnische, mathematische
Trickkiste zu greifen, wäre wohl überflüssiger Aufwand - die
Hauptsache, so ein GUID ist eindeutig, oder?
Was sollte man denn auch von Microsofts COM-Architektur halten,
wenn sie Ihnen nicht die Möglichkeit bieten würde, eigene und
praktisch handhabbare GUIDs auf Anforderung erzeugen zu können? Die
API-Funktion CoCreateGuid
liefert Ihnen einen GUID in einem Array von 16 Bytes. Mit diesem
Array können Sie allerdings nicht viel anfangen, außer es
vielleicht in einer Binär-Datei oder in einem BLOB ("Binary
Large OBject") einer Datenbank direkt zu speichern. Die
Umwandlung in die String-Form (einschließlich der geschweiften
Klammern, die per Konvention dazu gehören) nehmen Sie daher mit der
API-Funktion StringFromGUID2
vor.
Die Hilfs-Funktionen CreateGUIDBytes, GUIDBytesToGUIDStr und
CreateGUIDStr vereinfachen die Aufrufe. CreateGUIDBytes liefert
Ihnen das pure Byte-Array, das Sie nachträglich mit
GUIDBytesToGUIDStr in einen GUID-String umwandeln können.
CreateGUIDStr liefert Ihnen direkt die String-Form -
höchstwahrscheinlich die am häufigsten genutzte Form.
Wenn Sie GUIDs speichern wollen (etwa in einer Datenbank),
könnte Sie unter Umständen der Platzverbrauch der 38 Zeichen
langen GUID-Strings stören. Sie könnten zwar alternativ das 16
Bytes lange Array als Binär-Objekt speichern, könnten dann aber
das entsprechende Feld kaum indizieren und sortiert abfragen. Daher
bietet sich eine weitere Form der GUID-Darstellung an - in Form von
4 Werten des Datentyps Long. Diese Form entspricht bis aufs Byte der
Abbildung des Byte-Arrays im Speicher, da ein Long-Wert in 4 Bytes
abgelegt wird. Die Hilfsfunktion GUIDBytesToLongs konvertiert ein
GUID-Byte-Array in diese vier Long-Werte, die Funktion
LongsToGUIDBytes bildet das Gegenstück dazu.
Private Type GUID
Bytes(0 To 15) As Byte
End Type
Private Type Longs
l1 As Long
l2 As Long
l3 As Long
l4 As Long
End Type
Private Declare Function CoCreateGuid Lib "OLE32.dll" _
(tGuid As GUID) As Long
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" (VarDest As Any, VarSource As Any, _
ByVal BytesToCopy As Long)
Private Declare Function StringFromGUID2 Lib "OLE32.dll" _
(tGuid As GUID, ByVal lpszString As String, ByVal lMax As Long) _
As Long
Public Function CreateGUIDStr() As String
Dim nTemp As String
Dim nGUID As GUID
Dim nLength As Long
nTemp = Space$(78)
CoCreateGuid nGUID
nLength = StringFromGUID2(nGUID, nTemp, Len(nTemp))
CreateGUIDStr = Left$(StrConv(nTemp, vbFromUnicode), nLength - 1)
End Function
Public Function CreateGUIDBytes() As Byte()
Dim nGUID As GUID
CoCreateGuid nGUID
CreateGUIDBytes = nGUID.Bytes
End Function
Public Function GUIDBytesToGUIDStr(GUIDBytes() As Byte) As String
Dim nTemp As String
Dim nGUID As GUID
Dim nLength As Long
nTemp = Space$(78)
CopyMemory nGUID.Bytes(0), GUIDBytes(0), 16
nLength = StringFromGUID2(nGUID, nTemp, Len(nTemp))
GUIDBytesToGUIDStr = Left$(StrConv(nTemp, vbFromUnicode), _
nLength - 1)
End Function
Public Sub GUIDBytesToLongs(GUIDBytes() As Byte, Long1 As Long, _
Long2 As Long, Long3 As Long, Long4 As Long)
Dim nLongs As Longs
Dim nGUID As GUID
CopyMemory nGUID.Bytes(0), GUIDBytes(0), 16
LSet nLongs = nGUID
With nLongs
Long1 = .l1
Long2 = .l2
Long3 = .l3
Long4 = .l4
End With
End Sub
Public Function LongsToGUIDBytes(ByVal Long1 As Long, _
ByVal Long2 As Long, ByVal Long3 As Long, ByVal Long4 As Long) _
As Byte()
Dim nLongs As Longs
Dim nGUID As GUID
With nLongs
.l1 = Long1
.l2 = Long2
.l3 = Long3
.l4 = Long4
End With
LSet nGUID = nLongs
LongsToGUIDBytes = nGUID.Bytes
End Function
 |
Mit diesen Funktionen erzeugen Sie GUIDs und
konvertieren sie in praktikable Darstellungs- und
Speicherformate

|
Für den Fall, dass Sie GUIDs nicht nur in Ihren Programmen
benötigen, können Sie mit dem kleinen Tool "GUIDGen.EXE"
auf die schnelle GUIDs erzeugen und in die Zwischenablage kopieren
(Sie benötigen allerdings die VB 6-Runtime-Dateien dazu.)

|
|
|