CLSIDs generieren
-
Ja das mit Zufasllszahlen zu lösen war auch meine erste Idee, aber dann muss man ja immernoch testen, ob diese ID bereits existiert! Ich müsste also alle Einträge in HKEY_CLASSES_ROOT\CLSID überprüfen. Is dann garrantiert, dass es diese ID nicht schon gibt???
-
PSDK sagt zu CoCreateGuid:
The CoCreateGuid function calls the RPC function UuidCreate, which creates a GUID, a globally unique 128-bit integer. Use the CoCreateGuid function when you need an absolutely unique number that you will use as a persistent identifier in a distributed environment.To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value
Also könnte es rein-theoretisch bei der Funktion von MS selbst scheinbar wohl doch passieren, dass es die CLSID schon gibt, aber die Wahrscheinlichkeit dass das der Fall ist scheint dabei sehr gering zu sein...
-
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