zeros newguid new net initialize all c++ windows winapi guid

net - ¿Cuál es la versión C++ de Guid.NewGuid()?



system guid newguid c# (5)

Aquí hay un fragmento de código para obtener el valor de cadena resultante del 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; }

Referencia de la API:

Necesito crear un GUID en un proyecto de Windows C ++ no administrado. Estoy acostumbrado a C #, donde usaría Guid.NewGuid() . ¿Cuál es la versión de C ++ (ventanas no administradas)?


Creo que CoCreateGuid es lo que buscas. Ejemplo:

GUID gidReference; HRESULT hCreateGuid = CoCreateGuid( &gidReference );


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

Este es un método estático conveniente al que puede llamar para obtener un nuevo Guid . El método envuelve una llamada a la función CoCreateGuid Windows.

Entonces, el equivalente nativo de Guid.NewGuid() es CoCreateGuide() .

CoCreateGuid llama a UuidCreate para generar un GUID. Ambas llamadas API son ligeramente diferentes: aunque UuidCreate devuelve un UUID, que se garantiza que es exclusivo de la computadora que lo creó, CoCreateGuid produce un GUID que es absolutamente único.

Si necesita decidir qué API usar, aquí están las secciones relevantes de la documentación.

UuidCreate :

Por razones de seguridad, a menudo es conveniente evitar que las direcciones de Ethernet en las redes estén disponibles fuera de una empresa u organización. La función UuidCreate genera un UUID que no se puede rastrear a la dirección de Ethernet de la computadora en la que se generó. Tampoco se puede asociar con otros UUID creados en la misma computadora.

CoCreateGuid :

La función CoCreateGuid llama a la función RPC UuidCreate , que crea un GUID, un entero global de 128 bits único. Use CoCreateGuid cuando necesite un número absolutamente único que usará como identificador persistente en un entorno distribuido.


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; }

Alternativamente, puedes usar sprintf_s para la conversión de cadenas

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);


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

UUID newId; UuidCreate( &newId );

Creo que Guid.NewGuid () simplemente hace mapas dentro del tiempo de ejecución de .NET.