什么是Guid.NewGuid()的C ++版本?

时间:2009-08-25 09:38:36

标签: c++ windows winapi guid

我需要在非托管的Windows C ++项目中创建GUID。我已经习惯了C#,我会使用Guid.NewGuid()。什么是(非托管窗口)C ++版本?

7 个答案:

答案 0 :(得分:36)

Win32 API中的

UuidCreate()具有完全相同的效果。但是,您需要传递将接收生成值的变量的地址:

UUID newId;
UuidCreate( &newId );

我相信Guid.NewGuid()只是在.NET运行时内映射到它。

答案 1 :(得分:33)

我认为CoCreateGuid就是你所追求的。例如:

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

答案 2 :(得分:14)

这是一段代码,用于获取生成的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参考:

答案 3 :(得分:8)

Guid.NewGuid的文档指出了它的实现方式:

  

这是一种方便的静态方法,您可以调用该方法来获取新的Guid。该方法包含对Windows CoCreateGuid函数的调用。

因此Guid.NewGuid()的原生等价物为CoCreateGuide()

<小时/> CoCreateGuid调用UuidCreate来生成GUID。但是,两个API调用略有不同:虽然UuidCreate返回一个UUID,但保证对创建它的计算机是唯一的,CoCreateGuid会生成一个绝对唯一的GUID。

如果您需要决定使用哪种API,请参阅文档中的相关部分。

UuidCreate

  

出于安全原因,通常希望保持网络上的以太网地址不会在公司或组织外部使用。 UuidCreate 函数生成UUID,无法跟踪生成它的计算机的以太网地址。它也不能与在同一台计算机上创建的其他 UUID 相关联。

CoCreateGuid

  

CoCreateGuid 函数调用RPC函数UuidCreate,它创建一个GUID,一个全局唯一的128位整数。当您需要一个绝对唯一的编号时,请使用 CoCreateGuid ,您将在分布式环境中将其用作持久标识符。

答案 4 :(得分:6)

在Windows中生成新的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);

答案 5 :(得分:0)

在新的WinRT api中,您可以使用winrt::Windows::Foundation::GuidHelper::CreateNewGuid()来返回winrt::guid类型的结构。您以后可以将其传递给winrt::to_hstring以获取winrt::hstring类型的结构,然后将其传递给winrt::to_string以获取std::string类型。

答案 6 :(得分:0)

要在Windows的std :: string中进入guid

# %% implies cell magic in google-colab
%%capture
from tqdm.notebook import tqdm as tq
tq().pandas()

def fn(x):
    for a in list2:
        print(x, a)

import pandas as pd
list1 = list(range(0, 9))
pd.DataFrame(data=list1).progress_apply(fn)