Devo creare un GUID
in un progetto C++ di Windows non gestito. Sono abituato a C#, dove userei Guid.NewGuid()
. Qual è la versione C++ (non gestita da Windows)?Qual è la versione C++ di Guid.NewGuid()?
risposta
Penso che CoCreateGuid
sia quello che stai cercando. Esempio:
GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid(&gidReference);
chiama comunque UuidCreate() internamente. – sharptooth
@sharptooth: questa è solo metà della verità. Mentre 'CoCreateGuid' chiama' UuidCreate', fornisce maggiori garanzie rispetto all'unicità. [CoCreateGuid] (https://msdn.microsoft.com/en-us/library/ms688568.aspx): * "Utilizza ** CoCreateGuid ** quando è necessario un numero assolutamente univoco che verrà utilizzato come identificativo persistente in un ambiente distribuito. "* – IInspectable
È necessaria una chiamata preventiva a CoInitialize()? –
UuidCreate() in API Win32 ha esattamente lo stesso effetto. Tuttavia è necessario passare un indirizzo della variabile che riceverà il valore generato:
UUID newId;
UuidCreate(&newId);
credo Guid.NewGuid() semplicemente mappe su di esso all'interno del runtime .NET.
Ciò rende una struttura UUID, non una struttura GUID. – Simon
Sono gli stessi, semplicemente diversi nomi typedef! –
Sì, ma i GUID affermano solo di essere Globalmente univoci; Gli UUID per contratto sostengono di avere unicità universale! Quindi se vuoi che il tuo codice funzioni su più di un pianeta, allora chiaramente dovresti usare quest'ultimo! (Sfortunatamente, anche quest'ultimo potrebbe rivelarsi insufficiente se/quando il calcolo quantistico si attacca e l'interpretazione dei molti universi risulta vera ...) – BrendanMcK
Ecco un frammento di codice per ottenere il valore stringa risultante del GUID generato: riferimento
// 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;
}
API:
Per generare un nuovo guid in windows e ottenere il valore risultante come stringa.
#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;
}
In alternativa, è possibile utilizzare sprintf_s
per la conversione di stringhe
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);
La documentazione per Guid.NewGuid sottolinea, come viene implementato:
Questo è un conveniente metodo statico che puoi chiamare per ottenere un nuovo Guid. Il metodo esegue una chiamata alla funzione Windows CoCreateGuid.
Quindi l'equivalente nativo a Guid.NewGuid()
è CoCreateGuide()
.
CoCreateGuid chiamate UuidCreate, per generare un GUID. Entrambe le chiamate API sono leggermente diverse, sebbene: Mentre
UuidCreate
restituisce un UUID, che è garantito per essere univoco per il computer che lo ha creato,
CoCreateGuid
produce un GUID che è assolutamente unico.
Se è necessario decidere, quale API utilizzare, qui sono le sezioni pertinenti dalla documentazione.
Per motivi di sicurezza, è spesso desiderabile per mantenere indirizzi Ethernet su reti di diventare disponibili al di fuori di una società o organizzazione. La funzione UuidCreate genera un UUID che non può essere tracciato all'indirizzo Ethernet del computer su cui è stato generato.Inoltre, non può essere associato ad altri UUID creati sullo stesso computer.
La funzione CoCreateGuid chiama la funzione RPC UuidCreate, che crea un GUID, un univoco globale 128 bit intero. Utilizzare CoCreateGuid quando è necessario un numero assolutamente univoco che verrà utilizzato come identificativo persistente in un ambiente distribuito.
- 1. Qual è la versione di GIL di C#?
- 2. Qual è la versione C++ di ArrayList di Java
- 3. Qual è la versione C# equivalente di Java Webdriver @Findby?
- 4. qual è la mia versione HAProxy?
- 5. qual è la versione oracle più leggera?
- 6. Qual è la mia versione di LLVM & clang (OSX)?
- 7. Qual è la differenza tra la versione LTS e la versione stabile di node.js?
- 8. Qual è il modo corretto di gestire la versione dell'assembly?
- 9. Qual è la versione più recente di WebSphere MQ Client?
- 10. Qual è la differenza tra la versione e la "versione runtime" in .Net?
- 11. Qual è la differenza tra Microsoft.Office.Interop. * Versione 12 e 14?
- 12. Qual è la conseguenza della mancata versione del plugin Maven?
- 13. Qual è la versione del compilatore per Delphi 2010?
- 14. Qual è la differenza tra il ramo dalla versione per area di lavoro e dall'ultima versione
- 15. Qual è l'ultima versione di Boost compatibile con VC++ 6?
- 16. Qual è la versione LLVM in bundle con Xcode?
- 17. Qual è la classe inline C++?
- 18. Qual è la classe SelectList in C#?
- 19. Qual è la migliore libreria OAuth2 C#?
- 20. qual è la // @include in C++ commenti
- 21. La versione di Android di C#'s Console.WriteLine?
- 22. Quali sono le possibilità di ottenere un duplicato Guid.NewGuid()?
- 23. Qual è la differenza tra C++ gestito e C#?
- 24. Qual è la differenza tra C# e visual C#?
- 25. Qual è la differenza tra Managed C++ e C++/CLI?
- 26. Versione C# e versione di .NET Framework?
- 27. Qual è la stringa di connessione per localdb per la versione 11
- 28. C/C++ qual è il valore di ritorno di strncmp quando la dimensione è 0
- 29. C++ Boost: qual è la causa di questo avviso?
- 30. Qual è la precisione predefinita di c printf% f?
C++ non ne definisce uno. È necessario affidarsi a librerie di terze parti o API fornite dal sistema operativo specifico della piattaforma – jalf