Мне нужно создать GUID
в неуправляемом проекте Windows С++. Я привык к С#, где я бы использовал Guid.NewGuid()
. Что такое (неуправляемые окна) версии С++?
Что такое С++ версия Guid.NewGuid()?
Ответ 1
Я думаю, CoCreateGuid
- это то, что вам нужно. Пример:
GUID gidReference;
HRESULT hCreateGuid = CoCreateGuid( &gidReference );
Ответ 2
UuidCreate() в Win32 API имеет точно такой же эффект. Однако вам необходимо передать адрес переменной, которая получит сгенерированное значение:
UUID newId;
UuidCreate( &newId );
Я считаю, что Guid.NewGuid() просто сопоставляется с ним внутри среды выполнения .NET.
Ответ 3
Здесь приведен фрагмент кода для получения результирующего строкового значения сгенерированного GUID:
// 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:
Ответ 4
Документация для Guid.NewGuid указывает, как она реализована:
Это удобный статический метод, который вы можете вызвать, чтобы получить новый Guid. Этот метод завершает вызов функции CoCreateGuid вызывает UuidCreate, чтобы сгенерировать GUID. Оба вызова API немного отличаются: хотя
UuidCreate
возвращает UUID, который гарантированно уникален для созданного им компьютера,CoCreateGuid
создает уникальный уникальный идентификатор GUID.Если вам нужно решить, какой API использовать, вот соответствующие разделы из документации.
Из соображений безопасности часто желательно, чтобы адреса Ethernet-сетей в сетях становились доступными вне компании или организации. Функция UuidCreate генерирует UUID, который не может быть отнесен к Ethernet-адресу компьютера на котором он был сгенерирован. Он также не может быть связан с другими UUID, созданными на том же компьютере.
Функция CoCreateGuid вызывает функцию RPC UuidCreate, которая создает GUID, глобально уникальное 128-битное целое число. Используйте CoCreateGuid, когда вам нужен абсолютно уникальный номер, который вы будете использовать в качестве постоянного идентификатора в распределенной среде.
Ответ 5
Чтобы создать новый guid в окнах и получить результирующее значение в виде строки.
#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;
}
В качестве альтернативы вы можете использовать sprintf_s
для преобразования строк
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);