Necesito crear un GUID en un windows no administradas proyecto de C++. Estoy acostumbrada a C#, que me gustaría usar Guid.NewGuid(). ¿Cuál es la (no administrado windows) C++ versión?

  • C++ no definir uno. Usted tiene que confiar en las bibliotecas de terceros o de la plataforma-sistema operativo específico-Api proporcionadas
InformationsquelleAutor Simon | 2009-08-25

5 Comentarios

  1. 33

    Creo CoCreateGuid es lo que está después. Ejemplo:

    GUID gidReference;
    HRESULT hCreateGuid = CoCreateGuid( &gidReference );
    • Se llama UuidCreate() internamente de todos modos.
    • Que sólo la mitad de la verdad. Mientras CoCreateGuid hace llamar UuidCreate, proporciona garantías más firmes con respecto a la singularidad. CoCreateGuid: «el Uso de CoCreateGuid cuando usted necesita absolutamente un número único que se utiliza como un identificador persistente en un entorno distribuido.»
    • Qué se necesita una llamada anterior a CoInitialize()?
  2. 37

    UuidCreate() en la API de Win32 tiene exactamente el mismo efecto. Sin embargo, usted necesita para pasar una dirección de la variable que recibirá el valor generado:

    UUID newId;
    UuidCreate( &newId );

    Creo Guid.NewGuid() simplemente mapas en el interior del .NET runtime.

    • Que hace un UUID de la estructura, no un GUID de la estructura.
    • Son los mismos, simplemente, diferentes definiciones de nombres!
    • Sí, pero Guid afirman ser único Global; Uuid, por contrato, afirman haber Universal singularidad! Así que si alguna vez desea que el código se ejecute en más de un planeta, entonces es claro que debe utilizar el último! (Por desgracia, incluso la última puede resultar insuficiente si/cuando la computación cuántica, las capturas y el de muchos universos interpretación resulta ser cierto…)
    • Este no es el caso. Guid.NewGuid se llama CoCreateGuid (que a su vez hace llamar UuidCreate, potencialmente, más de una vez). La diferencia es, que CoCreateGuid proporciona garantías más firmes con respecto a la singularidad, por lo que la diferencia es importante.
    • Suena bien. ¿Por qué no agregar otra respuesta explicando todas las sutilezas?
  3. 14

    He aquí un fragmento de código para obtener el resultado de la cadena de valor de la GUID generado:

    //For UUID
    #include <Rpc.h>
    #pragma comment(lib, "Rpcrt4.lib")
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        //Create a new uuid
        UUID uuid;
        RPC_STATUS ret_val = ::UuidCreate(&uuid);
    
        if (ret_val == RPC_S_OK)
        {
            //convert UUID to LPWSTR
            WCHAR* wszUuid = NULL;
            ::UuidToStringW(&uuid, (RPC_WSTR*)&wszUuid);
            if (wszUuid != NULL)
            {
                //TODO: do something with wszUuid
    
                //free up the allocated string
                ::RpcStringFreeW((RPC_WSTR*)&wszUuid);
                wszUuid = NULL;
            }
            else
            {
                //TODO: uh oh, couldn't convert the GUID to string (a result of not enough free memory)
            }
        }
        else
        {
            //TODO: uh oh, couldn't create the GUID, handle this however you need to
        }
    
        return 0;
    }

    De referencia de la API:

  4. 8

    La documentación para Guid.NewGuid señala, cómo se implementa:

    Esta es una conveniente estática método que usted puede llamar para obtener un nuevo Guid. El método envuelve una llamada a la de Windows CoCreateGuid función.

    Así que los nativos equivalente a Guid.NewGuid() es CoCreateGuide().


    CoCreateGuid llamadas UuidCreate, para generar un GUID. Ambas llamadas a la API son ligeramente diferentes, sin embargo: Mientras UuidCreate devuelve un UUID, que es exclusivo para el equipo que lo creó, CoCreateGuid produce un GUID que es absolutamente único.

    Si usted necesita decidir, que la API de usar, aquí están las secciones pertinentes de la documentación.

    UuidCreate:

    Por razones de seguridad, a menudo es conveniente mantener direcciones de ethernet en redes de convertirse disponibles fuera de la empresa u organización. El UuidCreate función genera un UUID que no se puede llegar a la dirección ethernet de la computadora en la que se ha generado. También puede estar asociada con otras Uuid creado en el mismo equipo.

    CoCreateGuid:

    La CoCreateGuid llamadas de función de la RPC de la función UuidCreate, que crea un GUID, un mundo único de 128 bits con signo. Uso CoCreateGuid cuando usted necesita absolutamente un número único que se utiliza como un identificador persistente en un entorno distribuido.

  5. 6

    Para generar un nuevo guid en windows y obtener el valor resultante como una cadena.

    #include <string>
    #include <sstream>
    #include <iostream>
    #include <windows.h>
    #include <iomanip>
    int main()
    {
    GUID guid;
    CoCreateGuid(&guid);
    std::ostringstream os;
    os << std::hex << std::setw(8) << std::setfill('0') << guid.Data1;
    os << '-';
    os << std::hex << std::setw(4) << std::setfill('0') << guid.Data2;
    os << '-';
    os << std::hex << std::setw(4) << std::setfill('0') << guid.Data3;
    os << '-';
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[0]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[1]);
    os << '-';
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[2]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[3]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[4]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[5]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[6]);
    os << std::hex << std::setw(2) << std::setfill('0') << static_cast<short>(guid.Data4[7]);
    std::string s(os.str());
    std::cout << s << std::endl;
    }

    Como alternativa, puede utilizar sprintf_s para la conversión a cadena

    GUID guid;
    CoCreateGuid(&guid);
    char guidStr[37];
    sprintf_s(
    guidStr,
    "%08lX-%04hX-%04hX-%02hhX%02hhX-%02hhX%02hhX%02hhX%02hhX%02hhX%02hhX",
    guid.Data1, guid.Data2, guid.Data3,
    guid.Data4[0], guid.Data4[1], guid.Data4[2], guid.Data4[3],
    guid.Data4[4], guid.Data4[5], guid.Data4[6], guid.Data4[7]);
    std::string s(guidStr);

Dejar respuesta

Please enter your comment!
Please enter your name here