ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 28.01.2000

Diese Seite wurde zuletzt aktualisiert am 28.01.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

GUIDs für jeden Zweck

Zurück...


Anzeige

(-hg) mailto:hg_createguid@aboutvb.de

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 MSDN Library - API CoCreateGuidCoCreateGuid 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 MSDN Library - API StringFromGUID2StringFromGUID2 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.)


Mit dem Tool GUIDGen.EXE können Sie GUIDs erzeugen und in die Zwischenablage kopieren


Modul modCreateGuid und Tool GUIDGen (createguid.zip - ca. 3 KB)
GUIDGen.EXE (guidgenexe.zip - ca. 4,8 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikel

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer