CLSIDs generieren
-
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