Подтвердить что ты не робот

Что такое С++ версия Guid.NewGuid()?

Мне нужно создать GUID в неуправляемом проекте Windows С++. Я привык к С#, где я бы использовал Guid.NewGuid(). Что такое (неуправляемые окна) версии С++?

4b9b3361

Ответ 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 использовать, вот соответствующие разделы из документации.

UuidCreate:

Из соображений безопасности часто желательно, чтобы адреса Ethernet-сетей в сетях становились доступными вне компании или организации. Функция UuidCreate генерирует UUID, который не может быть отнесен к Ethernet-адресу компьютера на котором он был сгенерирован. Он также не может быть связан с другими UUID, созданными на том же компьютере.

CoCreateGuid:

Функция 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);