CLSIDs generieren
-
Die Wahrscheinlichkeit das 2 gleiche IDs generiert werden kann man ja ausrechnen.
Also 32 Stellen, bei 16 Möglichkeiten pro Stelle. Das macht , ungefähr eine 34 mit 37 Nullen. Das ist eine ganze Menge.
Gehen wir mal davon aus, dass 1 Milliarde IDs bereits vergeben sind (IMHO total unrealistische Zahl).
Die Wahrscheinlichkeit, dass durch eine Zufallszahl genau eine dieser vergebenen IDs getroffen wird, liegt bei ungefähr 0,000000000000000000000000000294%.
Das ist IMHO so wahnsinnig gering, da ist die Chance höher mehrmals vom Blitz getroffen zu werden und zusätzlich mehrere Sechser im Lotto zu haben.
-
Das ist beruhigend!
Nu is die ID aber in einer Variable vom Typ GUID. Ich brauche sie aber am besten als char* um sie dann später in die Registry schreiben zu können! Wie krieg ich die jetzt umkonvertiert??? 
-
Mit wsprintf und %x bzw. %X sollte das eigentlich möglich sein

Wie die GUID-Struktur aufgebaut ist findest du z.B. hier
-
Warum einfach wenns auch kompliziert geht?

Nimm StringFromGUID2, dann sparst du dir das wsprintf. Die Funktion steht übrigens in dem von dir verlinkten Artikel.
-
Ok vielen Dank für eure Hilfe! Ich hab mir jetzt ne eigene Funktion zum konvertieren geschrieben!
char *GUID2String(char *result,GUID id_to_convert) { wsprintf(result,"{%x-%x-%x-%x%x-%x%x%x%x%x%x}",id_to_convert.Data1, id_to_convert.Data2, id_to_convert.Data3, id_to_convert.Data4[0], id_to_convert.Data4[1], id_to_convert.Data4[2], id_to_convert.Data4[3], id_to_convert.Data4[4], id_to_convert.Data4[5], id_to_convert.Data4[6], id_to_convert.Data4[7]); return result; }Das spukt schon vernünftige IDs aus, aber eine Sache ist mir immer noch nicht hundertprozentig klar:
msdn sagt zu Data4:
Array of 8 bytesaber das sind duch eigentlich neun oder? [0] bis [8]!
-
1.) Warum verwendest du nicht StringFromGUID2?!
2.) Wieso von [0] bis [8]? Es ist doch nur [0] bis [7]!
-
flenders schrieb:
1.) Warum verwendest du nicht StringFromGUID2?!
Weil ich einfach mal gucken wollte, ob ich das auch selber hinkriege! :p
flenders schrieb:
2.) Wieso von [0] bis [8]? Es ist doch nur [0] bis [7]!
msdn schrieb:
typedef struct _GUID {
DWORD Data1;
WORD Data2;
WORD Data3;
BYTE Data4[8];
} GUID;Versteh ich da was falsch???
-
Ja, da verstehst du etwas falsch!
BYTE Data4[8];Das heißt, dass Data4 ein Array mit 8 Elementen vom Typ BYTE ist. Diese kannst du mit Data4[0] bis Data4[7] ansprechen

-
a) Das GUID-Format ist festgelegt. Einfach Zufallszahlen geht nicht. UuidCreate, oder CoCreateGuid
(hab irgendwo nen Link rumliegen...)b) Die IDs sind eindeutig, wenn eine Netzwerkkarte im erzeugenden System vorhanden ist
Der erzeugte UUID besteht aus einem Timestamp, und einem "Hardware-ID". Wenn keine netzwerkkarte vorhanden, dann aus verschiedenen ID's (Festplatte, etc.) und gehasht. Wenn eine Netzerkkarte vorhanden, dann wird die MAC-Adresse verwendet - seit W2K gehasht (so daß kein Rückschluß auf den erzeugenden Computer möglich ist). Bei mehreren Karten wird eine ausgewählt.
-
sollte man eigentlich für sein Programm seine CLSID einmal festlegen und hart im code codieren, oder ist es besser, die clsid on the fly beim ersten ausführen des programms auf dem rechner generieren?
-
Ich kenne es eigentlich nur so das man eine feste nimmt. Ist sonst schwierig auf einem anderen Rechner die richtige GUID zu finden. Wegen der Möglichkeit das zwei doppelt sind: Ich glaube das CoCreateGUID das Datum mit einbezieht. Also ist die Wahrscheinlichkeit zwei doppelt zu haben noch geringer (es müssten diese beiden dann schon am gleichen Tag erstellt worden sein).
-
hatte ich mir fast gedacht...
aber sicher ist sicher...
danke