Avatar billede telep Nybegynder
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++
Avatar billede jpk Nybegynder
29. december 2005 - 11:41 #1
Hvis det ligeledes er C++ på .NET gør du nøjagtig det samme...
Avatar billede telep Nybegynder
29. december 2005 - 11:45 #2
det er det desværre ikke... :-)
Avatar billede arne_v Ekspert
29. december 2005 - 11:53 #3
Avatar billede arne_v Ekspert
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;
}
Avatar billede telep Nybegynder
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 *'
Avatar billede arne_v Ekspert
29. december 2005 - 13:02 #6
sorry jeg er sjusket

p = (unsigned char *)&guid;
Avatar billede telep Nybegynder
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
Avatar billede arne_v Ekspert
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 ?
Avatar billede telep Nybegynder
05. januar 2006 - 13:09 #9
ja du skal så :-)
Avatar billede telep Nybegynder
05. januar 2006 - 13:12 #10
og i stedet for at skrive ud til skærmen - kan vi så lagre dem i en string?
Avatar billede arne_v Ekspert
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;
}
Avatar billede arne_v Ekspert
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
Avatar billede arne_v Ekspert
05. januar 2006 - 13:19 #13
der er sikkert en smart formaterings funktion til det men jeg valgte bare at gøre
det manuelt
Avatar billede arne_v Ekspert
05. januar 2006 - 13:20 #14
char guidstr[33];
sprintf(guidstr,...
Avatar billede telep Nybegynder
05. januar 2006 - 13:25 #15
og til en string...

så skal jeg aldrig genere dig mere :-)
Avatar billede arne_v Ekspert
05. januar 2006 - 13:34 #16
13:20:24
Avatar billede telep Nybegynder
05. januar 2006 - 13:36 #17
altså sprintf istedet for printf?
Avatar billede arne_v Ekspert
05. januar 2006 - 13:41 #18
ja og et ekstra argument først som er det char array der skal skrives ind i
Avatar billede telep Nybegynder
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;
Avatar billede telep Nybegynder
05. januar 2006 - 13:43 #20
fejlen siger:
Run-Time Check Failure #3 - The variable 'guidstr' is being used without being defined.
Avatar billede telep Nybegynder
05. januar 2006 - 13:43 #21
og jeg siger heller ikke
char *guidstr = new char*; <- for det er dumt!
Avatar billede telep Nybegynder
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!
Avatar billede arne_v Ekspert
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;
}
Avatar billede telep Nybegynder
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.
Avatar billede arne_v Ekspert
05. januar 2006 - 14:01 #25
jeg tæller dårligt

8 + 4 + 4 +18 + 3 mellem rum + nul terminering = 36

char guidstr[36];
Avatar billede telep Nybegynder
05. januar 2006 - 14:03 #26
he he
Avatar billede telep Nybegynder
05. januar 2006 - 14:06 #27
nul terminering er 2 stks ik'?

fordi så giver det vel 37?
Avatar billede arne_v Ekspert
05. januar 2006 - 14:07 #28
nej nul terminering er kun 1
Avatar billede telep Nybegynder
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
Avatar billede telep Nybegynder
05. januar 2006 - 14:36 #30
id et linieskift selvfølgelig
Avatar billede arne_v Ekspert
05. januar 2006 - 14:37 #31
drop den \n til sidst i formatet

og brug 36
Avatar billede telep Nybegynder
05. januar 2006 - 14:58 #32
jeps!


tid til point?
Avatar billede arne_v Ekspert
05. januar 2006 - 17:19 #33
I guess so
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester