29. december 2005 - 10:56
Der er
32 kommentarer og 1 løsning
Global Unique IDentifier
Hejsa, Jeg skal lave en GUID, altså en global unik nøgle. I C# på .NET kan man: Guid id = Guid.NewGuid(); string sID = id.ToString(); ;-) hvordan gør jeg i C++
Annonceindlæg fra DE-CIX
29. december 2005 - 11:41
#1
Hvis det ligeledes er C++ på .NET gør du nøjagtig det samme...
29. december 2005 - 11:45
#2
det er det desværre ikke... :-)
29. december 2005 - 11:53
#3
29. december 2005 - 12:04
#4
nå det er vist et af de nemmere COM API'er følgende ser faktisk ud til at virke: #include <windows.h> #include <objbase.h> #include <stdio.h> int main() { GUID guid; unsigned char *p; int i; CoInitialize(NULL); if(CoCreateGuid(&guid) == S_OK) { p = (char *)&guid; for(i=0;i<16;i++) printf("%02X",(int)p[i]); printf("\n"); } else { printf("oops\n"); } CoUninitialize(); return 0; }
29. december 2005 - 13:00
#5
i denne linie p = (char *)&guid; får jeg: c:\appTest\clsSipCreator.cpp(133): error C2440: '=' : cannot convert from 'char *' to 'unsigned char *'
29. december 2005 - 13:02
#6
sorry jeg er sjusket p = (unsigned char *)&guid;
05. januar 2006 - 12:47
#7
af denne kode får jeg: FFFFFF9B24FFFFFFE1FFFFFFF3475DFFFFFF8E4DFFFFFFA4FFFFFFB3107052FFFFFFC6FFFFFFA160 jeg vil gerne have en "normal" guid ikke en hex repræsentation. fx: 737BE305-BCDD-4057-9896-CF0B2B9CDF26
05. januar 2006 - 12:54
#8
hvis du bruger unsigned char så burde du undgå alle de FF'er resten er bare et spørgsmål om at sætte nogle bindestreger ind skal jeg demo'e ?
05. januar 2006 - 13:09
#9
ja du skal så :-)
05. januar 2006 - 13:12
#10
og i stedet for at skrive ud til skærmen - kan vi så lagre dem i en string?
05. januar 2006 - 13:19
#11
#include <windows.h> #include <objbase.h> #include <stdio.h> int main() { GUID guid; CoInitialize(NULL); if(CoCreateGuid(&guid) == S_OK) { printf("%08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X\n", guid.Data1,guid.Data2,guid.Data3, guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3], guid.Data4[5],guid.Data4[5],guid.Data4[6],guid.Data4[7]); } else { printf("oops\n"); } CoUninitialize(); return 0; }
05. januar 2006 - 13:19
#12
C:\>gcc guid.c -o guid.exe -lole32 C:\>guid 83C452AD-869E-4BCD-950AF2D14848DFAF C:\>guid 4451D189-A9B4-4772-B215CBC9C6C6557B C:\>guid FFEC9B14-8164-4795-8E7D67F349499B79
05. januar 2006 - 13:19
#13
der er sikkert en smart formaterings funktion til det men jeg valgte bare at gøre det manuelt
05. januar 2006 - 13:20
#14
char guidstr[33]; sprintf(guidstr,...
05. januar 2006 - 13:25
#15
og til en string... så skal jeg aldrig genere dig mere :-)
05. januar 2006 - 13:34
#16
13:20:24
05. januar 2006 - 13:36
#17
altså sprintf istedet for printf?
05. januar 2006 - 13:41
#18
ja og et ekstra argument først som er det char array der skal skrives ind i
05. januar 2006 - 13:42
#19
Jeg har nu følgende - det giver ikke compiler fejl - men det giver runtime error: GUID guid; char *guidstr = new char*; CoInitialize(NULL); if(CoCreateGuid(&guid) == S_OK) { sprintf(guidstr, "%08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X\n", guid.Data1,guid.Data2,guid.Data3, guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3], guid.Data4[5],guid.Data4[5],guid.Data4[6],guid.Data4[7]); } else { printf("oops\n"); } CoUninitialize(); cout << clsHelper::charArrayToString(guidstr) << endl;
05. januar 2006 - 13:43
#20
fejlen siger: Run-Time Check Failure #3 - The variable 'guidstr' is being used without being defined.
05. januar 2006 - 13:43
#21
og jeg siger heller ikke char *guidstr = new char*; <- for det er dumt!
05. januar 2006 - 13:47
#22
hvis jeg kan få FFEC9B14-8164-4795-8E7D67F349499B79 i en std string - så får du sgu et kys!
05. januar 2006 - 13:52
#23
#include <windows.h> #include <objbase.h> #include <iostream> #include <string> #include <cstdio> using namespace std; int main() { CoInitialize(NULL); GUID guid; if(CoCreateGuid(&guid) == S_OK) { char guidstr[33]; sprintf(guidstr,"%08X-%04X-%04X-%02X%02X%02X%02X%02X%02X%02X%02X\n", guid.Data1,guid.Data2,guid.Data3, guid.Data4[0],guid.Data4[1],guid.Data4[2],guid.Data4[3], guid.Data4[5],guid.Data4[5],guid.Data4[6],guid.Data4[7]); string id = guidstr; cout << id << endl; } else { cout << "oops" << endl; } CoUninitialize(); return 0; }
05. januar 2006 - 13:55
#24
får denne på præcis din kode: Run-Time Check Failure #2 - Stack around the variable 'guidstr' was corrupted.
05. januar 2006 - 14:01
#25
jeg tæller dårligt 8 + 4 + 4 +18 + 3 mellem rum + nul terminering = 36 char guidstr[36];
05. januar 2006 - 14:03
#26
he he
05. januar 2006 - 14:06
#27
nul terminering er 2 stks ik'? fordi så giver det vel 37?
05. januar 2006 - 14:07
#28
nej nul terminering er kun 1
05. januar 2006 - 14:35
#29
hmmm... det virker ikke med 36, samme fejl som før. med 37 får jeg ikke fejl, men så indholder guidstr et linieskift
05. januar 2006 - 14:36
#30
id et linieskift selvfølgelig
05. januar 2006 - 14:37
#31
drop den \n til sidst i formatet og brug 36
05. januar 2006 - 14:58
#32
jeps! tid til point?
05. januar 2006 - 17:19
#33
I guess so
Kurser inden for grundlæggende programmering